2016-12-25 7 views
0

私は、このコードは私のためにコピー文字列手順アセンブリ

A2098無効なオペランドをエラー与えMASM32

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 

にコピー文字列の手順を書いたOFFSETオペレータ次

式をOFFSETメモリー式または直接式でなければなりません。 しかし、まだ、私はsourcedestのメモリアドレスはコンパイル時に知られていないので、あなたがこれらのエラーを取得している私のprocの

+2

はどういうわけか、あなたがやろうとしているものを見ていても - 'source'と' dest'は、パラメータとしてスタック上に保存されている可能性がポインタです。あなたはこのようなアドレスを得ることができるはずです。 'mov esi、source'と' mov edi、dest'と呼ばれます。私は、 'source'と' dest'は渡される文字列へのポインタであると仮定しています。同様に、 'SIZEOF source'は文字列の長さを与えません。' dword'である 'source'のサイズを与えます。したがって、サイズは常に4になります.NUL(0)文字が見つかるまでコピーしたり、3番目のパラメータとしてコピーする文字数を渡したりするループを作成したいと思うかもしれません。 –

答えて

1

を修正する方法がわかりません。アドレスをprocに渡す必要があります。また、コメントされているように、SIZEOFを使用することはできません。ヌルターミネータをチェックするか、長さを別の方法で取得する必要があります。

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