String 复制字符串过程程序集

String 复制字符串过程程序集,string,assembly,x86,masm32,String,Assembly,X86,Masm32,我在masm32中编写了一个复制字符串的过程 coppystring proc uses esi edi ecx source:dword,dest:dword mov esi, OFFSET source mov edi, OFFSET dest mov ecx, SIZEOF source Lx:

我在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
这个代码给了我一个错误

A2098偏移量的操作数无效

偏移运算符后面的表达式必须是内存表达式或立即表达式。
但我仍然不知道如何修复我的进程,因为编译时不知道
目标
的内存地址,所以您会收到这些错误。您需要将地址传递给进程。另外,正如注释所述,您不能使用
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

由于编译时不知道
目标
的内存地址,因此会出现这些错误。您需要将地址传递给进程。另外,正如注释所述,您不能使用
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

尽管查看您正在尝试执行的操作-
source
dest
可能是作为参数存储在堆栈上的指针。您应该能够通过这种方式获得这些地址<代码>mov esi,源和
mov edi,目标
。我假设
source
dest
是指向正在传递的字符串的指针。同样,
source
的大小不会给出字符串长度,它会给出
source
的大小,这是一个
dword
。因此大小将始终为4。您可能希望创建循环,直到找到NUL(0)字符或将要复制的字符数作为第三个参数传递。尽管查看您试图执行的操作-
source
dest
可能是作为参数存储在堆栈上的指针。您应该能够通过这种方式获得这些地址<代码>mov esi,源和
mov edi,目标
。我假设
source
dest
是指向正在传递的字符串的指针。同样,
source
的大小不会给出字符串长度,它会给出
source
的大小,这是一个
dword
。因此大小将始终为4。您可能希望创建循环,直到找到NUL(0)字符或将要复制的字符数作为第三个参数传递。