Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
13
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.3.1. Команды управления программой

К этой группе относится большое число команд, которые для удобства описания разо­бьем на несколько подгрупп.

Команды безусловной передачи управления (табл. 2.21) осуществляют безусловный переход (JMP), вызов подпрограммы (CALL) и возврат из подпрограммы (RET).

Если передача управления происходит внутри сегмента (NEAR - ближняя передача), то содержимое регистра CS не меняется и реализуется переход к команде, расположенной в текущем сегменте кодов. Команды JMP и CALL с относительной адресацией производят увеличение содержимого регистра IP или EIP на указанную в команде величину ге!8,16 или 32, которая воспринимается как число со знаком. При вычислении нового относительного адреса команды (IP, EIP)+(rel8,16,32) возникающий перенос игнорируется, поэтому полу­ченный адрес остается в пределах текущего сегмента кодов. Команды JMP и CALL с кос­венной адресацией загружают в IP или EIP содержимое регистра или ячейки памяти г/гл(16,32), адресуемых байтом MODR/M. Команда CALL перед этим заносит в стек теку­щее значение IP или EIP, которое является относительным адресом следующей команды программы. При поступлении команды RET производится восстановление из стека содержимого IP, EIP, необходимого для вычисления адреса возврата.

При передаче управления между сегментами (FAR - дальняя передача) меняется не только содержимое регистра EIP или IP, но и базовый адрес сегмента, определяемый содержимым регистра сегмента кодов CS. При выполнении команд JMP и CALL с непос­редственной адресацией в качестве операнда ptr16:16 или ptr16:32 в команде задается 16-разрядное число ptr16 - новое содержимое регистра CS, и ptr16 или ptr32 - новое содержимое регистра IP или EIP. При косвенной адресации с помощью байта MODR/M адресуются ячейки памяти гл(16:16, 16:32), в которых последовательно располагается новое содержимое IP или EIP и 16-разрядный селектор, загружаемый в регистр CS. Отме­тим, что в этом случае не производится адресация к регистрам, т.е. в байте MODR/M должно быть установлено значение поля mod = 11.

Для возврата из подпрограммы используется команда RET, которая восстанавливает из стека содержимое регистров EIP или IP и CS (при выполнении межсегментных переходов). Если команда RET содержит непосредственный операнд im16, то после извлечения из стека содержимого регистров EIP (IP) и CS (при межсегментном переходе) содержимое указателя стека ESP (или SP) увеличивается на величину im16. Таким образом, из стека исключается число ячеек памяти, равное im16. Эта команда производит

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

Команды условных переходов Jcc выполняют переходы только в пределах текущего сег­мента кодов с использованием относительной адресации. При выполнении заданного условия производится переход к команде, относительный адрес которой в сегменте кодов равен (1Р+ге18,16) или (EIP+rel8,32), где ге!8,16 или 32 представляете-, 16- или 32-разрядное смещение со знаком. Таким образом, допускаются переходы к ячейкам памяти, размещенным в теку­щем сегменте кодов перед командой Jcc или после нее. Возникающие при вычислении этих относительных адресов переносы не учитываются. Имеется две модификации команд Jcc: короткие и длинные переходы. Первая модификация использует 8-разрядное смещение (ге!8), вторая модификация использует 16- или 32-разрядное смещение (ге116 или ге!32) в зависимос­ти от разрядности адреса, устанавливаемой режимом работы микропроцессора или соответ­ствующим префиксом перед командой Jcc.

В подгруппу входят 16 команд, различающихся условием выполнения перехода ее (табл. 2.22). Соответствующие мнемокоды условий добавляются к букве J (JUMP), образуя мне­мокод команды, например: J+O=JO- мнемокод команды условного перехода по переполнению. Условие определяется значением отдельных признаков или их комбинацией.

В качестве условия часто используется относительное значение двух операндов, определяемое с помощью команды сравнения СМР. Равенство операндов определяется зна­чением признака нуля ZF после команды СМР: равно E/Z (результат равен 0); не равно NE/NZ (результат не равен 0). Если сравниваются беззнаковые операнды, то соотношение их зна­чений (выше-ниже-равно) определяют условия:

  • ниже (не выше и не равно) (<) В/МАЕ;

  • не ниже (выше или равно) (>=) NB/AE;

  • ниже или равно (не выше) (<=) BE/NA;

  • не ниже и не равно (выше) (>) NBE/A.

Отметим, что команды JB/JNAE и JNB/JAE эквивалентны командам переходов по нали­чию переноса JC или отсутствию переноса JNC.

Если сравниваются операнды со знаком, то соотношение между ними (больше-мень­ше - равно) определяют условия:

  • меньше (не больше и не равно) (<) < L/NGE;

  • не меньше (больше или равно) (>=) NL/GE;

  • меньше или равно (не больше) (<=) LE/NG;

  • не меньше и не равно (больше) (>) NLE/G.

Команды организации циклов осуществляют условный переход в зависимости от зна­чения содержимого регистра ЕСХ (или СХ), которое автоматически уменьшается на единицу (декремент) при поступлении команд этой подгруппы: JECXZ, (JCXZ), LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ. Таким образом, регистр ЕСХ используется в качестве счетчика циклов.

Команды LOOPE/LOOPZ, LOOPNE/LOOPNZ аналогичны команде LOOP, но используют до­полнительные условия для повторения цикла. Команда LOOPE/LOOPZ обеспечивает выход из цикла при получении ненулевого результата, т. е. при установке ZF = 0, до выполнения заданного числа циклов п = (ЕСХ). Если в каждом цикле реализуется нулевой результат, то выполняется п = (ЕСХ) циклов, как в команде LOOP. Команда LOOPNE/LOOPNZ прекращает выполнение циклов при получении нулевого результата, т. е. при установке ZF = 1.

В зависимости от режима работы процессора и наличия префиксов изменения разрядности адреса при выполнении команд организации циклов вместо регистров EIP, ЕСХ могут использо­ваться IP, СХ. При этом вместо мнемокода команды JECXZ используется JCXZ.

Команды прерываний обеспечивают переход к одной из 256 программ обслуживания ис­ключений и прерываний. При этом текущее содержимое регистров IP (EIP), CS и FLAGS (EFLAGS) заносится в стек. Каждая из программ обработки соответствует определенному типу исключения или прерывания, номер которого определяется 8-разрядным непосред­ственным операндом im8, задаваемым во втором байте команды INT. Вызов соответствую­щей программы обслуживания производится с помощью таблицы, в которой содержатся век­торы исключений (прерываний) Ve - адреса первых команд программ обслуживания. Номер вектора Ne = im8 указывает его положение в таблице векторов. Каждый вектор задает необ­ходимое содержимое CS и EIP (IP), загрузка которого в эти регистры обеспечивает переход к выполнению первой команды программы обслуживания. Обращение к таблице векторов Ve производится процессором в зависимости от режима его работы. В защищенном режиме при переходе к программе обслуживания прерываний в стеке сохраняется также заданное число 16- или 32-разрядных параметров из вершины стека, которые при выполнении команд прерываний переносятся в стек программы обслуживания прерываний для использования или сохранения.

Первые 32 вектора прерываний зарезервированы для обслуживания исключительных ситуаций (ошибки, отказы и т. п.), возникающих при выполнении программы. Для трех из этих ситуаций предусмотрены отдельные однобайтные команды INT3, INTO и UD2.

Команда INT3 имеет вектор с номером Ne = 3 (исключение типа #ВР - останов в конт­рольной точке) и используется для установки контрольных точек в процессе отладки программы. Программа, вызываемая этой командой, обеспечивает останов процессора и выдачу пользо­вателю необходимой информации о его текущем состоянии. Команда INTO проверяет значе­ние признака OF и вызывает соответствующую программу обслуживания, если OF = 1, т. е. результат предыдущей операции (число со знаком) вышел за пределы разрядной сетки. Эта команда обращается к вектору прерываний с номером Ne = 4 (исключение типа #OF - перепол­нение разрядной сетки). Команда UD2, введенная в процессорах семейства Р6, реализует прерывание с номером Ne = 7 (#UD - недействительный код операции). Эта команда исполь­зуется для вызова программы обслуживания прерывания типа #UD в процессе выполнения текущей программы.

Команда IRET обеспечивает возврат из подпрограммы обслуживания прерывания пу­тем извлечения из стека и возвращения в регистры содержимых EIP или IP, CS, EFLAGS или FLAGS, соответствующих прерванной процедуре.

Дополнительные команды вызова системных процедур SYSENTER, SYSEXIT введены в процессорах Pentium II и последующих моделях данного семейства. Эти команды исполь­зуют специальные модельно-специфические регистры (MSR), которые имеют имена SYSENTER_CS_MSR (адрес 174h), SYSENTER_ESP_MSR (адрес 175h), SYSENTER_EIP_MSR (адрес 176h). В эти регистры с помощью команд WRMSR записыва­ются адреса ячеек памяти, содержимое которых обеспечивает переход к определенной системной программе, имеющей максимальный уровень привилегии DPL - 0. При поступ­лении команды SYSENTER из этих ячеек памяти производится загрузка нового содержи­мого: в регистр CS - из ячейки, адресуемой регистром SYSENTER_CS_MSR, в регистр EIP-ячейки, адресуемой SYSENTER_EIP_MSR, в регистр SS-из ячейки, адрес которой равен (SYSENTER_CS_MSR) + 8, в регистр ESP - из ячейки, адресуемой SYSENTER_ESP_MSR. Таким образом, обеспечивается переход к новым сегментам команд и стека. При этом не переходе к программе обслуживания прерываний в стеке сохраняется также заданное число 16- или 32-разрядных параметров из вершины стека, которые при выполнении команд прерываний переносятся в стек программы обслуживания прерываний для использования или сохранения. вложенности текущей процедуры. Этот уровень определяет количество указателей (относи­тельных адресов) предыдущих стековых кадров, помещаемых в стек перед образуемым сте­ковым кадром. При поступлении команды ENTER содержимое регистра ЕВР (или ВР) посыла­ется в стек, а последнее значение указателя стека ESP (или SP) заносится в ЕВР (или ВР), после чего содержимое ESP (или SP) уменьшается на величину im8, образуя стековый кадр заданного размера. Однако, если второй непосредственный байт 18 > 0, то после содержимого ЕВР (или ВР) в стек заносится п = (18) слов (32- или 16-разрядных) из последовательно расположенных 32- или 16-разрядных ячеек памяти, адрес которых задается содержимым ре­гистра ЕВР (или ВР), последовательно уменьшаемым на 4 (или 2).

При выполнении команды выхода из процедуры LEAVE содержимое регистра ЕВР (или ВР) заносится в регистр ESP (или SP), восстанавливая значение указателя стека, которое было до входа в процедуру с помощью предыдущей команды ENTER. Затем из стека извлекается старое значение ЕВР (или ВР). Таким образом, производится подго­товка к возврату в предыдущую процедуру. Обычно команда LEAVE является последней в программе реализации вызванной процедуры, и следующая за ней команда RET обес­печивает возврат к выполнению предыдущей процедуры.