【问题标题】:XOR swap Assembly NASMXOR 交换程序集 NASM
【发布时间】: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

【问题讨论】:

  • 它确实有效,但您只交换了您打印的寄存器而不是 xy...您可能想要改为使用 push eaxpush 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


【解决方案1】:

您的异或交换有效且运行良好。 这是失败的结果打印(显示原始的[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],因为你想用地址x的值加载eax。通过这种方式,您的风格将与 mov eax,[esi]mov eax,esi 等内容保持一致。

你应该使用更有意义的名称,而不是 fmt1fmt2,例如 fmtxfmty(保持它超短,尽管随着时间的推移,我学会了不要使用太短的符号,就像那时几天后我几乎记不起那是什么了)。

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 2020-07-26
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2014-03-24
    相关资源
    最近更新 更多