Я пытаюсь написать простую программу на ассемблере для сложения и вычитания чисел. Я использую 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. Почему это происходит?
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
Поскольку EAX составляет 32 бита, и вы перемещаете один байт, поэтому изменяется только AL, остальная часть регистра сохранит предыдущее значение. Я предлагаю вам сначала обнулить регистр EAX (например, xor eax, eax
)
Похожие вопросы
Новые вопросы
assembly
Вопросы по языку ассемблера. Отметьте процессор и/или набор инструкций, которые вы используете, а также ассемблер, допустимый набор должен быть таким: ([assembly] [x86] [gnu-assembler] или [att]). Вместо этого используйте тег [.net-assembly] для сборок .NET, [cil] для языка ассемблера .NET и вместо байт-кода Java используйте тег java-bytecode-asm.