x86 Asm 从寄存器复制值

x86 Asm copy value from register

我有这样的代码:

mov eax, 0
mov [left], eax
mov eax, [len]
dec eax
mov [right], eax

我需要在 left 中获得 0 并在 right 中获得 len - 1。但是不知何故 left 得到 0 并且 after line 也得到 len - 1 。我尝试为 right 使用另一个寄存器,但结果相同。

mov eax, 0
mov [left], eax
mov ebx, [len]
dec ebx
mov [right], ebx

所以,它给出了相同的结果。

完整代码:

section .data
    len dd 10
section .bss
    left  resd 0
    right resd 0
section .text
    global main
push rbp
mov rbp, rsp
    mov eax, 0
    mov [left], eax
    mov eax, [len]
    dec eax
    mov [right], eax

在这一行我已经遇到了问题

来自 NASM 手册:

RESB, RESW, RESD, RESQ, REST, RESO, RESY and RESZ are designed to be used in the BSS section of a module: they declare uninitialized storage space. Each takes a single operand, which is the number of bytes, words, doublewords or whatever to reserve.

所以你的

    left  resd 0
    right resd 0

leftright 保留 0 个双字,即根本没有内存。因此它们最终在同一个地址,你观察到写入一个似乎也写入了另一个。

你可能想要left resd 1,等等

您可能一直认为 0 是初始化的值,例如 dd,但 resd 的全部意义在于您无需指定初始值;在 .bss 部分,它自动归零。