2014-10-05 52 views
0

我想在程序集中编写一个简单的程序来添加和减去数字。我正在使用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。这是为什么发生?

回答

3

eax寄存器是一个32位寄存器,变量是第8位值。当你尝试在寄存器中读取一个变量时,你会得到全部四个变量。

您可以使用32个变量与dd声明,而不是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 
+0

这么简单,然而却是我逼疯了一个小时...谢谢! – Sabien 2014-10-05 23:38:31

0

由于EAX是32位,并且您正在移动一个字节,因此只有AL被更改,寄存器的其余部分将保留之前的值。我建议你先将EAX寄存器清零(例如xor eax, eax

相关问题