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
为 left
和 right
保留 0 个双字,即根本没有内存。因此它们最终在同一个地址,你观察到写入一个似乎也写入了另一个。
你可能想要left resd 1
,等等
您可能一直认为 0 是初始化的值,例如 dd
,但 resd
的全部意义在于您无需指定初始值;在 .bss
部分,它自动归零。
我有这样的代码:
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
为 left
和 right
保留 0 个双字,即根本没有内存。因此它们最终在同一个地址,你观察到写入一个似乎也写入了另一个。
你可能想要left resd 1
,等等
您可能一直认为 0 是初始化的值,例如 dd
,但 resd
的全部意义在于您无需指定初始值;在 .bss
部分,它自动归零。