Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура компьютеров / 6_Ассемблер-IA-32.doc
Скачиваний:
62
Добавлен:
20.03.2015
Размер:
593.92 Кб
Скачать

6.3. Управление потоком выполнения программы

Существует два способа отклонения программы от «прямолинейного курса». Первый из них (о нем рассказывается в разделе 5.8) — это вызов подпрограммы и возврат из нее. Кроме того, в программе могут выполняться переходы к задан­ным командам — как условные, так и безусловные. О них мы сейчас и поговорим.

6.3.1. Условные переходы и флаги кодов условий

Представленная на рис. 5.8, команда

JG STARTADD

относится к числу команд условного перехода. Условие «больше нуля» задается в ней суффиксом кода операции G. Это условие касается и результата последней выполненной команды обработки данных, которой в нашем примере была команда

DEC ECX

Признаки результатов, которые генерируются командами типа Decrement и Add, выполняющими арифметические операции и операции сравнения, записы­ваются в четыре флага кодов условий в регистре состояния процессора, показан­ном на рис. 5.2. В зависимости от результата операции эти флаги, называемые SF (sign — знак), ZF (zero — нуль), OF (overflow — переполнение) и CF (carry — перенос), устанавливаются в 1 или очищаются нулем. Но существует одно исключение. В операции вычитания бит CF устанавливается в 1, если перенос не выполняется, что соответствует сигналу обратного переноса. Состояние этих флагов можно проверить в последующих командах условного перехода, с тем чтобы решить, следует ли осуществлять переход. В нашем примере при выполнении условия [ECX] > 0 управление передается команде, записанной по целевому адресу STARTADD.

В команде условного перехода задается не абсолютное значение целевого ад­реса перехода, а число со знаком, которое прибавляется к содержимому регистра указателя команды, то есть целевой адрес задается относительно адреса в указа­теле команды. Значение указателя команды увеличивается сразу после выборки очередной команды, поэтому он всегда определяет следующую выполняемую ко­манду программы. Когда к указателю прибавляется относительный адрес перехода, он начинает указывать на команду, следующую за командой перехода. Предполо­жим, что адрес STARTADD в нашем примере равен 1000. Для кодирования ко­манд ADD, INC, DEC и JG из программы на рис. 5.8, а требуется 7 байт. Обнов­ленное содержимое регистра указателя команды EIP будет равно 1007, то есть адресу последней в программе команды MOV. Таким образом, относительное расстояние до целевой команды перехода составляет -7; именно данное значение и содержится в команде условного перехода. Это маленькое отрицательное число можно представить одним байтом. Поэтому, с учетом байта кода операции, для записи команды условного перехода достаточно 2 байт. Такой размер имеют ко­манды перехода, в которых относительный адрес перехода лежит в диапазоне от -128 до +127. Если же расстояние до целевой команды перехода больше, то ис­пользуется 4-байтовое смещение.

В этом примере проверяется значение в регистре ЕСХ — нас интересует, боль­ше ли оно нуля. Другие свойства результата можно проверить при помощи иных команд условного перехода. Например, если результат равен нулю, переход вы­полняется командой JZ (или JE), а если знак результата отрицателен (знаковый бит равен 1) — командой JS.

Соседние файлы в папке Архитектура компьютеров