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 code

    model 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 👍


Anmelden zum Antworten