2016-12-28 19 views
0

Я читаю книгу 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 флаг установлен. Что не так с моим кодом?

+3

'mov' не устанавливать флаги. Google для «intel manual 2» для официального документа с инструкциями и флагами, на которые они повлияли –

ответ

5

Как отметила Маргарет Блум, инструкция movне установить флаги! Фактически, это абсолютно не влияет на флаги, что делает его очень полезным в тех случаях, когда вы хотите установить содержимое регистра или памяти без сглаживания текущего состояния флагов.

Это задокументировано в the official Intel IA-32 ISA reference manual, но если вы похожи на меня, вы ленивы. К счастью, нам повезло. Несколько добрых людей загрузили части официальной документации на свои веб-сайты, и их можно легко найти просто с помощью Googling «x86» плюс имя мнемоники команды. Например, мой главный результат для «x86 mov» равен this page. Обратите внимание на следующий раздел:

Флаги не пострадавших
Нет.

Другие инструкции, скажем, разные вещи. Инструкция add устанавливает практически все флаги, как вы можете видеть here.

Итак, глядя на ваш код, выполнение начинается с флагов, установленных на бессмысленные значения мусора. Технически они будут содержать все значения, которые были установлены последними, но это не имеет смысла в контексте вашей программы, потому что вы не приводили к тому, что они не были настроены на что-либо, и поэтому не могут полагаться на то, что они установлены на значимые значения!

Ни инструкции nop, ни инструкции mov не повлияют на значения флагов, поэтому они будут продолжать содержать значения мусора.

Флаги не будут содержать значащих значений до тех пор, пока не будет выполнена инструкция dec. Затем, согласно the documentation, флаги переполнения, знака, нуля, регулировки и четности будут установлены в соответствии с результатом операции уменьшения. Флаг переноса не зависит от dec и поэтому будет продолжать содержать значение мусора.

inc instruction устанавливает флаги точно так же, как dec, так что переполнение, знак, ноль, настроить и флаги четности будет меняться, но флаг переноса не будет (и будет по-прежнему содержать значение мусора).


У меня нет копии книги, на которую вы ссылаетесь, поэтому я не знаю, что она на самом деле говорит. Если он просто показывает дамп состояния регистра/флага в этой точке выполнения кода, то флаги являются просто значениями мусора и не предназначены для значительного - вы должны сосредоточиться на изменении значений в регистрах результат инструкций mov. Если это на самом деле означает, что инструкция mov устанавливает флаги, ну, то в книге есть ошибка. :-)

+0

Я не знал, что даже флаги могут иметь значения для мусора. И да, автор никогда ничего не говорил о том, почему в первую очередь были установлены флаги AF и SF. Еще более удивительно, что я не мог понять, как будет установлен флаг ФП. –

+2

Ну, они тебе мусор. Какой бы код, выполненный до вашего, не думал, что это мусор. Никакая инструкция фактически не устанавливает их для мусора. –