String 复制字符串过程程序集
我在masm32中编写了一个复制字符串的过程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:
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)字符或将要复制的字符数作为第三个参数传递。