Реклама:

В первую группу входят команды копирования и перемещения. Крайне важна команда M0V, в которой явно указываются исходный и целевой адреса. Если в качестве исходного адреса выступает регистр, целевой адрес может быть действительным. В табл. В.2 регистровые операнды обозначаются символом г, а действительные адреса - символом е. Соответственно, сочетание, о котором идет речь, выглядит как е<-г. Именно это обозначение идет первым в ячейке операндов команды M0V. Поскольку, согласно синтаксису команд, целевой адрес должен быть первым операндом, а исходный адрес - вторым, при обозначении операндов используется символ направленной влево стрелки (<-). Таким образом, запись е*-г означает, что содержимое регистра копируется по действительному адресу.

Кроме того, в команде M0V действительный адрес может быть исходным, а регистр - целевым. Такая ситуация обозначается как r<-е (это вторая запись в ячейке операндов упомянутой команды). Третий вариант - по исходному адресу находятся сами данные, а целевой адрес является действительным, что выражается как е*-#. Непосредственно данные в таблице обозначаются символом решетки (#). Символ "В" в скобках в конце мнемонического кода призван показать, что существуют команды перемещения слова (M0V) и байта (M0VB). Таким образом, данная строка в таблице реально описывает шесть разных команд.

Ни один из флагов в регистре кода условий не меняется в зависимости от выполнения команды перемещения, и поэтому в последних четырех столбцах показан прочерк (-). Обратите внимание, что команды перемещения на самом деле не перемещают данные. Они создают копии, не изменяя исходных данных, и именно в этом состоит отличие от традиционной операции перемещения.

Вторая команда, представленная в этой таблице, - XCHG. Она меняет местами содержимое регистра и действительного адреса. Для обозначения операции обмена в таблице применяется символ двунаправленной стрелки (<->). Поскольку в данном случае существуют варианты операции с байтом и со словом, в поле операндов команды XCHG содержится обозначение г<->е. Следующей в таблице указывается команда загрузки действительного адреса (LEA). Она определяет численное значение действительного адреса и сохраняет его в регистре.

Далее следует команда PUSH, которая вводит свой операнд в стек. Ее явный операнд может быть либо константой (что обозначается символом "#" в столбце операндов), либо действительным адресом (символ "е" в столбце операндов). Кроме того, имеет место неявный операнд SP, который не указывается в синтаксисе команды. Команда уменьшает значение SP на 2, а затем сохраняет операнд по адресу, на который SP указывает после обновления.

Следующая команда - POP. Она удаляет операнд из стека и размещает его по действительному адресу. Команды PUSHF и P0PF, выполняющие введение в стек и выталкивание из стека регистра флагов состояния, также предусматривают наличие неявных операндов. Аналогично обстоит дело и с командой XLAT, которая загружает байтовый регистр AL с адреса, формируемого сложением AL и ВХ. Эта команда позволяет проводить оперативный поиск в таблицах размером 256 байт.

Определенные в официальной спецификации 8088 команды IN и 0UT не реализованы в интерпретаторе (и по этой причине не указаны в табл. В.2). По факту, это команды перемещения данных в устройство ввода-вывода и из него. Неявным адресом в них всегда является регистр АХ, а вторым операндом команд выступает номер порта регистра целевого устройства.

Во второй группе табл. В.2 представлены команды сложения и вычитания. Для всех них характерны то же сочетание трех операндов, что и для M0V: от действительного адреса к регистру (г<-е), от регистра к действительному адресу (е<-г) и от константы к действительному адресу (е<-#). Во всех четырех командах в зависимости от результата выполнения могут быть установлены флаг переполнения (О), знаковый флаг (5), нулевой флаг (Z) и флаг переноса (С). Флаг О устанавливается в том случае, если результат невозможно с достаточной степенью точности выразить разрешенным числом битов, и сбрасывается, если такая возможность существует. Скажем, при прибавлении максимально допустимого 16-разрядного числа 0x7fff (32 767 в десятеричной системе) к самому себе результат нельзя выразить в виде 16-разрядного числа со знаком, и в этом случае для указания на ошибку устанавливается флаг О. Аналогичным образом устроен механизм установки других флагов состояния. Если команда способна влиять на флаг состояния, в соответствующем столбце это обстоятельство обозначается звездочкой (*). В командах ADC и SBB флаг переноса в начале операции выполняет роль дополнительной единицы (или нуля), выражающей положительный или отрицательный перенос после предыдущей операции. Эта возможность особенно полезна для представления 32-разрядных и более длинных целочисленных значений в нескольких словах. Помимо вышеперечисленного, предусмотрены операции сложения и вычитания байтов.

В следующем блоке таблицы содержатся команды умножения и деления. Для работы с целочисленными операндами со знаком нужны команды IMUL и IDIV; для обработки значений без знака достаточно команд MUL и DIV. В байтовых вариантах этих команд в качестве целевого адреса неявно принимается комбинация регистров АН : AL. В командах обработки слов неявным целевым адресом выступает комбинация регистров АХ : DX. Даже если результатом умножения оказывается одно слово или один байт, значение регистра DX или АХ обновляется. Недопустимых операций умножения не бывает, поскольку нехватка битов по целевому адресу исключена. Биты переполнения и переноса устанавливаются тогда, когда произведение невозможно представить одним словом или одним байтом. Нулевой и отрицательный флаги оказываются после умножения неопределенными.

При делении в качестве целевых адресов используются те же комбинации регистров: DX: АХ или АН : AL. Частное записывается в АХ или AL, а остаток - в DX или АН. Все четыре флага - переноса, переполнения, нуля и отрицательности - после выполнения операции деления переводятся в неопределенное состояние. При нулевом делителе, а также в том случае, когда частное не помещается в регистр, инициируется исключение, и, если процедура перехвата исключений в программе не предусмотрена, программа останавливается. Больше того, затруднена программная обработка знаков "минус" перед операцией деления или после нее, поскольку, согласно спецификации 8088, знак остатка должен быть всегда равен знаку делимого, в то время как в математике допускается только неотрицательный остаток.

Команды обработки двоично-десятичных чисел, в том числе команды коррекции перед сложением ASCII-символов (AAA) и десятичных значений (DAA), не реализованы в интерпретаторе и не представлены в табл. В.2.

Набор команд 8088 || Оглавление || Логические операции, побитовые операции и операции сдвига