【发布时间】:2016-06-14 11:04:58
【问题描述】:
我必须在不创建新寄存器的情况下交换 Registervariables eax、ebx。不允许使用 XCHG、CMPXCHG 及其变体。 我试过这个,但没有用。我的代码有什么问题。 XOR 交换是正确的方法吗?
%include "asm_io.inc"
SECTION .data
x: dd 10
y: dd 50
fmt2: db "Value of myInteger X is %d",10,0
fmt1: db "Value of myInteger Y is %d",10,0
SECTION .text
extern printf
global asm_main
asm_main:
push ebp
mov ebp, esp
mov eax, DWORD x
mov ebx, DWORD y
xor eax, ebx
xor ebx, eax
xor eax, ebx
push DWORD [x]
push fmt2
call printf
push DWORD [y]
push fmt1
call printf
mov esp, ebp
pop ebp
ret
【问题讨论】:
-
它确实有效,但您只交换了您打印的寄存器而不是
x和y...您可能想要改为使用push eax和push ebx。 PS:下次正确使用代码格式。 PS #2:ebx是调用者保存的寄存器。 -
谢谢小丑。我不明白如何交换 x 和 y。你能帮帮我吗?
-
如果你想在内存中交换 x 和 y,最简单的方法是将它们交换出来:
mov eax, [x]; mov edx, [y]; mov [x], edx; mov [y], eax。请注意,xor不适用于 2 个内存操作数。 -
不清楚你的意思是什么。即使你的代码使用了 2 个寄存器,我的也使用了 2 个。
-
EBX 可能是调用者保存在一些ABI 中,但由于这里没有说明ABI,所以可能不是这样。在 Windows 32 位中的大多数调用约定中,EBX 必须由被调用者保留,但在 Windows 64 位中也必须保留 RBX..
标签: assembly x86 nasm swap xor