在阵列中将阵列内容复制到另一个阵列

时间:2011-03-08 23:07:13

标签: arrays assembly cpu-registers

我想在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个字符放在第二个数组中。问题是我对如何做到这一点感到难过..非常感谢任何帮助。

3 个答案:

答案 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,这在汇编时是完全可以接受的,并且通常比编写自己的循环快得多。