Nasm, 可以直接一行交换内存数据吗?
Nasm, Can I directly exchange memory data in one line?
我正在尝试使用 nasm 来编译我的程序,但我遇到了一个关于 nasm 语法的问题。
实际上我正在写这段代码:
mov byte [edi],[esi]
nasm 只是给我一个错误,说
invalid combination of opcode and operands.
所以我想问问能不能不用其他寄存器作为媒介,直接在一行中交换内存数据
您使用的指令格式是"illegal"。处理器不理解在两个内存位置之间移动。这就是您收到错误的原因。通过使用直接寄存器寻址模式(使用方括号),您为其提供存储在列出的每个寄存器(edi、esi)中的内存地址。
处理器根本无法做到这一点。对不起。你将不得不找到一种不同的方式来做你想做的事情。
现在,movsb指令将从esi指向的地址移动一个字节到edi指向的地址。这可能是您要查找的内容,但在那种情况下,代码只是
movsb
没有参数。它还将根据方向标志的值增加或减少 esi 和 edi(通常是明确的,因此它会增加)。
您可以使用 rep 修饰符重复指令的次数由存储在 ecx 中的值指示。
记住,IN edi 和 esi 的值会被 movsb 指令改变。如果你使用 movsB,它们将被递增或递减 1。
如果你需要交换内存中的两个值,你可以用一个额外的寄存器来完成,正如另一位用户针对我使用两个寄存器的效率稍低的方法所指出的那样:
mov edx, [edi]
xchg edx, [esi]
mov [edi], edx
这将交换edi
和esi
的内容指向的内存地址的内容。没有比这更短的方法了。
我正在尝试使用 nasm 来编译我的程序,但我遇到了一个关于 nasm 语法的问题。 实际上我正在写这段代码:
mov byte [edi],[esi]
nasm 只是给我一个错误,说
invalid combination of opcode and operands.
所以我想问问能不能不用其他寄存器作为媒介,直接在一行中交换内存数据
您使用的指令格式是"illegal"。处理器不理解在两个内存位置之间移动。这就是您收到错误的原因。通过使用直接寄存器寻址模式(使用方括号),您为其提供存储在列出的每个寄存器(edi、esi)中的内存地址。
处理器根本无法做到这一点。对不起。你将不得不找到一种不同的方式来做你想做的事情。
现在,movsb指令将从esi指向的地址移动一个字节到edi指向的地址。这可能是您要查找的内容,但在那种情况下,代码只是
movsb
没有参数。它还将根据方向标志的值增加或减少 esi 和 edi(通常是明确的,因此它会增加)。
您可以使用 rep 修饰符重复指令的次数由存储在 ecx 中的值指示。
记住,IN edi 和 esi 的值会被 movsb 指令改变。如果你使用 movsB,它们将被递增或递减 1。
如果你需要交换内存中的两个值,你可以用一个额外的寄存器来完成,正如另一位用户针对我使用两个寄存器的效率稍低的方法所指出的那样:
mov edx, [edi]
xchg edx, [esi]
mov [edi], edx
这将交换edi
和esi
的内容指向的内存地址的内容。没有比这更短的方法了。