Nasm,我可以直接在一行中交换内存数据吗?

时间:2016-03-23 13:04:26

标签: assembly x86 nasm

我正在尝试使用nasm来编译我的程序,我遇到了一个关于nasm语法的问题。 其实我正在写这段代码:

mov byte [edi],[esi]

说,

nasm只是给了我一个错误

  

操作码和操作数的无效组合。

所以我想问一下,我是否可以直接在一行中交换内存数据而不使用其他寄存器作为媒体。

1 个答案:

答案 0 :(得分:1)

您使用的指令格式是“非法的”。处理器不理解在​​两个存储器位置之间移动。这就是您收到错误的原因。通过使用直接寄存器寻址模式(使用方括号),您将给出存储在列出的每个寄存器(edi,esi)中的存储器地址。

处理器根本无法做到这一点。对不起。你将不得不找到一种不同的方式来做你想做的事情。

现在,movsb指令将从esi指向的地址移动一个字节到edi指向的地址。这可能是你想要找到的,但在这种情况下代码只是

movsb

没有参数。它还会根据方向标志的值增加或减少esi和edi(通常是明确的,因此它会增加)。

您可以使用rep修饰符重复指令ecx中存储的值所指示的次数。

请记住,movs指令会改变IN edi和esi的值。如果使用movsB,它们将递增或递减1。

如果你需要在内存中交换两个值,你可以使用另一个用户指出的另一个寄存器,以响应我的两个寄存器效率稍低的方法:

mov edx, [edi]
xchg edx, [esi]
mov [edi], edx

这将交换ediesi内容所指向的内存地址的内容。没有更短的方法可以做到。