Я должен поменять регистровые переменные eax, ebx, не создавая новый регистр. Это запрещено с помощью XCHG, CMPXCHG и их вариантов. Я пробовал это, но это не сработало. В чем проблема в моем коде. Является ли замена XOR правильным методом?XOR swap Assembly NASM
%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' является регистром с сохранением вызывающего абонента. – Jester
спасибо jester. Я не понимаю, как заменить x и y. не могли бы вы мне помочь, пожалуйста? – Sedem
Если вы хотите поменять местами x и y в памяти, проще всего записать их с заменой: 'mov eax, [x]; mov edx, [y]; mov [x], edx; mov [y], eax'. Обратите внимание, что 'xor' не работает с 2 операндами памяти. – Jester