Именно через регистры передается приложению каждый бит данных, который оно обрабатывает, и знание роли каждого регистра поможет вам распознать неудачный участок кода. CPU x86 имеют восемь регистров общего назначения (ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ESP и ЕВР), шесть сегментных регистров (CS, DS, ES, SS, FS и GS), указатель инструкций (команд) EIP и регистр флагов (EFLAGS). Есть и другие регистры, такие как регистры отладки и управляющие машинные регистры, но это регистры специального назначения, и вы не встретитесь с ними при нормальной отладке в режиме пользователя. Все регистры общего назначения, перечисленные в табл. 6.1, являются 32-разрядными. Заметьте, что некоторые из них допускают мнемонические обозначения для доступа к различным частям полного 32-разрядного регистра. Единственный сегментный регистр, представляющий интерес для данной главы, — это регистр FS, который содержит блок информации потока (TIB), содержащий описание текущего выполняемого потока. Используются и другие сегментные регистры, но операционная система конфигурирует их таким образом, что они оказываются прозрачными по отношению к нормальной операции. Указатель инструкции содержит адрес текущей выполняющийся инструкции.
Таблица 6.1. Регистры общего назначения
32-разрядный регистр |
16-разрядный доступ |
Доступ к младшему байту (биты 0-7) |
Доступ к старшему байту (биты 8-1 5) |
Специфика использования |
ЕАХ |
АХ |
AL |
АН |
Здесь хранятся возвращаемые значения целых функций |
ЕВХ |
ВХ |
BL |
ВН |
Здесь хранится базовый адрес объекта в памяти |
ЕСХ |
СХ |
CL |
СН |
Эти регистры используются счетчиками инструкций циклов |
EDX |
DX |
DL |
DH |
Здесь хранятся 32 старших бита 64-битных значений |
ESI |
SI |
|
|
Здесь хранится исходный адрес инструкций перемещения или сравнения в памяти |
EDI |
DI |
|
|
Здесь хранится целевой адрес инструкций перемещения или сравнения в памяти |
ESP |
SP |
|
|
Указатель стека. Этот регистр изменяется неявно при вызове функции, возврате из функции, отведении места в стеке для локальных переменных и очистке стека |