Режимы адресации и форматы команд 16-разрядного процессора
При безусловном прямом внутрисегментном переходе новое значение указателя команд IP равно сумме смещения, закодированного в соответствующем поле команды, и текущего значения IP, в качестве которого используется адрес команды, записанной вслед за командой перехода. Команды прямых межсегментных переходов содержат в себе помимо нового значения IP и новое значение сегментного регистра CS.
Команды косвенных переходов (внутрисегментных и межсегментных) передают управление на команду, адрес которой определяется содержимым регистра или ячеек оперативной памяти, на которые указывает закодированный в команде перехода постбайт.
Команды условных переходов являются только внутрисегментными. По своему формату и способу формирования нового значения IP они полностью аналогичны команде внутрисегментного прямого перехода с 8-разрядным смещением. Отличие их заключается в том, что в командах условного перехода механизм формирования нового значения IP включается лишь при выполнении определенных условий, а именно, при определенном состоянии регистра флагов. При невыполнении проверяемого условия в IP остается его текущее значение, то есть адрес команды, следующей за командой условного перехода.
Ниже приведены примеры команд переходов различных типов.
-
Команды условного перехода:
формат:
IP = IP + 2, если условие не выполнено;
IP = IP +2 + disp L, если условие выполнено;
пример:
JZ MARK ; переход на метку MARK, если ZF = 1.
-
Команды прямого внутрисегментного перехода:
формат:
, где - длина команды перехода (2 или 3 в зависимости от длины смещения);
примеры:
JMP short ptr MARK ; переход на метку MARK, с использованием 8-разрядного смещения;
JMP near ptr MARK ; переход на метку MARK, с использованием 16-разрядного смещения.
-
Команды прямого межсегментного перехода
формат:
IP = IP_H, IP_L,
CS = CS_H, CS_L;
пример:
JMP far ptr MARK ; переход на метку MARK к команде, находящейся в другом сегменте.
-
Команды косвенного внутрисегментного перехода:
формат:
IP = <регистр>, если в постбайте задано обращение к регистровой памяти;
пример:
JMP word ptr [BX + SI] ; новое значение IP берется из двух последовательных байт памяти, эффективный адрес первого из которых определяется суммой регистров BX и SI.
-
Команды косвенного межсегментного перехода:
формат:
пример:
JMP dword ptr [BX + SI] ; сумма регистров BX и SI определяет эффективный адрес области памяти, первые два байта которой содержат новое значение IP, а следующие два байта - новое значение CS.
Команды циклов идентичны по формату и очень близки по выполняемым действиям командам условных переходов. Однако по сравнению с последними они имеют ряд особенностей, позволяющих эффективно использовать их при программировании циклических участков алгоритмов.
Один из наиболее распространенных видов циклического участка программы представлен на рис. 6.3.
Команды циклов предназначены для упрощения действий декремента (уменьшения на 1) счетчика цикла, проверки условия выхода из цикла и перехода.
Некоторые команды цикла реализуют выход из цикла не только по значению счетчика, но и при выполнении некоторых других условий.
Описание команд цикла сведено в табл. 6.5. За исключением команды JCXZ, которая не изменяет значения регистра CX, при выполнении команд циклов производятся следующие действия: CX=(CX)-1. Затем, если проверяемое условие выполнено, то IP=(IP)+disp8 с расширением смещения знаком до 16 разрядов, в противном случае IP не изменяется, и программа продолжает выполнение в естественном порядке.