提问者:小点点

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


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

mov byte [edi],[esi]

NASM只是给我一个错误,说

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

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


共1个答案

匿名用户

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

处理器根本做不到这一点。我很抱歉。你必须找到一种不同的方法来做你想做的事情。

现在,movsb指令将从esi指向的地址向edi指向的地址移动一个字节。这可能是您试图寻找的,但在这种情况下,代码很简单

movsb

没有参数。它还将根据方向标志的值(通常是清晰的,因此它会递增)递增或递减esi和edi。

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

记住,值IN edi和esi将由movsb指令更改。如果使用movsB,它们将递增或递减一。

如果您需要在内存中交换两个值,则可以使用一个额外的寄存器来完成,正如另一个用户在响应我使用两个寄存器时指出的那样:

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

这将交换ediesi内容所指向的内存地址的内容。没有比这更短的方法了。