我想在Assembly中将一些数组元素复制到另一个元素中。两个数组都通过存储在寄存器中的指针访问。因此,edx将指向一个数组,而eax将指向另一个数组。基本上,edx指向从文本文件读入的字符数组,我希望eax只包含32个字符。这是我正在尝试做的事情:
使用NASM进行I386组装
add edx, 8 ; the first 8 characters of the string are not wanted
mov cl, 32
ip_address:
; move the character currently pointed to by edx to eax (mov [eax], [edx])
inc edx
inc eax
loop ip_address
同样,我希望将前8个字符后面的32个字符放在第二个数组中。问题是我对如何做到这一点感到难过..非常感谢任何帮助。
答案 0 :(得分:3)
您无法在x86中执行直接的内存到内存移动。您需要使用另一个临时寄存器:
mov ecx, [edx]
mov [eax], ecx
或类似的......
答案 1 :(得分:3)
ia32和ia64 都包含一个内存到内存的字符串移动指令,可以移动字节,“单词”和“双字”。
movsb
movsw
movsd
源地址在ESI中指定,目的地在EDI中指定。 1 它本身移动一个字节,字或双字。如果使用 rep 前缀,则ECX将包含一个计数,指令将移动整个值的字符串。
1。我认为这些指令是ESI和EDI寄存器如此命名的原因。 (来源索引和目的地索引。)
答案 2 :(得分:0)
简单的解决方案就是:
mov ebx, [edx]
mov [eax], ebx
请注意,在许多平台的ABI下,ebx
是一个被调用者保存寄存器,因此您需要在函数中保存并恢复其值。
更简单的解决方案是链接标准库并调用memcpy
,这在汇编时是完全可以接受的,并且通常比编写自己的循环快得多。