我试图在程序集中编写一个简单的程序来添加和减去数字。我正在使用NASM来组装程序。当我用gdb评估程序时,寄存器没有我期望的值,我无法弄清楚原因。这是我的代码。现在,我只想弄清楚如何将数字存储到变量中,然后将该变量移动到寄存器中,因为我的代码甚至没有这样做。
SECTION .data
var1: db 0x1 ; assign 1 to var1
var2: db 0x2 ; assign 4 to var2
var3: db 0x4 ; assign 6 to var3
var4: db 0x8 ; assign 8 to var4
SECTION .bss
; empty for now
SECTION .text
global _start
_start:
nop ; keep gdb happy
mov eax, [var1] ; keep gdb happy
... more code ...
mov eax, 1 ; clean up
mov ebx, 0
int 80H
现在当我在gdb中打开我的程序并在第一次赋值后查看eax时,值为0x10806而不仅仅是0x1。为什么会这样?
答案 0 :(得分:3)
eax
寄存器是32位寄存器,变量是第8位值。当您尝试将一个变量读入寄存器时,您将获得所有四个变量。
您可以使用带有dd
声明的32位变量代替db
:
var1: dd 0x1 ; assign 1 to var1
var2: dd 0x2 ; assign 2 to var2
var3: dd 0x4 ; assign 4 to var3
var4: dd 0x8 ; assign 8 to var4
答案 1 :(得分:0)
因为EAX是32位并且你正在移动一个字节,所以只有AL被改变,寄存器的其余部分将保留为先前的值。我建议你首先将EAX寄存器归零(例如xor eax, eax
)