Ассемблер и программирование для IBM PC



       

ГЛАВА 7. Логика и Организация Программы - часть 10


DS и ES: Адрес префикса программного сегмента - область в 256 (шест. 100) байт, которая предшествует выполняемому программному модулю в памяти.

CS: Адрес точки входа в программу (адрес первой выполняемой команды).

IP: Нуль.

SS: Адрес сегмента стека.

SP: Относительный адрес, указывающий на вершину стека. Например, для стека в 32 слова (64 байта), определенного как

DW 32 DUP(?)

SP содержит 64, или шест. 40.

Выполним трассировку простой EXE-программы, приведенной на рис.7.4. На практике вызываемые процедуры содержат любое число команд. Текущая доступная ячейка стека для занесения или извлечения слова является вершина стека. Первая команда PUSH уменьшает значение SP на 2 и заносит содержимое регистра

Ассемблер для IBM PC. Глава 7 142

DS (в данном примере 049f) в вершину стека, т.е. по адресу 4B00+3E. Вторая команда PUSH также уменьшает значение SP на 2 и записывает содержимое регистра AX (0000) по адресу 4B00+3C. Команда CALL B10 уменьшает значение SP и записывает относительный адрес следующей команды (0007) в стек по адресу 4B00+3A. Команда CALL C10 уменьшает значение SP и записывает относительный адрес следующей команды (000B) в стек по адресу 4B00+38. При возврате из процедуры C10 команда RET извлекает 000B из стека (4B00+38), помещает его в указатель команд IP и увеличивает значение SP на 2. При этом происходит автомати ческий возврат по относительному адресу 000B в кодовом сегменте, т.е. в процедуру B10.

------------------------------------------------------------ ------------------------------------------------------------ Рис. 7.4. Воздействие выполнения программы на стек.

Команда RET в конце процедуры B10 извлекает адрес 0007 из стека (4B00+3A), помещают его в IP и увеличивает значение SP на 2. При этом происходит автоматический возврат по относи тельному адресу 0007 в кодовом сегменте. Команда RET по адресу 0007 завершает выполнение программы, осуществляя возврат типа FAR. Ниже показано воздействие на стек при выполнении каждой команды. Для трассировки программы можно использовать отладчик DEBUG. Приведено только содержимое памяти с адреса 0034 до 003F и содержимое регистра SP:




Содержание  Назад  Вперед