XOR交换装配NASM

时间:2016-06-14 11:04:59

标签: assembly x86 nasm swap xor

我必须交换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

1 个答案:

答案 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等内容保持一致。

而不是fmt1fmt2,您应该使用更有意义的名称,例如fmtxfmty(以保持超短,尽管我学会了不要使用太短的符号,因为我几乎不记得几天之后的情况。)