我必须交换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
答案 0 :(得分:2)
您的xor交换有效且运行良好。
它是结果的打印,显示失败(显示原始的[x]
和[y]
值,忽略eax ebx
中的交换结果并将其丢弃。
添加:
mov [x],eax
mov [y],ebx
在3x xor
块之后(存储交换结果)。
或重写显示结果以使用eax / ebx,例如:
...
xor eax, ebx
xor ebx, eax
xor eax, ebx
; prepare stack for printf ebx (new y)
push ebx
push offset fmt1
; prepare stack for printf eax (new x)
push eax
push offset fmt2
; do printf eax (new x)
call printf
; do printf ebx (new y)
pop eax
pop eax ; parameters of "printf eax" removed from stack
; here stack points to the previously prepared ebx+fmt1
call printf
顺便说一下,我会避免使用mov eax, DWORD x
语法,因为不同的汇编程序可能会采用不同的方法。首先,您可以从DWORD
寄存器用法中向汇编程序显示eax
,然后开始使用[x]
来引用x
地址处的值,或offset x
地址本身。因此,在您的代码中,我会编写mov eax,[x]
,因为您要使用地址eax
处的值加载x
。通过这种方式,您的风格将与mov eax,[esi]
vs mov eax,esi
等内容保持一致。
而不是fmt1
和fmt2
,您应该使用更有意义的名称,例如fmtx
和fmty
(以保持超短,尽管我学会了不要使用太短的符号,因为我几乎不记得几天之后的情况。)