memcpy (C) mit 16-bit asm nachbauen
-
hallo leute,
wollte mal die funktion memcpy (bekannt aus C) nachbauen (16-bit tasm/tlink) und bin da jetzt mal so vorgegangen: als parameter verwende ich einfach die werte, die zuvor in ax, bx, cx abgelegt wurden (der reihe nach: quelle, ziel, größe). mit hilfe von rep und movsb kopiere ich dann die werte zwischen si und di - komischerweise erhalte ich dann aber am ende keine ausgabe
hier mal der komplette codemodel tiny code segment assume cs:code, ds:code, es:code org 100h start: jmp main text db "hallo", 13, 10, "$" ; src data db 20h ; dest memcpy proc ; kopiert [cx] bytes von ax nach bx ; @param: ; ax : src ; bx : dest ; cx : count cld mov si, ax ; source adresse ins source-index-reg schieben mov di, bx ; destination adresse ins di-reg schieben rep movsb ; solange von si nach al nach di kopieren bix cx=0 ret memcpy endp main: lea ax, text ; register mit den parametern füllen lea bx, data mov cx, 8 call memcpy ; funktion aufrufen mov ax, 09h ; ausgabe des texts, der lea dx, data ; gerade kopiert wurde int 21h mov ax, 4c00h ; programmende int 21h code ends end start
kann sich das jemand erklären? btw: ich linke das ganze dann mit tlink memcpy.asm /t
-
Zeile 32 :
MOV AX, 0900h
AH enthält die Funktionsnummer des Interrupts 21h.
-
Zusaetzlich:
Da beim Label "data" nur 1 Byte (mit Wert 20h) steht und gleich darauf Code folgt, wirst du selbigen beim Kopieren von 8 Byte mit ueberschreiben, was eher unschoene Folgen haben duerfte.
-
vielen dank euch beiden erstmal!
Nobuo T schrieb:
Da beim Label "data" nur 1 Byte (mit Wert 20h) steht und gleich darauf Code folgt, wirst du selbigen beim Kopieren von 8 Byte mit ueberschreiben...
jo haste recht da wollte ich eigentlich nur etwas speicher reservieren
hab' jetzt aber eure beiden vorschläge umgesetzt und so klappts auch