Ich muss Registervariablen eax, ebx tauschen, ohne ein neues Register zu erstellen. Es ist nicht erlaubt, XCHG, CMPXCHG und ihre Varianten zu verwenden. Ich habe das versucht, aber es hat nicht funktioniert. Was ist das Problem in meinem Code? Ist der XOR die richtige Methode?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
Es funktioniert, aber Sie haben nur die Register nicht 'x' und' y', die Sie drucken, vertauscht ... Sie könnten stattdessen 'push eax' und' push ebx' stattdessen tun. PS: beim nächsten Mal Code richtig formatieren. PS # 2: 'ebx' ist Anrufer gespeichert Register. – Jester
danke Spaßvogel. Ich verstehe nicht, wie man x und y eintauscht. kannst du mir bitte helfen? – Sedem
Wenn Sie x und y im Speicher austauschen möchten, ist es am einfachsten, sie auszuwechseln: 'mov eax, [x]; mov edx, [y]; mov [x], edx; mov [y], eax'. Beachten Sie, dass 'xor' nicht mit 2 Speicheroperanden funktioniert. – Jester