2016-12-25 4 views
0

Ich schrieb eine Kopie Zeichenfolge Verfahren in masm32Kopie String Prozedur Montage

coppystring proc uses esi edi ecx source:dword,dest:dword 
         mov esi, OFFSET source 
         mov edi, OFFSET dest 
         mov ecx, SIZEOF source 
        Lx: 
         mov al,[esi]   
         mov [edi],al   
         inc esi    
         inc edi 
         loop Lx 

coppystring endp 

Dieser Code mich

A2098 ungültiger Operand für OFFSET

Der Ausdruck nach dem OFFSET Bedienungsfehler ergibt muss ein Speicherausdruck oder ein unmittelbarer Ausdruck sein. Aber immer noch weiß ich nicht, wie ich meine proc beheben kann

+2

Irgendwie obwohl, was Sie versuchen zu tun - 'source' und' dest' sind wahrscheinlich Zeiger, die auf dem Stapel als Parameter gespeichert sind. Sie sollten diese Adressen auf diese Weise erhalten können. 'mov esi, source' und' mov edi, dest'. Ich nehme an, dass "source" und "dest" Zeiger auf übergebene Strings sind. Auch 'SIZEOF source' gibt Ihnen nicht die String-Länge, es gibt Ihnen die Größe von' source', was ein 'dword' ist. Die Größe ist also immer 4. Sie möchten wahrscheinlich eine Schleife erstellen, die kopiert, bis das NUL (0) -Zeichen gefunden wird, oder die Anzahl der zu kopierenden Zeichen als dritten Parameter übergeben. –

Antwort

1

Sie erhalten diese Fehler, da die Speicheradresse source und dest zur Kompilierzeit nicht bekannt sind. Sie müssen die Adresse an den Proc übergeben. Wie bereits erwähnt, können Sie SIZEOF nicht verwenden und sollten nach dem Nullabschluss suchen oder die Länge auf andere Weise erhalten.

invoke coppystring,offset str1,offset str2 ; Push the offsets here 

coppystring proc uses esi edi source:dword,dest:dword 
    ; Generally only need to preserve esi, edi and ebx 

mov esi, source 
mov edi, dest 

Lx: 
    mov al,[esi]   
    mov [edi],al   
    inc esi    
    inc edi 
    cmp byte ptr [esi],0 ; Check for null terminator 
    jne Lx     ; loop if not null 

ret 
coppystring endp