Я пытаюсь написать простую программу на ассемблере для сложения и вычитания чисел. Я использую 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. Почему это происходит?

1
Sabien 6 Окт 2014 в 03:27

2 ответа

Лучший ответ

Регистр eax - это 32-битный регистр, а переменные - это значения восьмых битов. Когда вы пытаетесь прочитать одну переменную в регистре, вы получаете все четыре.

Вы можете использовать 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
3
Guffa 6 Окт 2014 в 03:33
Так просто, но это сводило меня с ума в течение часа... Спасибо!
 – 
Sabien
6 Окт 2014 в 03:38

Поскольку EAX составляет 32 бита, и вы перемещаете один байт, поэтому изменяется только AL, остальная часть регистра сохранит предыдущее значение. Я предлагаю вам сначала обнулить регистр EAX (например, xor eax, eax)

0
m0skit0 6 Окт 2014 в 03:31