Регистры и флаги процессора

Регистры

ESP

Указывает на самое верхнее значение стека или образно говоря на верхнее письмо в пачке.

EIP

Указывает на инструкцию, выполняющуюся в данный момент.

Примечательно, что я сейчас читаю туториал и значения автора совпадают с теми значениями, которые вижу я. Значит программа загружается как-то относительно и адреса не зависят от того куда реально в памяти загрузилась программа. Ведь не может же быть так чтобы на двух компьютерах программа заняла одно и то же место в памяти.

32-х битные регистры:
EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, EIP.

OllyDbg выделяет измененные значения регистров красным цветом.

В Command Bar можно смотреть части регистров. Например если EAX = 1234 5678, то
? AX будет равно 5678, т.е. последние четыре цифры.
? AH будет равно 56.
? AL будет равно 78.

Также делится EBX и почти все остальные регистры.

Все регистры можно поменять через меню Modify, кроме EIP. Для того чтобы его поменять нужно выбрать нужную инструкцию и выбрать в контекстном меню пункт New origin here.

Флаги

Флаги имеют только два значения: 0 или 1.
Определенные инструкции при выполнении меняют значение флагов.

Overflow

O - флаг переполнения, активируется когда в результате операции изменяется знак и возвращается неправильное значение. Например если регистру EAX установить значение 7FFF FFFF, которое является макс. положительным. А потом прибавим 1 (ADD EAX, 1), то получится 8000 0000, которое уже соответствует отрицательному числу. Чтобы вызвать окно, где можно писать инструкции нужно нажать пробел или выбрать из контекстного меню пункт Assemble. Это окно меняет инструкцию по текущему адресу. Чтобы выполнить инструкцию нужно нажать F7.

; O == 0
MOV EAX, 7FFFFFFF ; max positive number 2 147 483 64710
ADD, EAX, 1 ; EAX == -2 147 483 64810 == 8000 000016
; O == 1
MOV EAX, 0
ADD EAX, 1
; O == 0

Таким образом видно, то инструкция ADD меняет значение флага O.

Auxiliar

A - дополнительный флаг переноса. Имеет схожее с O назначение, только при выполнении операции с другим форматом.

Parity

P - флаг четности, активируется, когда результат выполнения инструкции в двоичной форме содержит четное количество единиц, например: 1010, 1100 или 11110000. Например если после операции ADD EAX, 1 в EAX количество единиц стало нечетным, то флаг P будет равен 0, а если четным, то 1.

Zero

Z - флаг нуля становится активным, когда результат выполнения инструкции равен 0. Например, если EAX = FFFF FFFF, т.е. -1 и мы прибавляем к нему +1 (ADD EAX, 1) то результатом будет 0 и флаг поднимется, т.е. станет равным 1.

Sign

S - флаг знака равен 1, когда результат операции отрицательный. Например MOV EAX, FFFFFFF9 поднимет флаг, потому что в EAX записывается -7.

Carry

C - флаг переноса, активируется когда в регистр записывается значение, которое выше его диапазона. Например, если EAX = FFFFFFFF и мы прибавляем 1, то флаг становится равен 1.

Еще флаги:
  • T
  • D
  • y