Я читаю книгу Duntemann (3-е издание) и только что начал изучать сборку x86. Я использую вариант Fedora 23 (64 бит). Ниже приведен код:Почему AF и SF не установлены?
section .data
section .text
global _start
_start:
nop
; Put your experiments between the two nops...
mov eax,0FFFFFFFFh
mov ebx,02Dh
dec ebx
inc eax
; Put your experiments between the two nops...
nop
Мой Makefile выглядит следующим образом:
sandbox: sandbox.o
ld -o sandbox sandbox.o -melf_i386
sandbox.o: sandbox.asm
nasm -f elf -g -F stabs sandbox.asm -l sandbox.lst
Таким образом, вы можете видеть, я позаботилась, чтобы собрать 32-битный исполняемый файл, а не 64-битную. Однако проблема заключается в том, что до dec ebx
указание AF
и SF
не установлено в противоположность тому, о чем говорила книга. Запуск программы в insight
показывает мне 32-битные регистры, которые дополнительно гарантируют, что исполняемый файл 32 бит. Ниже приведено состояние, показанное gdb
непосредственно перед инструкцией dec ebx
.
(gdb) info reg
eax 0xffffffff -1
ecx 0x0 0
edx 0x0 0
ebx 0x2d 45
esp 0xffffce80 0xffffce80
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x804806b 0x804806b <_start+11>
eflags 0x202 [ IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x0 0
версия Duntemann в Pg 217 показывает, что AF
и SF
флаг установлен. Что не так с моим кодом?
'mov' не устанавливать флаги. Google для «intel manual 2» для официального документа с инструкциями и флагами, на которые они повлияли –