Кодирование команд (часть 2)
Пример 5.
Команда JMP [BX]+A4h имеет машинное представление:
Если содержимое регистра BX равно 2976, то адрес перехода будет взят из слова оперативной памяти, содержащегося в сегменте данных по адресу: 2976+A4=2A1A.
Команды межсегментных переходов меняют как содержимое IP, так и содержимое CS.
Команда межсегментного прямого перехода имеет в символической записи префикс far и заносит в IP и CS новые значения, заданные в самой команде.
Пример 6.
Пусть необходимо осуществить передачу управления на команду, помеченную меткой L и располагающуюся в другом программном сегменте со следующими координатами: (CS)=AA66, (IP)=11C2. Символическая запись такой команды перехода будет следующей:
JMP far L
При межсегментном косвенном переходе новые значения IP и CS содержатся не в самой команде, а в двух смежных словах оперативной памяти. Адрес этой области памяти определяется постбайтом команды перехода в любом режиме адресации, кроме непосредственного и прямого регистрового. Схема выполнения команды представлена на рис. 8.3.
Отличие внутрисегментного косвенного перехода от межсегментного косвенного в символической записи команды определяется типом используемого операнда. Если операнд определен как слово, предполагается внутрисегментный переход, а если как двойное слово - межсегментный.
В сомнительных случаях тип перехода может задаваться явным образом с помощью префиксов word ptr и dword ptr соответственно для внутрисегментного и межсегментного переходов.
Пример 7.
Пусть (BX)=24A4, [24A4]=11, [24A5]=12, [24A6]=13, [24A7]=5A.
Тогда команда JMP dword ptr [BX] имеет машинное представление
и передает управление команде, расположенной в кодовом сегменте (CS)=5A13 со смещением (IP)=1211.
Команда JMP word ptr [BX] имеет машинное представление
и передает управление команде, расположенной в том же кодовом сегменте со смещением (IP)=1211.
Команды условных переходов являются только внутрисегментными. В них значение указателя команд IP, соответствующее адресу перехода, формируется при выполнении определенных условий, то есть при определенном значении флагов регистра состояния процессора. При невыполнении проверяемого условия в IP остается его текущее значение, то есть адрес команды, следующей за командой условного перехода.
Пример 8.
Пусть команда JZ L расположена по адресу 2010h, а метка L соответствует адресу 2072h. Получим машинное представление этой команды.
Смещение будет равно:
2072 - (2010+2)=2072+DFEE=0060
Это число со знаком может быть закодировано в 1 байте, следовательно, такой переход возможен. Используя код команды из табл. 6.4 (лекция 6), получим машинное представление этой команды: 7460 h.
Рассматриваемая команда передаст управление по адресу 2072, если к моменту ее выполнения ZF=1. При состоянии признака ZF регистра флагов, равном нулю, управление будет передано следующей команде, то есть по адресу 2012.
Теперь рассмотрим пример кодирования команд, представляющих собой некоторый законченный в смысловом отношении фрагмент программы.
Необходимо сложить l слов a[i], расположенных последовательно в оперативной памяти, начиная с адреса [31A6h], а результат записать по адресу [3000h].
Один из возможных вариантов программы, не использующий команду цикла, представлен в табл. 8.1. В программе предполагается, что конечный и промежуточные результаты не превышают длины слова. Количество слагаемых также занимает слово и записано перед исходным массивом, то есть по адресу 31A4h. Начальное значение IP взято произвольно.
Символическая запись | Комментарий | IP | Машинное представление | |
---|---|---|---|---|
2-й код | 16-й код | |||
MOV CX,[31A4h] | CX = l | 0100 |
10001011 00001110 10100100 00110001 |
8B 0E A4 31 |
SUB AX,AX | S = 0 | 0104 |
00101001 11000000 |
29 C0 |
MOV SI,AX | i = 0 | 0106 |
10001011 11110000 |
8B F0 |
CYC: ADD AX,[SI+31A6h] | S = S+a[i] | 0108 |
00000011 10000100 10100110 00110001 |
03 84 A6 31 |
ADD SI,2 | i = i+1 | 010C |
10000011 11000110 00000010 |
83 C6 02 |
DEC CX | l = l-1 | 010F |
01001001 |
49 |
JNZ CYC | перейти, если | 0110 |
01110101 11110110 |
75 F6 |
MOV [3000h],AX | SUM = S | 0112 |
10100001 00000000 00110000 |
A1 00 30 |
Отметим некоторые особенности использования отдельных команд этой программы. Обнуление регистра AX осуществляется вычитанием его содержимого из самого себя. Переход к новому слагаемому достигается использованием регистровой относительной адресации с изменением на каждом шаге содержимого индексного регистра на длину слагаемого, то есть на 2. Последняя команда, засылка результата, закодирована в специальном формате работы с аккумулятором.