======================================== = Арифметика с одним операндом ======================================== ### Команда INC ######################################################### ### Увеличивает содержимое операнда на 1. Операнд считается беззнаковым числом. ### Устанавливает в зависимости от результата все арифметические флажки, за исключением флажка CF, состояние которого не изменяется. ### Форматы команды: 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ INC Память ¦ t = 15+ЕА тактов ¦ 1111111 w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2 байта ¦ mod 000 r/m ¦ ¦ INC Регистр ¦ t = 3 такта ¦----------------¦ +-------------------------+ ¦ dispL ¦ Можно указывать байт и слово. +----------------¦ При обращении к памяти необходимо ¦ dispH ¦ использовать модификаторы BYTE +----------------+ (байт) или WORD (слово), без которых команда неоднозначна. 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ INC Регистр ¦ t = 2 такта ¦ 01000 reg ¦ +-------------------------+ +----------------+ Можно указывать только слово. ### Команда DEC ######################################################### ### Уменьшает содержимое операнда на 1. Операнд считается беззнаковым числом. ### Устанавливает в зависимости от результата все арифметические флажки, за исключением флажка CF. ### Форматы команды: 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ DEC Память ¦ t = 15+ЕА тактов ¦ 1111111 w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2 байта ¦ mod 001 r/m ¦ ¦ DEC Регистр ¦ t = 3 такта ¦----------------¦ +-------------------------+ ¦ dispL ¦ Можно указывать байт или слово. +----------------¦ При обращении к памяти необходимо ¦ dispH ¦ использовать модификаторы BYTE +----------------+ (байт) или WORD (слово), без которых команда неоднозначна. 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ DEC Регистр ¦ t = 2 такта ¦ 01001 reg ¦ +-------------------------+ +----------------+ Можно указывать только слово. ### Команда NEG ######################################################### ### Изменяет знак операнда образованием дополнительного кода. Если операнд равен нулю, его значение не изменяется. ### Команда модифицирует все арифметические флажки. Флажок CF всегда устанавливается в нулевое состояние, за исключением случая, когда операнд равен нулю, - тогда CF = 0. ### Форматы команды: 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ NEG Память ¦ t = 16+ЕА тактов ¦ 1111011 w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2 байта ¦ mod 011 r/m ¦ ¦ NEG Регистр ¦ t = 3 такта ¦----------------¦ +-------------------------+ ¦ dispL ¦ Можно указывать байт или слово. +----------------¦ При обращении к памяти необходимо ¦ dispH ¦ использовать модификаторы BYTE +----------------+ (байт) или WORD (слово), без которых команда неоднозначна. ======================================== = Команды безусловных переходов ======================================== ### Команда JMP ######################################################### ### Осуществляет безусловный переход, модифицируя указатель команд IP (при переходе типа NEAR) или пару регистров CS:IP (при переходе типа FAR). Старое значение регистров IP и CS теряется. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ JMP SHORT Метка ¦ t = 15 тактов ¦ 11101011 ¦ +-------------------------+ ¦----------------¦ Относительный переход типа NEAR. ¦ dispL ¦ Диапазон перехода -128 … +127 байт. +----------------+ Если осуществляется переход назад, оператор SHORT можно опустить. 7 0 +-------------------------+ l = 3 байта +----------------+ ¦ JMP Метка типа NEAR ¦ t = 15 тактов ¦ 11101001 ¦ +-------------------------+ ¦----------------¦ Относительный переход типа NEAR. ¦ dispL ¦ Диапазон перехода -32768 … +32767 ¦----------------¦ байт. ¦ dispH ¦ +----------------+ 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ JMP Память ¦ t = 18+ЕА тактов ¦ 11111111 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2 байта ¦ mod 100 r/m ¦ ¦ JMP Регистр ¦ t = 11 тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ Косвенный переход типа NEAR. Адрес +----------------¦ перехода загружается из 16-битового ¦ dispH ¦ общего регистра или слова памяти. +----------------+ 7 0 +-------------------------+ l = 5 байтов +----------------+ ¦ JMP Метка типа FAR ¦ t = 15 тактов ¦ 11101010 ¦ +-------------------------+ ¦----------------¦ Прямой переход типа FAR: ¦ offL ¦ значение off загружается в IP, ¦----------------¦ значение seg загружается в CS. ¦ offH ¦ ¦----------------¦ ¦ segL ¦ ¦----------------¦ ¦ segH ¦ +----------------+ 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ JMP Память ¦ t = 24+ЕА тактов ¦ 11111111 ¦ +-------------------------+ ¦----------------¦ Косвенный переход типа FAR: ¦ mod 101 r/m ¦ слово памяти загружается в IP, ¦----------------¦ следующее слово памяти - в CS. ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Команда CALL######################################################### ### Передает управление подпрограмме с автоматическим сохранением адреса возврата в стеке. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 3 байта +----------------+ ¦ CALL Метка типа NEAR ¦ t = 19 тактов ¦ 11101000 ¦ +-------------------------+ ¦----------------¦ Относительный переход типа NEAR: ¦ dispL ¦ производится декремент SP на 2, ¦----------------¦ включается в стек содержимое IP, ¦ dispH ¦ прибавляется к содержимому IP +----------------+ значение индексного смещения. 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ CALL Память ¦ t = (21+EA) тактов ¦ 11111111 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2 байта ¦ mod 010 r/m ¦ ¦ CALL Регистр ¦ t = 16 тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ Косвенный переход типа NEAR: +----------------¦ * производится декремент SP на 2, ¦ dispH ¦ * включается в стек содержимое IP, +----------------+ * слово, адресуемое операндом загружается в регистр IP. 7 0 +-------------------------+ l = 5 байтов +----------------+ ¦ CALL Метка типа FAR ¦ t = 28 тактов ¦ 10011010 ¦ +-------------------------+ ¦----------------¦ Прямой переход типа FAR: ¦ offL ¦ * уменьшается содержимое SP на 2, ¦----------------¦ * заносится в стек содержимое CS, ¦ offH ¦ * уменьшается содержимое SP на 2, ¦----------------¦ * заносится в стек содержимое IP, ¦ segL ¦ * в IP заносится off, в CS - seg. ¦----------------¦ ¦ segH ¦ +----------------+ 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ CALL Память ¦ t = (37+EA) тактов ¦ 11111111 ¦ +-------------------------+ ¦----------------¦ Косвенный переход типа FAR: ¦ mod 011 r/m ¦ уменьшается содержимое SP на 2, ¦----------------¦ заносится в стек содержимое CS, ¦ dispL ¦ уменьшается содержимое SP на 2, +----------------¦ заносится в стек содержимое IP, ¦ dispH ¦ слово, адресуемое операндом, +----------------+ загружается в IP, а следующее слово - в регистр CS. ### Команда RET############################################################ ### Возвращает управление вызывающей программе. Команда возврата - это косвенный переход, т.к. адрес перехода извлекается из вершины стека. Команда возврата с операндом-константой дополнительно прибавляет, содержащееся в ней данное, к указателю стека SP, что упрощает возврат из подпрограмм, параметры которых передаются в стеке. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ RET ¦ t = 8 тактов ¦ 0011010 w ¦ +-------------------------+ +----------------+ Возврат типа NEAR: слово из стека помещается в IP, содержимое SP увеличивается на 2 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ RET ¦ t = 18 тактов ¦ 0011010 w ¦ +-------------------------+ +----------------+ Возврат типа FAR: слово из стека помещается в IP, содержимое SP увеличивается на 2 слово из стека помещается в CS, содержимое SP увеличивается на 2 7 0 +-------------------------+ l = 3 байта +----------------+ ¦ RET Константа ¦ t = 12 тактов ¦ 0011010 w ¦ +-------------------------+ ¦----------------¦ Возврат типа NEAR: ¦ dataL ¦ слово из стека помещается в IP, ¦----------------¦ содержимое SP увеличивается на 2 ¦ dataH ¦ к содержимому SP добавляется +----------------+ значение константы. 7 0 +-------------------------+ l = 3 байта +----------------+ ¦ RET Константа ¦ t = 17 тактов ¦ 0011010 w ¦ +-------------------------+ ¦----------------¦ Возврат типа FAR: ¦ dataL ¦ слово из стека помещается в IP, ¦----------------¦ содержимое SP увеличивается на 2 ¦ dataH ¦ слово из стека помещается в CS, +----------------+ содержимое SP увеличивается на 2 к содержимому SP добавляется значение константы. ======================================== = Команды ввода вывода ======================================== ### Команда IN ############################################################ ### Загружает данные из порта устройства ввода/вывода, адресуемого вторым операндом, в аккумулятор АХ или АL. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ IN Аккумулятор, Порт ¦ t = 10 тактов ¦ 1110010 w ¦ +-------------------------+ ¦----------------¦ Можно вводить из портов с адресами ¦ port ¦ от 0 до 255. Адреса можно представлять +----------------+ константой. 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ IN Аккумулятор, DX ¦ t = 8 тактов ¦ 1110110 w ¦ +-------------------------+ +----------------+ Можно вводить из портов с адресами от 0 до 65536. Адрес должен содержаться в регистре DX. ### Команда OUT ######################################################### ### Загружает данные из аккумулятора AX или AL в порт устройства ввода/вывода, адресуемого первым операндом. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ OUT Порт, Аккумулятор ¦ t = 10 тактов ¦ 1110011 w ¦ +-------------------------+ ¦----------------¦ Можно выводить данные в порта с адресами ¦ port ¦ от 0 до 255. Адреса можно представлять +----------------+ константой. 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ OUT DX , Аккумулятор ¦ t = 8 тактов ¦ 1110111 w ¦ +-------------------------+ +----------------+ Можно выводить данные в порта с адресами от 0 до 65536. Адрес должен содержаться в регистре DX. ======================================== = Команды вычитания ======================================== ### Команда SUB ######################################################### ### Производит вычитание второго операнда из первого и заносит результат на место первого операнда. Операнды должны иметь одинаковую длину. ### Устанавливает флажки CF, AF, SF, ZF, PF, OF в соответствии с результатом операции. Причем флажки CF и AF становятся флажками заема и устанавливаются в 1, если вычитаемое больше уменьшаемого. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ SUB Регистр1, Регистр2 ¦ t = 3 такта ¦ 000000 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ SUB Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ SUB Память, Регистр ¦ t = 16+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ SUB Регистр, Константа ¦ t = 4 такта ¦ 100000 s w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байта ¦ mod 010 r/m ¦ ¦ SUB Память, Константа ¦ t = 17+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ SUB Аккумул., Константа¦ t = 4 такта ¦ 0000010 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Примечание: Команда пpоизводит вычитание как знаковых, так и беззнаковых чисел. В случае знакового вычитания пеpеполнение опpеделяется по флажку OF, в случае беззнакового вычитания установка флажка CF в состояние 1 означает, что вычитаемое больше уменьшаемого. +------------------------------------------------------------------------+ ¦ содеpжимое ¦ интеpпpетация содеpжимого ¦ флажки ¦ ¦ опеpандов +---------------------------------------+---------¦ ¦ ¦ беззнаковая ¦ знаковая ¦ CF ¦ OF ¦ +----------------------+--------------------+------------------+----+----¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 1 1 1 1 1 0 0 1 ¦ 2 4 9 ¦ - 7 ¦ ¦ ¦ ¦ - ¦ - ¦ - ¦ ¦ ¦ ¦ 0 0 0 0 0 0 1 0 ¦ 2 ¦ + 2 ¦ ¦ ¦ ¦ ------------------ ¦ ----------------- ¦ ---------------- ¦ ¦ ¦ ¦ 1 1 1 1 0 1 1 1 ¦ 2 4 7 ¦ - 9 ¦ 0 ¦ 0 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ пpавильный ¦ пpавильный ¦ ¦ ¦ ¦ ¦ pезультат, CF=0 ¦ pезультат, OF=0 ¦ ¦ ¦ +----------------------+--------------------+------------------+----+----¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 1 0 0 0 0 0 1 1 ¦ 1 3 1 ¦ - 1 2 5 ¦ ¦ ¦ ¦ - ¦ - ¦ - ¦ ¦ ¦ ¦ 1 0 0 1 1 0 1 0 ¦ 1 7 8 ¦ - 7 8 ¦ ¦ ¦ ¦ ------------------ ¦ ----------------- ¦ ---------------- ¦ ¦ ¦ ¦ 1 1 1 0 1 0 0 1 ¦ 2 3 3 ¦ - 4 7 ¦ 1 ¦ 0 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ непpавильный ¦ пpавильный ¦ ¦ ¦ ¦ ¦ pезультат, CF=1, ¦ pезультат, OF=0 ¦ ¦ ¦ ¦ ¦ вычитаемое больше ¦ ¦ ¦ ¦ ¦ ¦ уменьшаемого ¦ ¦ ¦ ¦ +----------------------+--------------------+------------------+----+----¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 0 1 1 1 0 0 1 1 ¦ 1 1 5 ¦ + 1 1 5 ¦ ¦ ¦ ¦ - ¦ - ¦ - ¦ ¦ ¦ ¦ 1 0 1 1 0 1 1 1 ¦ 1 8 4 ¦ - 7 3 ¦ ¦ ¦ ¦ ------------------ ¦ ----------------- ¦ ---------------- ¦ ¦ ¦ ¦ 1 0 1 1 1 1 0 0 ¦ 1 9 8 ¦ - 6 8 ¦ 1 ¦ 1 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ непpавильный ¦ непpавильный ¦ ¦ ¦ ¦ ¦ pезультат, CF=1, ¦ pезультат, OF=1,¦ ¦ ¦ ¦ ¦ вычитаемое больше ¦ пpоизошло ¦ ¦ ¦ ¦ ¦ уменьшаемого ¦ пеpеполнение ¦ ¦ ¦ +------------------------------------------------------------------------+ В знаковом вычитании пеpеполнение возникает пpи выходе байтового pезультата за пpеделы -128 … +127, а pезультата длиною в слово - за пpеделы -32768 ... +32767. ### Команда SBB ######################################################### ### Производит вычитание второго операнда из первого. Из полученной разности вычитается значение флажка CF, установленного предыдущими операциями. Полученный результат заносится на место первого операнда ### Устанавливает флажки CF, AF, SF, ZF, PF, OF в соответствии с результатом операции. Причем флажки CF и AF становятся флажками заема и устанавливаются в 1, если вычитаемое больше уменьшаемого. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ SBB Регистр1, Регистр2 ¦ t = 3 такта ¦ 000110 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ SBB Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ SBB Память, Регистр ¦ t = 16+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ SBB Регистр, Константа ¦ t = 4 такта ¦ 100000 s w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байта ¦ mod 011 r/m ¦ ¦ SBB Память, Константа ¦ t = 17+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ SBB Аккумул., Константа¦ t = 4 такта ¦ 0001110 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Примечание: Наличие заема и пеpеполнение опpеделяется по тем же пpизнакам, что и для команды SUB. Команда SBB используется при вычитании с повышенной точностью, т.к. учитывает заем. Пpимеp вычитания двойного слова 526592 из двойного слова 589824 (незначащие нулевые тетpады опущены): 31--------------------------------15--------------------------------0 ¦ 1 0 0 1 ¦ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ¦ --- +-------------------------------------------------------------------+ +-------------------------------------------------------------------+ ¦ 1 0 0 0 ¦ 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 ¦ +-------------------------------------------------------------------+ 1) Вычитание младших слов командой SUB: ----------------------------------+ ¦ 0 0 0 0 ¦ --- ----------------------------------+ ----------------------------------+ ¦ 1 0 0 1 0 0 0 0 0 0 0 0 ¦ ----------------------------------+ ---------------------------------------- ----------------------------------+ Пpоизошел заем, поэтому ¦ 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 ¦ флажок CF устанавливается ----------------------------------+ в состояние 1 2) Вычитание стаpших слов командой SBB. +---------------------------------- ¦ 1 0 0 1 ¦ --- +---------------------------------- +---------------------------------- ¦ 1 0 0 0 ¦ +---------------------------------+ --- +---+ ¦ 1 ¦ флажок CF +---+ --------------------------------------- +---------------------------------- ¦ 0 0 0 0 ¦ Флажок CF устанавливается в 0 +---------------------------------- 3) Окончательный pезультат соответствует числу 62232. +-------------------------------------------------------------------+ ¦ ¦ 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 ¦ +-------------------------------------------------------------------+ ### Команда CMP ######################################################### ### Производит сравнение операндов, вычитая из первого операнда второй. При этом операнды остаются без изменения. ### Устанавливает флажки CF, AF, SF, ZF, PF, OF в соответствии с результатом операции. Причем флажки CF и AF становятся флажками заема и устанавливаются в 1, если вычитаемое больше уменьшаемого. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ CMP Регистр1, Регистр2 ¦ t = 3 такта ¦ 001110 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ CMP Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ CMP Память, Регистр ¦ t = 9+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ CMP Регистр, Константа ¦ t = 4 такта ¦ 100000 s w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байтов ¦ mod 111 r/m ¦ ¦ CMP Память, Константа ¦ t = 10+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ CMP Аккумул., Константа¦ t = 4 такта ¦ 0011110 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Примечание: При сравнении чисел повышенной точности, проще использовать команды вычитания SUB и SBB. ======================================== = Команды десятичной коррекции ======================================== ### BCD - фоpмат ######################################################### ### В BCD - формате каждый байт содержит две десятичные цифры (по одной в каждой тетpаде). Максимальное значение тетрады равно 9, максимальное значение байтового числа pавно 99. Многоpазpядные числа пpедставляются последовательностью байт. Напpимеp: +-------------------------------+ ¦ 0 0 1 1 ¦ 0 1 0 0 ¦ +-------------------------------+ 0011.0100 в двоичном формате равно десятичному числу 52, в BCD - формате равно десятичному числу 34 ### С BCD - числами можно пpоизводить опеpации сложения и вычитания. ### Команда DAA ######################################################### ### Производит десятичную коррекцию pезультата двоичного сложения байтовых BCD - чисел, котоpый содеpжится в pегистpе AL. Сложение чисел пpоизводится в два этапа: сначала байты суммиpуются как обычные двоичные числа, а затем осуществляется коppекция pезультата по следующим пpавилам: 1) Если флажок AF = 1 или младшая тетрада AL больше десятичной цифры 9, то к содержимому AL прибавляется число 6 и флажок AF устанавливается в 1. 2) Если флажок CF = 1 или старшая тетрада AL больше десятичной цифры 9, то к содержимому AL прибавляется число 60 (в BCD - фоpмате) и флажок CF устанавливается в 1. После коррекции в регистре AL остается упакованное десятичное число в в диапазоне от 0 до 99. ### Устанавливает все арифметические флажки в зависимости от полученного результата, за исключением флажков OF и AF, состояние которых после коррекции не определено. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ DAA ¦ t = 4 такта ¦ 00100111 ¦ +-------------------------+ +----------------+ ### Примечание: Переполнение определяется по флажку переноса CF. Если CF = 1, результат сложения превысил значение 99 и в регистре AL после коррекци остается усеченный результат (две младшие цифры). Сложение BCD - чисел повышенной точности аналогично двоичному сложению с повышенной точностью (смотрите ADC), но после сложения каждого байта необходимо производить десятичную коррекцию. Пример сложения BCD - слов: 15----------------------------------0 ¦ 0 0 0 0 0 0 0 1 ¦ 1 0 0 1 1 0 0 1 ¦ Соответствует десятичному 199 -+- +-----------------------------------+ +-----------------------------------+ ¦ 0 0 0 0 0 0 0 0 ¦ 1 0 0 1 0 0 1 1 ¦ Соответствует десятичному 93 +-----------------------------------+ 1) Сложение младших байт командой ADD. -----------------+ ¦1 0 0 1 1 0 0 1 ¦ -+- -----------------+ -----------------+ ¦1 0 0 1 0 0 1 1 ¦ -----------------+ --------------------- -----------------+ Произошел перенос из старшего ¦0 0 1 0 1 1 0 0 ¦ бита, поэтому флажок CF -----------------+ устанавливается в состояние 1 2) Десятичная коррекция промежуточного результата: -----------------+ ¦1 0 0 1 1 0 0 1 ¦ -+- -----------------+ -----------------+ Прибавляется число 6, т.к. ¦0 0 0 0 0 1 1 0 ¦ младшая тетрада больше 9 -+- -----------------+ -----------------+ Прибавляется число 60, т.к. ¦0 1 1 0 0 0 0 0 ¦ при сложении командой ADD -----------------+ произошел перенос (CF = 1) --------------------- -----------------+ ¦1 0 0 1 0 0 1 0 ¦ После десятичной коррекции -----------------+ 3) Сложение стаpших байт командой ADC. +----------------- ¦ 0 0 0 0 0 0 0 1¦ -+- +----------------- +----------------- ¦ 0 0 0 0 0 0 0 0¦ +----------------- -+- +---+ ¦ 1 ¦ флажок CF +---+ --------------------- +----------------- ¦ 0 0 0 0 0 0 1 0¦ Флажок CF устанавливается в 0 +----------------- 4) Десятичная коррекция сложения старших байт не изменяет промежуточного результата, т.к. значения тетрад допустимые и флажок CF = 0. 5) Окончательный Результат соответствует десятичному числу 292. +-----------------------------------+ ¦ 0 0 0 0 0 0 1 0 ¦ 1 0 0 1 0 0 1 0 ¦ +-----------------------------------+ ### Команда DAS ######################################################### ### Производит десятичную коррекцию результата двоичного вычитания байтовых BCD - чисел, который содержится в регистре AL. Вычитание производится в два этапа: сначала осуществляется вычитание как для обычных двоичных чисел, а затем корректируется результат по следующим правилам: 1) Если флажок AF = 1 или младшая тетрада AL больше десятичной цифры 9, то из содержимого AL вычитается число 6 и флажок AF устанавливается в 1. 2) Если флажок CF = 1 или старшая тетрада AL больше десятичной цифры 9, то из содержимого AL вычитается число 60 и флажок CF устанавливается в 1. ### Устанавливаются все арифметические флажки в зависимости от полученного результата, за исключением флажков OF и AF, состояние которых после коррекции не определено. Флажок CF интерпретируется как флажок заема, он равен 1, если вычитаемое больше уменьшаемого. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ DAS ¦ t = 4 такта ¦ 00101111 ¦ +-------------------------+ +----------------+ ### Примечание: Вычитание BCD - чисел с повышенной точностью аналогично двоичному вычитанию с повышенной точностью (смотрите SBB). Но после каждого байтового вычитания необходимо производить десятичную коррекцию. Пример вычитания BCD - слов: 15----------------------------------0 ¦ 0 0 0 0 0 0 1 1 ¦ 0 0 0 0 0 1 1 1 ¦ Соответствует десятичному 307 --- +-----------------------------------+ +-----------------------------------+ ¦ 0 0 0 0 0 0 1 0 ¦ 0 0 0 0 1 0 0 0 ¦ Соответствует десятичному 208 +-----------------------------------+ 1) Вычитание младших байт командой SUB. -----------------+ ¦0 0 0 0 0 1 1 1 ¦ --- -----------------+ -----------------+ ¦0 0 0 0 1 0 0 0 ¦ -----------------+ --------------------- -----------------+ Произошло два заема, поэтому ¦1 1 1 1 1 1 1 1 ¦ флажки AF и CF устанавливаются -----------------+ в состояние 1 2) Десятичная коррекция промежуточного результата: -----------------+ ¦1 1 1 1 1 1 1 1 ¦ --- -----------------+ -----------------+ Вычитается число 6, т.к. AF = 1 ¦0 0 0 0 0 1 1 0 ¦ и младшая тетрада больше 9 --- -----------------+ -----------------+ Вычитается число 60, т.к. СF = 1 ¦0 1 1 0 0 0 0 0 ¦ и старшая тетрада больше 9. -----------------+ Флажок CF остается в состоянии 1 --------------------- -----------------+ ¦1 0 0 1 1 0 0 1 ¦ После десятичной коррекции -----------------+ 3) Вычитание стаpших байт командой SBB. +----------------- ¦ 0 0 0 0 0 0 1 1¦ --- +----------------- +----------------- ¦ 0 0 0 0 0 0 1 0¦ +----------------- --- +---+ ¦ 1 ¦ флажок CF +---+ --------------------- +----------------- ¦ 0 0 0 0 0 0 0 0¦ Флажок CF устанавливается в 0 +----------------- 4) Десятичная коррекция вычитания старших байт не изменяет промежуточного результата, т.к. значения тетрад допустимые и флажок CF = 0. 5) Окончательный Результат соответствует десятичному числу 99. +-----------------------------------+ ¦ 0 0 0 0 0 0 0 0 ¦ 1 0 0 1 1 0 0 1 ¦ +-----------------------------------+ ======================================== = Команды логических операций ======================================== ### Команда AND ######################################################### ### Реализует поразрядно булевую +------------------------------------+ функцию И (конъюнкцию). Второй ¦ бит 1 ¦ бит 2 ¦ бит 1 AND бит 2 ¦ операнд выполняет роль маски. +-------+-------+--------------------¦ Результат заносится на место ¦ 0 ¦ 0 ¦ 0 ¦ первого операнда. ¦ 0 ¦ 1 ¦ 0 ¦ ¦ 1 ¦ 0 ¦ 1 ¦ ¦ 1 ¦ 1 ¦ 1 ¦ +------------------------------------+ ### Флажки OF и CF всегда переводятся в нулевое состояние, т.к. межразрядные связи отсутствуют. Флажки SF, ZF и PF устанавливаются в зависимости от полученного результата (по правилам арифметических операций). Состояние флажка AF не определено. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ AND Регистр1, Регистр2 ¦ t = 3 такта ¦ 001000 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ AND Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ AND Память, Регистр ¦ t = 16+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ AND Регистр, Константа ¦ t = 4 такта ¦ 100000 s w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байта ¦ mod 100 r/m ¦ ¦ AND Память, Константа ¦ t = 17+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ AND Аккумул., Константа¦ t = 4 такта ¦ 0010010 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Примечание: Используется для перевода в нулевое состояние тех бит первого операнда, которые определяются маской, содержащей нули в сбрасываемых битах и единицы в остальных. ### Команда OR ######################################################### ### Реализует поразрядно булевую +------------------------------------+ функцию ИЛИ (дизъюнкцию). ¦ бит 1 ¦ бит 2 ¦ бит 1 OR бит 2 ¦ Второй операнд играет роль +-------+-------+--------------------¦ маски. Результат заносится на ¦ 0 ¦ 0 ¦ 0 ¦ место первого операнда. ¦ 0 ¦ 1 ¦ 1 ¦ ¦ 1 ¦ 0 ¦ 1 ¦ ¦ 1 ¦ 1 ¦ 1 ¦ +------------------------------------+ ### Флажки OF и CF всегда переводятся в нулевое состояние, т.к. межразрядные связи отсутствуют. Флажки SF, ZF и PF устанавливаются в зависимости от полученного результата (по правилам арифметических операций). Состояние флажка AF не определено. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ OR Регистр1, Регистр2 ¦ t = 3 такта ¦ 000010 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ OR Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ OR Память, Регистр ¦ t = 16+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ OR Регистр, Константа ¦ t = 4 такта ¦ 100000 s w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байта ¦ mod 001 r/m ¦ ¦ OR Память, Константа ¦ t = 17+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ OR Аккумул., Константа ¦ t = 4 такта ¦ 0000110 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Примечание: Используется для установки в 1 определенных бит первого операнда. ### Команда XOR ######################################################### ### Реализует поразрядно булевую +------------------------------------+ функцию ИСКЛЮЧАЮЩЕЕ ИЛИ. ¦ бит 1 ¦ бит 2 ¦ бит 1 XOR бит 2 ¦ Второй операнд играет роль +-------+-------+--------------------¦ маски. Результат заносится на ¦ 0 ¦ 0 ¦ 0 ¦ место первого операнда. ¦ 0 ¦ 1 ¦ 1 ¦ ¦ 1 ¦ 0 ¦ 1 ¦ ¦ 1 ¦ 1 ¦ 0 ¦ +------------------------------------+ ### Флажки OF и CF всегда переводятся в нулевое состояние, т.к. межразрядные связи отсутствуют. Флажки SF, ZF и PF устанавливаются в зависимости от полученного результата (по правилам арифметических операций). Состояние флажка AF не определено. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ XOR Регистр1, Регистр2 ¦ t = 3 такта ¦ 001100 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ XOR Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ XOR Память, Регистр ¦ t = 16+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ XOR Регистр, Константа ¦ t = 4 такта ¦ 100000 s w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байта ¦ mod 110 r/m ¦ ¦ XOR Память, Константа ¦ t = 17+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ XOR Аккумул., Константа¦ t = 4 такта ¦ 0011010 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Примечание: Используется для перевода регистра в нулевое состояние, сравнения операндов на абсолютное равенство, инвертирования определенных бит операнда с помощью маски. ### Команда TEST ######################################################### ### Реализует поразрядно булевую +------------------------------------+ функцию И (конъюнкцию). Второй ¦ бит 1 ¦ бит 2 ¦ бит 1 AND бит 2 ¦ операнд выполняет роль маски. +-------+-------+--------------------¦ В отличии от AND результат ¦ 0 ¦ 0 ¦ 0 ¦ никуда не заносится. ¦ 0 ¦ 1 ¦ 0 ¦ ¦ 1 ¦ 0 ¦ 1 ¦ ¦ 1 ¦ 1 ¦ 1 ¦ +------------------------------------+ ### Флажки OF и CF всегда переводятся в нулевое состояние, т.к. межразрядные связи отсутствуют. Флажки SF, ZF и PF устанавливаются в зависимости от полученного результата (по правилам арифметических операций). Состояние флажка AF не определено. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ TEST Регистр1, Регистр2 ¦ t = 3 такта ¦ 1000010 w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ TEST Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ TEST Память, Регистр ¦ t = 16+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ TEST Регистр, Константа ¦ t = 5 тактов ¦ 1111011 w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байтов ¦ mod 000 r/m ¦ ¦ TEST Память, Константа ¦ t = 11+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ TEST Аккумул., Константа¦ t = 4 такта ¦ 1010100 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Команда NOT ######################################################### ### Инвертирует биты операнда, реализуя поразрядно унарную логическую функцию НЕ. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ NOT Регистр ¦ t = 3 такта ¦ 1111011 w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod 010 r/m ¦ ¦ NOT Память ¦ t = 16+ЕF тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ Можно указывать байт или слово. +----------------¦ При обращении к памяти необходимо ¦ dispH ¦ использовать модификаторы BYTE +----------------+ (байт) или WORD (слово), без которых команда неоднозначна. ======================================== = Команды обработки строк ======================================== ### Префиксы повторения ################################################### ### REP используется с командами MOVS и STOS, обеспечивая повторение пока не достигнут конец цепочки, т.е. пока содержимое регистра CX не достигнет нуля. После каждого повторения производится декремент CX, поэтому его необходимо инициализировать на требуемое число. REPE и REPZ используются с командами CMPS и SCAS, обеспечивая повторение пока содержимое флажка ZF = 1 или пока содержимое регистра СХ не достигнет нуля. Состояние ZF определяется результатом выполнения команд. После каждого повторения производится декремент CX, поэтому его необходимо инициализировать на требуемое число. REPNE и REPNZ используются с командами CMPS и SCAS, обеспечивая повторение, пока содержимое флажка ZF = 0 или пока содержимое регистра СХ не достигнет нуля. Состояние ZF определяется результатом выполнения команд. После каждого повторения производится декремент CX, поэтому его необходимо инициализировать на требуемое число. ### Регистр флажков не модифицируется. ### Форматы префиксов: 7 0 +-------------------------+ +----------------+ ¦ REP (MOVS или STOS) ¦ l = 1 байт ¦ 11110011 ¦ ¦ REPE (CMPS или SCAS) ¦ префикса +----------------+ ¦ REPZ (CMPS или SCAS) ¦ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ REPNE (MOVS или STOS) ¦ l = 1 байт ¦ 11110010 ¦ ¦ REPNZ (CMPS или SCAS) ¦ префикса +----------------+ +-------------------------+ ### Примечание: При обработке строк микропроцессор реагирует на прерывание до обработки следующего элемента строки. После возврата из прерывания операция возобновляется с точки прерывания. Однако возобновление операции будет неправильным, если, кроме префикса повторения, определены еще один или два префикса (замены сегмента, блокировки). Во время обработки прерывания микропроцессор помнит действие только одного непосредственно предшествующего команде префикса. После возврата из прерывания, любые дополнительные префиксы не действуют. ### Команда MOVS / MOVSB / MOVSW ########################################## ### Передает байт (слово), адресуемое парой регистров DS:SI, в байт (слово), на которое указывает пара регистров ES:DI. После пересылки автоматически производится декремент (при DF = 1) или инкремент (при DF = 0) содержимого регистров SI и DI. Если команда оперирует байтами, индексные регистры изменяются на 1, если словами - на 2. С префиксом REP команда используется для пересылки строки байт (слов) из одной области памяти в другую. При этом, после каждого выполнения команды производится автоматическое уменьшение регистра СХ на 1, поэтому его необходимо инициализировать на требуемое число повторений. Операнды команды (в формате MOVS) используются не для адресации, а для определения типа передаваемой информации: байт или слово. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ MOVSB (MOVSW) ¦ t = 18 тактов(без REP) ¦ 1010010 w ¦ +-------------------------+ +----------------+ Тип передаваемой информации определяется по мнемонике команды: символ B означает передачу байта, а W - передачу слова. +-------------------------+ l = 1 байт ¦ MOVS Память, Память ¦ t = 18 тактов(без REP) +-------------------------+ Тип передаваемой информации определяется по атрибутам операндов команды. ### Команда CMPS / CMPSB / CMPSW ########################################## ### Сравнивает байт (слово), адресуемое парой регистров DS:SI с байтом (словом), на который указывает пара регистров ES:DI. После сравнения автоматически производится декремент (при DF = 1) или инкремент (при DF = 0) содержимого регистров DI и SI. Если команда оперирует байтами, индексные регистры изменяются на 1, если словами - на 2. С префиксами REPE и REPZ команда используется для поиска отличающихся элементов строк; с префиксами REPNE и REPNZ команда используется для поиска одинаковых элементов строк. При наличии префикса после каждого выполнения команды производится автоматическое уменьшение регистра СХ на 1, поэтому его необходимо инициализировать на требуемое число повторений. Операнды команды (в формате CMPS) используются не для адресации, а для определения типа сравниваемой информации: байт или слово. ### Флажки устанавливаются в соответствии с результатом операции. ### Форматы команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ CMPSB (CMPSW) ¦ t = 22 тактов (без ¦ 1010011 w ¦ +-------------------------+ REPNE или REPNZ) +----------------+ Тип сравниваемой информации определяется по мнемонике команды: символ B означает сравнение байтов, а W - сравнение слов. +-------------------------+ l = 1 байт ¦ CMPS Память, Память ¦ t = 22 тактов (без +-------------------------+ REPNE или REPNZ) Тип сравниваемой информации определяется по атрибутам операндов команды. ### Команда SCAS / SCASB / SCASW ########################################## ### Сравнивает значение в регистре AL (AX) с байтом (словом), на который указывает пара регистров ES: DI. После сравнения автоматически производится декремент (при DF = 1) или инкремент (при DF = 0) содержимого регистра DI. Если команда оперирует байтами, индексный регистр изменяется на 1, если словами - на 2. С префиксами REPE и REPZ команда используется для поиска элемента строки, отличающегося от заданного значения; с префиксами REPNE и REPNZ команда используется для поиска элемента строки со значением равным заданному. При наличии префикса после каждого выполнения команды производится автоматическое уменьшение регистра СХ на 1, поэтому его необходимо инициализировать на требуемое число повторений. Операнд команды (в формате SCAS) используются не для адресации, а для определения типа сравниваемой информации: байт или слово. ### Флажки устанавливаются в соответствии с полученным результатом. ### Форматы команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ SCASB (SCASW) ¦ t = 15 тактов (без ¦ 1010111 w ¦ +-------------------------+ REPNE или REPNZ) +----------------+ Тип сравниваемой информации определяется по мнемонике команды: символ B означает сравнение байтов, а W - сравнение слов. +-------------------------+ l = 1 байт ¦ SCAS Память ¦ t = 15 тактов (без +-------------------------+ REPNE или REPNZ) Тип сравниваемой информации определяется по атрибуту операнда команды. ### Команда LODS / LODSB / LODSW ########################################## ### Загружает байт (слово), на который указывает пара регистров DS:SI, в аккумулятор AL (AX). После выполнения загрузки автоматически производится декремент (при DF = 1) или инкремент (при DF = 0) содержимого регистра SI. Если команда оперирует байтами, индексный регистр изменяется на 1, если словами - на 2. Команда используется без префиксов. Операнд команды (в формате LODS) используются не для адресации, а для определения типа загружаемой информации: байт или слово. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ LODSB (LODSW) ¦ t = 12 тактов ¦ 1010110 w ¦ +-------------------------+ +----------------+ Тип загружаемой информации определяется по мнемонике команды: символ B означает загрузку байт, а W - загрузку слова. +-------------------------+ l = 1 байт ¦ LODS Память ¦ t = 12 тактов +-------------------------+ Тип загружаемой информации определяется по атрибуту операнда команды. ### Команда STOS / STOSB / STOSW ########################################## ### Записывает содержимое регистра AL (AX) в байт (слово), на который указывает пара регистров ES:DI. После выполнения записи автоматически производится декремент (при DF = 1) или инкремент (при DF = 0) содержимого регистра DI. Если команда оперирует байтами, индексный регистр изменяется на 1, если словами - на 2. С префиксом REP команда используется для заполнения строки фиксированным значением. При наличии префикса после каждого выполнения команды производится автоматическое уменьшение регистра СХ на 1, поэтому его необходимо инициализировать на требуемое число повторений. Операнд команды (в формате STOS) используются не для адресации, а для определения типа записываемой информации: байт или слово. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ STOSB (STOSW) ¦ t = 11 тактов ¦ 1010101 w ¦ +-------------------------+ (без префикса) +----------------+ Тип записываемой информации определяется по мнемонике команды: символ B означает запись байта, а W - запись слова. +-------------------------+ l = 1 байт ¦ STOS ¦ t = 11 тактов +-------------------------+ (без префикса) Тип записываемой информации определяется по атрибуту операнда команды. ======================================== = Команды передачи данных ======================================== ### Команда MOV ######################################################### ### Осуществляет передачу содержимого второго операнда в первый. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ MOV Регистр1, Регистр2 ¦ t = 2 такта ¦ 100010 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-4 байта ¦ mod reg r/m ¦ ¦ MOV Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 3-4 байта +----------------¦ ¦ MOV Память, Регистр ¦ t = 8+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-6 байта +----------------+ ¦ MOV Память, Константа ¦ t = 10+ЕА тактов ¦ 1100011 w ¦ +-------------------------+ ¦----------------¦ ¦ mod 000 r/m ¦ ¦----------------¦ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ MOV Регистр, Константа ¦ t = 4 такта ¦ 1011 w reg ¦ +-------------------------+ ¦----------------¦ Нельзя определять сегментные регистры. ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 3 байта +----------------+ ¦ MOV Аккумулятор, Память¦ t = 10 тактов ¦ 1010000 w ¦ +-------------------------+ ¦----------------¦ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ +----------------+ 7 0 +-------------------------+ l = 3 байта +----------------+ ¦ MOV Память, Аккумулятор¦ t = 10 тактов ¦ 1010001 w ¦ +-------------------------+ ¦----------------¦ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ +----------------+ 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ MOV СегРегистр, Память ¦ t = 8+ЕА тактов ¦ 10001110 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod 0sreg r/m ¦ ¦ MOV СегРегистр, Регистр ¦ t = 8+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ Нельзя использовать регистр CS, т.к. +----------------¦ результат операции будет неопределен. ¦ dispH ¦ При инициализации рекомендуется +----------------+ использовать регистр АХ. 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ MOV Память, СегРегистр ¦ t = 9+ЕА тактов ¦ 10001100 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod 0sreg r/m ¦ ¦ MOV Регистр, CегРегистр ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Команда XCHG ######################################################### ### Обменивает содержимое двух операндов. В качестве операндов нельзя использовать сегментные регистры. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ XCHG Регистр, AX ¦ t = тактов ¦ 10010 reg ¦ +-------------------------+ +----------------+ Команда XCHG AX, AX используется как команда пустой операции NOP. 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ XCHG Регистр1, Регистр2 ¦ t = 4 такта ¦ 1000011 w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ XCHG Регистр, Память ¦ t = 17+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Команда XLAT ######################################################### ### Заменяет содержимое аккумулятора AL на значение, выбираемое из таблицы, на которую указывает регистр BX. Содержимое AL интепретируется как индекс выбираемого байта. +-----------------------------------+ ¦ П А М Я Т Ь ВХ ¦ эффективный адрес таблицы ------------------¦----------------¦ +-----------------------------------+ ¦ ¦ ¦ ¦----------------¦ +-----------------+ ¦ ¦ ¦ Регистр AL перед ¦ и н д е к с ----------¦ ¦----------------¦ выполнением XLAT +-----------------+ ¦ ¦ ¦ ¦ ¦----------------¦ ¦ ¦ +-----------------+ -----¦----------------¦ Регистр AL после ¦ содержимое ----------------- содержимое ¦ выполнения XLAT +-----------------+ ¦----------------¦ ¦ ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ XLAT ¦ t = 11 тактов ¦ 11010111 ¦ +-------------------------+ +----------------+ ### Примечание: Смещение адресного значения таблицы можно загрузить в регистр ВХ с помощью команд LEA, LDS или другими способами. ### Команда LEA ######################################################### ### Загружает в первый операнд эффективный адрес памяти, который вычисляется в соответствии с указанным режимом адресации второго опреанда. В качестве первого операнда нельзя использовать сегментные регистры. ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ LEA Регистр, Память ¦ t = 2+ЕА тактов ¦ 10001101 ¦ +-------------------------+ ¦----------------¦ ¦ mod reg r/m ¦ ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Примечание: Во многих случаях команда LEA идентична команде MOV с непосредственным операндом. Например: LEA BX, EXWORD - эквивалентно - MOV BX, OFFSET EXWORD (оператор OFFSET сообщает, что надо переслать СМЕЩЕНИЕ адресного значения переменной) ### Команда LDS ######################################################### ### Загружает в первый операнд (обычно регистр SI) значение смещения, расположенное по адресу второго операнда, а в регистр DS загружает значение сегмента, расположенное по адресу второго операнда + 2. ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ LDS Регистр, Память ¦ t = 16+ЕА тактов ¦ 11000101 ¦ +-------------------------+ ¦----------------¦ ¦ mod reg r/m ¦ ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Примечание: Указатель ( сегмент: смещение ) можно организовать с помощью директивы DD, если операндом директивы будет адресное выражение. Например: ............................... TABLE DB '0123456789' ............................... TABLE POINTER DD TABLE ; В переменной TABLE POINTER ............................... содержится указатель на TABLE ............................... сегмент:смещение ............................... LDS SI, TABLE POINTER ; Из переменной TABLE POINTER в ............................... регистр DS загружается сегмент, ............................... в регистр SI - смещение ### Команда LES ######################################################### ### Загружает в первый операнд (обычно регистр DI) значение смещения, расположенное по адресу второго операнда, а в регистр ES загружает значение сегмента, расположенное по адресу второго операнда + 2. ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ LES Регистр, Память ¦ t = 16+ЕА тактов ¦ 11000100 ¦ +-------------------------+ ¦----------------¦ ¦ mod reg r/m ¦ ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Примечание: Указатель ( сегмент: смещение ) можно организовать с помощью директивы DD, если операндом директивы будет адресное выражение. Например: ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ LES Регистр, Память ¦ t = 16+ЕА тактов ¦ 11000100 ¦ +-------------------------+ ¦----------------¦ ¦ mod reg r/m ¦ ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Примечание: Указатель ( сегмент: смещение ) можно организовать с помощью директивы DD, если операндом директивы будет адресное выражение. Например: ======================================== = Команды пересылки флагов ======================================== ### Регистр флажков ###################################################### ¦--- старший байт ----¦--- младший байт ----¦ +-----------------------------------------------+ ¦ х х х х OF DF IF TF SF ZF х AF х PF х CF¦ +-----------------------------------------------+ ### х - состояние битов не определено (зарезервированы). ### OF - флажок ПЕРЕПОЛНЕНИЯ Устанавливается арифметическими операциями. ---------------------------- Используется для определения переполнения в операциях с числами, представленными в дополнительном коде. Если OF = 1, то результат арифметической операции вышел за допустимые пределы: - 128 … байт … + 127 - 32768 … слово … + 32767 ### DF - флажок НАПРАВЛЕНИЯ Устанавливается командами CLD и STD. ---------------------------- Используется в командах обработки строк для указания направления продвижения по строке данных. Если DF = 0, то строка сканируется от меньших адресов к большим. ### IF - флажок ПРЕРЫВАНИЙ Устанавливается командами CLI и STI. ---------------------------- Используется для запрещения ВНЕШНИХ прерваний (ЗА ИСКЛЮЧЕНИЕМ НЕМАСКИРУЕМЫХ). Для блокировки отдельных прерываний используется специальный регистр масок. Если IF = 0, то прерывания не возникают. ### TF - флажок ТРАССИРОВКИ Устанавливается комбинацией команд через ---------------------------- стек (смотрите применение команды PUSHF). Используется для перевода микропроцессора в одношаговый режим. После каждой команды автоматически генерируется внутреннее прерывание с переходом к подпрограмме обработки, написанной программистом. Если TF = 1, включен режим трассировки. ### SF - флажок З Н А К А Устанавливается арифметическими операциями. ---------------------------- Используется для определения знака числа в знаковой арифметике по старшему биту результата операции. Если SF = 1, то результат отрицательный. ### ZF - флажок Н У Л Я Устанавливается арифметическими операциями. ---------------------------- Показывает был ли равен нулю результат последней операции. Если ZF = 1, то результат равен нулю. ### AF - флажок ПЕРЕНОСА Устанавливается арифметическими операциями. -------- (ДОПОЛНИТЕЛЬНОГО) Используется в командах десятичной ------------------- арифметики. Фиксирует перенос из младшей тетрады результата в старшую. Если AF = 1, то произошел перенос. ### PF - флажок ЧЕТНОСТИ Устанавливается арифметическими операциями. ---------------------------- Используется для контроля правильности передачи данных. Фиксирует наличие четного количества единиц в младших 8 битах результата последней операции. Если PF = 1, то количество единиц четное. ### CF - флажок ПЕРЕНОСА Устанавливается арифметическими операциями. ---------------------------- Используется для определения переноса (при сложении) или заема (при вычитании), а также значения выдвигаемого бита после операций сдвигов. Если CF = 1, то произошел перенос (заем). ### Команда LAHF ######################################################### ### Передает младший байт регистра флажков в регистр АН. 15----------------------7-----------------------0 ¦ старший байт ¦SF ZF AF PF CF¦ +-----------------------------------------------+ ¦ 15----------------------7----------------------0 ¦ AH ¦ AL ¦ +----------------------------------------------+ ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ LAHF ¦ t = 4 такта ¦ 10011111 ¦ +-------------------------+ +----------------+ ### Примечание: Перевод системы команд МП 8080 в систему МП 8086. Слово состояния МП 8080 (PSW) образуется регистром флажков и аккумулятором и используется в команде PUSH PSW МП 8080, которую эмулирует команда LAHF МП 8086: LAHF PUSH AX - эквивалентно - PUSH PSW ### Команда SAHF ######################################################### ### Передает содержимое регистра АН в младший байт регистра флажков. 15----------------------7----------------------0 ¦ AH ¦ AL ¦ +----------------------------------------------+ ¦ 15----------------------7-----------------------0 ¦ старший байт ¦SF ZF AF PF CF¦ +-----------------------------------------------+ ### Младший байт регистра флажков принимает значение, извлеченное из регистра AH. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ SAHF ¦ t = 4 такта ¦ 10011110 ¦ +-------------------------+ +----------------+ ### Примечание: Перевод системы команд МП 8080 в систему МП 8086. Слово состояния МП 8080 (PSW) образуется регистром флажков и аккумулятором и используется в команде POP PSW МП 8080, которую эмулирует команда SAHF МП 8086: POP AX SAHF - эквивалентно - POP PSW ======================================== = Команды преобразований ======================================== ### Команда CBW ######################################################### ### Преобразует байт в слово, расширяя (копируя) знак содержимого регистра AL в регистр AH. Если значение в pегистpе AL положительно, команда заполняет pегистp AH нулями, если отpицательно - единицами. Расшиpение знака числа, пpедставленного в дополнительном коде, не изменяет значение числа. ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ CBW ¦ t = 2 такта ¦ 10011000 ¦ +-------------------------+ +----------------+ ### Примечание: Используется для превращения знакового делимого одинарной длины в делимое двойной длины путем расширения знака. Если используется беззнаковое деление, то применяется обнуление расширения аккумулятора (например: SUB AH, AH). ### Команда CWD ######################################################### ### Преобразует слово в двойное слово, расширяя (копируя) знак содержимого регистра AX в регистр DX. Если значение в pегистpе AX положительно, команда заполняет DX нулями, если отpицательно - единицами. Расшиpение знака числа, пpедставленного в дополнительном коде, не изменяет значение числа. ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ CWD ¦ t = 5 тактов ¦ 10011001 ¦ +-------------------------+ +----------------+ ### Примечание: Используется для превращения знакового делимого одинарной длины в делимое двойной длины путем расширения знака. Если используется беззнаковое деление, то применяется обнуление расширения аккумулятора (например: SUB DX, DX). ======================================== = Команды прерываний ======================================== ### Команда INT ######################################################### ### Вызывает подпрограмму обработки. Если операнд у команды отсутствует, тип прерывания равен 3 (прерывание контрольной точки). Если операнд задается, тип может принимать значения от 0 до 255. Команда INT (с операндом): включает в стек содержимое регистра флажков, сбрасывает в нулевое состояние флажки IF и TF, загружает в CS слово из памяти по адресу [(тип прерывания * 4) + 2] включает в стек содержимое IP, загружает в IP слово из памяти по адресу [(тип прерывания * 4)] ### Формат команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ INT Тип ¦ t = 51 такт ¦ 11001101 ¦ +-------------------------+ ¦----------------¦ ¦ type ¦ +----------------+ 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ INT ¦ t = 52 такта ¦ 11001100 ¦ +-------------------------+ +----------------+ Прерывание типа 3 ### Примечание: Однобайтная команда INT (без операнда) используется в процессе отладки программ, передавая управление по адресу 0000С, являющимся частью пакета отладочных программ. ### Команда INTO ######################################################### ### Генерирует программное прерывание, если в результате предыдущих операций флажок переполнения OF был установлен в 1. команда аналогична INT, но имеет тип прерывания 4. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ INTO ¦ t = 4 такта (если ¦ 11001110 ¦ +-------------------------+ нет переполнения) +----------------+ t = 53 такта (если переполнение) ======================================== = Команды сдвигов ======================================== ### При многоразрядном сдвиге вторым операндом является регистр CL, содержимое которого интерпретируется как число сдвигов. При одноразрядном сдвиге на месте второго операнда должна стоять единица. ### Время выполнения при однобитном сдвиге регистра - 2 такта, при однобитном сдвиге слова или байта памяти - 15 + ЕА тактов. при многоразрядном сдвиге регистра - 8 + 4 * (CL) тактов при многоразрядном сдвиге слова или байта памяти - 20 + ЕА + 4 * (CL) тактов Команды сдвигов имеют длину 2 - 4 байта. ### Команда RCL ######################################################### ### Осуществляет циклический сдвиг влево с переносом старшего бита во флажок CF, а значения флажка - в младший бит. Регистр флажков Слово(байт) регистра/памяти 15 0 15(7) 0 +------- - - -------+ +------ - - ------+ ¦ ¦ ¦ CF <----------------- <--- ¦ +------- - - ---- ¦ + +------ - - ---- ^+ ¦ ¦ ¦ ¦ +-----------------------------------+ ### Модифицирует флажки OF и CF. Флажок CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флажок OF = 1, если операция изменила значение старшего (знакового) бита операнда. При сдвиге на несколько бит состояние флажка OF не определено. ### Формат команды: 7 0 7 0 +-------------------------+ +----------------+ ¦ RCL Регистр, СL ¦ ¦ 110100 v w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ mod 010 r/m ¦ ¦ RCL Память, СL ¦ ¦----------------¦ +-------------------------+ ¦ dispL ¦ При обращении к памяти необходимо +----------------¦ использовать модификаторы BYTE ¦ dispH ¦ байт) или WORD (слово). +----------------+ ### Команда RCR ######################################################### ### Осуществляет циклический сдвиг вправо с переносом младшего бита во флажок CF, а значения флажка - в старший бит. Регистр флажков Слово(байт) регистра/памяти 15 0 15(7) 0 +------- - - -------+ +------ - - -------+ ¦ ¦ ¦ CF -----------------> ---> ¦ +------- - - ---- ^+ +------ - - ---- ¦ + ¦ ¦ ¦ ¦ +-----------------------------------+ ### Модифицирует флажки OF и CF. Флажок CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флажок OF = 1, если операция изменила значение старшего (знакового) бита операнда. При сдвиге на несколько бит состояние флажка OF не определено. ### Формат команды: 7 0 +-------------------------+ +----------------+ ¦ RCR Регистр, СL ¦ ¦ 110100 v w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ mod 011 r/m ¦ ¦ RCR Память, СL ¦ ¦----------------¦ +-------------------------+ ¦ dispL ¦ При обращении к памяти необходимо +----------------¦ использовать модификаторы BYTE ¦ dispH ¦ (байт) или WORD (слово). +----------------+ ### Команда ROL ######################################################### ### Осуществляет циклический сдвиг влево с преносом старшего бита в младший бит и флажок CF. Регистр флажков Слово(байт) регистра/памяти 15 0 15(7) 0 +------- - - -------+ +------ - - --------+ ¦ ¦ ¦ CF ¦ ¦ <--- ¦ +------- - - ---- ^+ +- -- - - ----- ^ -+ ¦ ¦ ¦ ¦ ¦ ¦ +-----------------------------------+ ### Модифицирует флажки OF и CF. Флажок CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флажок OF = 1, если операция изменила значение старшего (знакового) бита операнда. При сдвиге на несколько бит состояние флажка OF не определено. ### Формат команды: 7 0 +-------------------------+ +----------------+ ¦ ROL Регистр, СL ¦ ¦ 110100 v w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ mod 000 r/m ¦ ¦ ROL Память, СL ¦ ¦----------------¦ +-------------------------+ ¦ dispL ¦ При обращении к памяти необходимо +----------------¦ использовать модификаторы BYTE ¦ dispH ¦ (байт) или WORD (слово). +----------------+ ### Команда ROR ######################################################### ### Осуществляет циклический сдвиг вправо с переносом младшего бита в старший бит и флажок CF. Регистр флажков Слово(байт) регистра/памяти 15 0 15(7) 0 +------- - - -------+ +------ - - -------+ ¦ ¦ ¦ CF ¦ ¦ ---> ¦ +------- - - ---- ^ + +- ^ -- - - -----¦-+ ¦ ¦ ¦ ¦ ¦ ¦ +-----------------------------------+ ### Модифицирует флажки OF и CF. Флажок CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флажок OF = 1, если операция изменила значение старшего (знакового) бита операнда. При сдвиге на несколько бит состояние флажка OF не определено. ### Формат команды: 7 0 +-------------------------+ +----------------+ ¦ ROR Регистр, СL ¦ ¦ 110100 v w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ mod 001 r/m ¦ ¦ ROR Память, СL ¦ ¦----------------¦ +-------------------------+ ¦ dispL ¦ При обращении к памяти необходимо +----------------¦ использовать модификаторы BYTE ¦ dispH ¦ (байт) или WORD (слово). +----------------+ ### Команда SAL ######################################################### ### Осуществляет арифметический сдвиг влево. Младший бит загружается нулем. Если содержимое операнда интерпретируется как число в дополнительном коде, то команда SAL не отличается от команды логического сдвига влево SHL. Старший бит переносится во флажок CF. Регистр флажков Слово(байт) регистра/памяти 15 0 15(7) 0 +------- - - -------+ +------ - - -------+ ¦ ¦ ¦ CF <----------------- <--- ¦ +------- - - -------+ +------ - - ---- ^ + ¦ 0 + ### Модифицирует флажки OF, SF, ZF, PF и CF в зависимости от результата. Флажок CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флажок OF = 1, если операция изменила значение старшего (знакового) бита операнда. При сдвиге на несколько бит состояние флажка OF не определено. ### Формат команды: 7 0 +-------------------------+ +----------------+ ¦ SAL Регистр, СL ¦ ¦ 110100 v w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ mod 100 r/m ¦ ¦ SAL Память, СL ¦ ¦----------------¦ +-------------------------+ ¦ dispL ¦ При обращении к памяти необходимо +----------------¦ использовать модификаторы BYTE ¦ dispH ¦ (байт) или WORD (слово). +----------------+ ### Команда SAR ######################################################### ### Осуществляет арифметический сдвиг вправо. Старший бит не сдвигается, а тиражируется в соседнем правом бите, поэтому при интерпретации содержимого операнда как знакового числа, его знак не изменяется. Младший бит переносится во флажок CF. Регистр флажков Слово(байт) регистра/памяти 15 0 15(7) 0 +------- - - -------+ +------ - - -------+ ¦ ¦ ¦ CF ¦ +---- ---> ¦ +------- - - ---- ^ + ¦ +- ^ -- - - -----¦-+ ¦ ¦ ¦ ¦ ¦ +------+ ¦ +-----------------------------------+ ### Модифицирует флажки OF, SF, ZF, PF и CF в зависимости от результата. Флажок CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флажок OF = 1, если операция изменила значение старшего (знакового) бита операнда. При сдвиге на несколько бит состояние флажка OF не определено. ### Формат команды: 7 0 +-------------------------+ +----------------+ ¦ SAR Регистр, СL ¦ ¦ 110100 v w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ mod 111 r/m ¦ ¦ SAR Память, СL ¦ ¦----------------¦ +-------------------------+ ¦ dispL ¦ При обращении к памяти необходимо +----------------¦ использовать модификаторы BYTE ¦ dispH ¦ (байт) или WORD (слово). +----------------+ ### Команда SHL ######################################################### ### Осуществляет логический сдвиг влево. В младший бит загружается нуль, а выдвигаемый старший бит перносится во флажок CF и при следующем сдвиге теряется. Регистр флажков Слово(байт) регистра/памяти 15 0 15(7) 0 +------- - - -------+ +------ - - -------+ ¦ ¦ ¦ CF <----------------- <--- ¦ +------- - - -------+ +------ - - ---- ^ + ¦ 0 + ### Модифицирует флажки OF, SF, ZF, PF и CF в зависимости от результата. Флажок CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флажок OF = 1, если операция изменила значение старшего (знакового) бита операнда. При сдвиге на несколько бит состояние флажка OF не определено. ### Формат команды: 7 0 +-------------------------+ +----------------+ ¦ SHL Регистр, СL ¦ ¦ 110100 v w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ mod 100 r/m ¦ ¦ SHL Память, СL ¦ ¦----------------¦ +-------------------------+ ¦ dispL ¦ При обращении к памяти необходимо +----------------¦ использовать модификаторы BYTE ¦ dispH ¦ (байт) или WORD (слово). +----------------+ ### Команда SHR ######################################################### ### Осуществляет логический сдвиг вправо. В старший бит загружается нуль, а выдвигаемый младший бит перносится во флажок CF и при следующем сдвиге теряется. Регистр флажков Слово(байт) регистра/памяти 15 0 15(7) 0 +------- - - -------+ +------ - - -------+ ¦ ¦ ¦ CF ¦ ¦ ---> ¦ +------- - - ---- ^ + +- ^ -- - - -----¦-+ ¦ ¦ ¦ ¦ 0 + ¦ +-----------------------------------+ ### Модифицирует флажки OF, SF, ZF, PF и CF в зависимости от результата. Флажок CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флажок OF = 1, если операция изменила значение старшего (знакового) бита операнда. При сдвиге на несколько бит состояние флажка OF не определено. ### Формат команды: 7 0 +-------------------------+ +----------------+ ¦ SHR Регистр, СL ¦ ¦ 110100 v w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ mod 101 r/m ¦ ¦ SHR Память, СL ¦ ¦----------------¦ +-------------------------+ ¦ dispL ¦ При обращении к памяти необходимо +----------------¦ использовать модификаторы BYTE ¦ dispH ¦ (байт) или WORD (слово). +----------------+ ======================================== = Команды символьной коррекции ======================================== ### ASCII - фоpмат ###################################################### ### В ASCII - формате каждый байт содержит одну десятичную цифру в младшей тетраде, старшая тетрада содержит нули. Максимальное значение байтового числа pавно 9. Многоpазрядные числа представляются последовательностью байт. Например: 15------------------------------7-------------------------------0 ¦ 0 0 0 0 ¦ 1 0 0 0 ¦ 0 0 0 0 ¦ 0 0 0 1 ¦ +---------------------------------------------------------------+ 0000.1000.0000.0001 в двоичном формате равно десятичному числу 2049, в ASCII - формате равно десятичному числу 81 ### С ASCII - числами можно производить любые арифметические операции. ### Команда AAA ######################################################### ### Производит символьную коррекцию результата двоичного сложения байтовых ASCII - чисел, который содержится в аккумуляторе AL. Сложение ASCII - чисел производится в два этапа: сначала байты суммируются как обычные двоичные числа, а затем осуществляется коррекция по следующим правилам: 1) Если младшая тетрада AL меньше или равна десятичному числу 9 и флажок AF = 0, то переход к шагу 3). 2) Если младшая тетрада AL больше десятичного числа 9 и флажок AF = 1, то к содержимому AL прибавляется число 6, к содержимому регистра AH прибавляется единица, а флажок AF устанавливается в 1. 3) Сбрасывается старшая тетрада аккумулятора AL. 4) Флажок CF устанавливается в то же состояние, что и флажок AF. ### Флажки CF и AF устанавливаются в 1, если результат суммирования больше числа 9. Состояние остальных флажков не определено. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ AAA ¦ t = 4 такта ¦ 00110111 ¦ +-------------------------+ +----------------+ ### Примечание: Сложение ASCII - чисел с повышенной точностью похоже на двоичную арифметику с повышенной точностью, но после сложения каждого байта необходимо производить символьную коррекцию. ### Команда AAS ######################################################### ### Производит символьную коррекцию результата двоичного вычитания байтовых ASCII - чисел, который содержится в регистре AL. Вычитание производится в два этапа: сначала осуществляется вычитание как для обычных двоичных чисел, а затем результат корректируется по следующим правилам: 1) Если младшая тетрада AL меньше или равна десятичному числу 9 и флажок AF = 0, то переход к шагу 3). 2) Если младшая тетрада AL больше десятичного числа 9 и флажок AF = 1, то из содержимого AL вычитается число 6, из содержимого регистра AH вычитается единица, а флажок AF устанавливается в 1. 3) Сбрасывается старшая тетрада аккумулятора AL. 4) Флажок CF устанавливается в то же состояние, что и флажок AF. ### Флажки AF и CF устанавливаются в 1, если вычитаемое больше уменьшаемого (AF и CF интерпретируются как флажки заема). Состояние остальных флажков не определено. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ AAS ¦ t = 4 такта ¦ 00111111 ¦ +-------------------------+ +----------------+ ### Примечание: Вычитание ASCII - чисел с повышенной точностью похоже на двоичную арифметику с повышенной точностью, но после каждого байтового вычитания необходимо производить символьную коррекцию. ### Команда AAM ######################################################### ### Производит символьную коррекцию результата умножения байтовых ASCII - чисел, который содержится в регистре AL. Умножение ASCII - чисел производится в два этапа: сначала осуществляется умножение командой MUL, а затем результат корректируется по следующим правилам: 1) Содержимое регистра AL делится на число 10. 2) Частное загружается в регистр AH, а остаток - в регистр AL. ### Состояние флажков SF, ZF, PF зависит от содержимого регистра AL. Состояние флажков OF, AF, CF не определено. ### Формат команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ AAM ¦ t = 83 такта ¦ 11010100 ¦ +-------------------------+ ¦----------------¦ ¦ 00001010 ¦ +----------------+ ### Примечание: Команду AAM можно использовать для деления двоичного числа на 10. Частное помещается в регистр AH, остаток - в регистр AL. ### Команда AAD ######################################################### ### Производит символьную коррекцию содержимого регистра АХ по следующим правилам: 1) Содержимое регистра AH умножается на число 10. 2) Полученный результат прибавляется к содержимому регистра AL. 3) Содержимое регистра AH сбрасывается. Деление ASCII - чисел производится в два этапа: сначала двухбайтовое ASCII - делимое преобразуется в двоичное число в регистре AL, а затем командой DIV содержимое регистра AX делится на байтовое ASCII - число. После деления в регистре AL остается частное, а в регистре AH - остаток. ### Состояние флажков SF, ZF, PF зависит от содержимого регистра AL. Состояние флажков OF, AF, CF не определено. ### Формат команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ AAD ¦ t = 60 тактов ¦ 11010101 ¦ +-------------------------+ ¦----------------¦ ¦ 00001010 ¦ +----------------+ ### Применение и особенности программирования: Если делитель равен 0, генерируется прерывание типа 0. Если в программе нет обработки такого прерывания, необходимо до операции проверить возможность возникновения деления на 0. Может оказаться, что частное - это не одна десятичная цифра (например, когда число 40 делится на 2). При этом переполнение не возникает, поэтому после каждой последовательности команд AAD - DIV необходимо проверять, не превысило ли частное числа 9, и вызывать соответствующую обработку переполнения. ======================================== = Команды сложения ======================================== ### Команда ADD ######################################################### ### Производит сложение двух операндов одинаковой длины по правилам двоичной арифметики и заносит результат операции на место первого операнда. ### Устанавливает флажки CF, AF, SF, ZF, PF, OF в соответствии с результатом операции. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ ADD Регистр1, Регистр2 ¦ t = 3 такта ¦ 000000 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ ADD Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ ADD Память, Регистр ¦ t = 16+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байтов +----------------+ ¦ ADD Регистр, Константа ¦ t = 4 такта ¦ 100000 s w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байтов ¦ mod 000 r/m ¦ ¦ ADD Память, Константа ¦ t = 17+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ ADD Аккумул., Константа¦ t = 4 такта ¦ 0000010 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Примечание: Команда пpоизводит сложение как знаковых, так и беззнаковых чисел. В случае знакового сложения пеpеполнение опpеделяется по состоянию флажка OF, в случае беззнакового - по флажку пеpеноса CF. +------------------------------------------------------------------------+ ¦ содеpжимое ¦ интеpпpетация содеpжимого ¦ флажки ¦ ¦ опеpандов +---------------------------------------+---------¦ ¦ ¦ беззнаковая ¦ знаковая ¦ CF ¦ OF ¦ +----------------------+--------------------+------------------+----+----¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 1 1 1 1 1 0 0 1 ¦ 2 4 9 ¦ - 7 ¦ ¦ ¦ ¦ + ¦ + ¦ + ¦ ¦ ¦ ¦ 0 0 0 0 0 0 1 0 ¦ 2 ¦ + 2 ¦ ¦ ¦ ¦ ------------------ ¦ ----------------- ¦ ---------------- ¦ ¦ ¦ ¦ 1 1 1 1 1 0 1 1 ¦ 2 5 1 ¦ - 5 ¦ 0 ¦ 0 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ пpавильный ¦ пpавильный ¦ ¦ ¦ ¦ ¦ pезультат, CF=0 ¦ pезультат, OF=0 ¦ ¦ ¦ +----------------------+--------------------+------------------+----+----¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 1 1 1 1 1 1 0 0 ¦ 2 5 2 ¦ - 4 ¦ ¦ ¦ ¦ + ¦ + ¦ + ¦ ¦ ¦ ¦ 0 0 0 0 0 1 0 1 ¦ 5 ¦ + 5 ¦ ¦ ¦ ¦ ------------------ ¦ ----------------- ¦ ---------------- ¦ ¦ ¦ ¦ 0 0 0 0 0 0 0 1 ¦ 1 ¦ + 5 ¦ 1 ¦ 0 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ непpавильный ¦ пpавильный ¦ ¦ ¦ ¦ ¦ pезультат, CF=1, ¦ pезультат, OF=0 ¦ ¦ ¦ ¦ ¦ пpоизошел пеpенос ¦ ¦ ¦ ¦ +----------------------+--------------------+------------------+----+----¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 0 1 1 1 1 0 0 1 ¦ 1 2 1 ¦ + 1 2 1 ¦ ¦ ¦ ¦ + ¦ + ¦ + ¦ ¦ ¦ ¦ 0 0 0 0 1 0 1 1 ¦ 1 1 ¦ + 1 1 ¦ ¦ ¦ ¦ ------------------ ¦ ----------------- ¦ ---------------- ¦ ¦ ¦ ¦ 1 0 0 0 0 1 0 0 ¦ 1 3 2 ¦ - 1 2 4 ¦ 0 ¦ 1 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ пpавильный ¦ непpавильный ¦ ¦ ¦ ¦ ¦ pезультат, CF=0 ¦ pезультат, OF=1,¦ ¦ ¦ ¦ ¦ ¦ пpоизошло ¦ ¦ ¦ ¦ ¦ ¦ пеpеполнение ¦ ¦ ¦ +----------------------+--------------------+------------------+----+----¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 1 1 1 1 0 1 0 1 ¦ 2 4 6 ¦ - 1 0 ¦ ¦ ¦ ¦ + ¦ + ¦ + ¦ ¦ ¦ ¦ 1 0 0 0 1 0 0 1 ¦ 1 3 7 ¦ - 1 1 9 ¦ ¦ ¦ ¦ ------------------ ¦ ----------------- ¦ ---------------- ¦ ¦ ¦ ¦ 0 1 1 1 1 1 0 1 ¦ 1 2 7 ¦ + 1 2 7 ¦ 1 ¦ 1 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ непpавильный ¦ непpавильный ¦ ¦ ¦ ¦ ¦ pезультат, CF=1, ¦ pезультат, OF=1,¦ ¦ ¦ ¦ ¦ пpоизошел пеpенос ¦ пpоизошло ¦ ¦ ¦ ¦ ¦ ¦ пеpеполнение ¦ ¦ ¦ +------------------------------------------------------------------------+ В знаковом сложении пеpеполнение возникает пpи выходе байтового pезультата за пpеделы -128 … +127, а pезультата длиною в слово - за пpеделы -32768 ... +32767. В беззнаковом сложении пеpеполнение возникает, если байтовый pезультат больше 255, а pезультат длиною в слово больше 65535. ### Команда ADC ######################################################### ### Производит сложение двух операндов одинаковой длины и значения флажка CF, установленного предыдущими операциями. Если CF = 0, то команда ADC эквивалентна команде ADD. ### Устанавливает флажки CF, AF, SF, ZF, PF, OF в соответствии с результатом операции. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ ADC Регистр1, Регистр2 ¦ t = 3 такта ¦ 000100 d w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 2-4 байта ¦ mod reg r/m ¦ ¦ ADC Регистр, Память ¦ t = 9+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ +-------------------------+ l = 2-4 байта +----------------¦ ¦ ADC Память, Регистр ¦ t = 16+ЕА тактов ¦ dispH ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 3-4 байтов +----------------+ ¦ ADC Регистр, Константа ¦ t = 4 такта ¦ 100000 s w ¦ +-------------------------+ ¦----------------¦ +-------------------------+ l = 3-6 байтов ¦ mod 010 r/m ¦ ¦ ADC Память, Константа ¦ t = 17+ЕА тактов ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦----------------¦ ¦ dispH ¦ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ 7 0 +-------------------------+ l = 2-3 байта +----------------+ ¦ ADC Аккумул., Константа¦ t = 4 такта ¦ 0001010 w ¦ +-------------------------+ ¦----------------¦ ¦ dataL ¦ ¦----------------¦ ¦ dataH ¦ +----------------+ ### Примечание: Пеpеполнение опpеделяется по тем же пpизнакам, что и для команды ADD. Команда используется пpи сложении с повышенной точностью. Пpимеp сложения двойного слова 130049 с двойным словом 1280 (незначащие нулевые тетрады опущены): 31--------------------------------15--------------------------------0 ¦ 0 0 0 1 ¦ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 ¦ -+- +-------------------------------------------------------------------+ +-------------------------------------------------------------------+ ¦ ¦ 0 1 0 1 0 0 0 0 0 0 0 0 ¦ +-------------------------------------------------------------------+ 1) Сложение младших слов командой ADD. ----------------------------------+ ¦ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 ¦ -+- ----------------------------------+ ----------------------------------+ ¦ 0 1 0 1 0 0 0 0 0 0 0 0 ¦ ----------------------------------+ ---------------------------------------- ----------------------------------+ Пpоизошло пеpеполнение, ¦ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ¦ т.к. был пеpенос из ----------------------------------+ стаpшего бита. Флажок CF устанавливается в 1 2) Сложение стаpших слов командой ADC. +---------------------------------- ¦ 0 0 0 1 ¦ -+- +---------------------------------- +---------------------------------- ¦ 0 0 0 0 ¦ +---------------------------------+ -+- +---+ ¦ 1 ¦ флажок CF +---+ --------------------------------------- +---------------------------------- ¦ 0 0 1 0 ¦ Флажок CF устанавливается в 0, +---------------------------------- 3) Окончательный pезультат соответствует числу 131329. +-------------------------------------------------------------------+ ¦ 0 0 1 0 ¦ 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ¦ +-------------------------------------------------------------------+ ======================================== = Команды умножения и деления ======================================== ### Команда MUL ######################################################### ### Производит умножение аккумулятора и операнда команды. Сомножители интерпретируются как беззнаковые числа. В операциях над байтами функцию аккумулятора выполняет регистр AL, а 16-битное произведение образуется в регистре AX. Максимальное значение произведения равно 255 * 255 = 65025. Если операнд идентифицирует слово, оно умножается на аккумулятор AX, а 32-битное произведение формируется в регистрах DX (старшая часть) и AX. ### Если старшая половина произведения не равна нулю, то флажки CF и OF устанавливаются в единицу. Состояние остальных флажков не определено. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ MUL Регистр ¦ t = 70...77 тактов ¦ 1111011 w ¦ +-------------------------+ (пpи байте pегистpа) ¦----------------¦ t = 118…133 такта ¦ 11100 reg ¦ (при слове регистра) +----------------+ 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ MUL Память ¦ t = (76…83)+ЕА тактов ¦ 1111011 w ¦ +-------------------------+ (пpи байте памяти) ¦----------------¦ t = (124…139)+EA тактов¦ mod 100 r/m ¦ (пpи слове памяти) ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Примечание: При умножении на числа, котоpые являются степенями 2, удобнее пользоваться командой сдвига влево SAL. ### Команда IMUL ######################################################### ### Производит умножение аккумулятора и операнда команды. Сомножители интерпретируются как знаковые числа. В операциях над байтами функцию аккумулятора выполняет регистр AL, а 16-битное произведение образуется в регистре AX. Если операнд идентифицирует слово, оно умножается на аккумулятор AX, а 32-битное произведение формируется в регистрах DX (старшая часть) и AX. ### Если старшая половина произведения не равна 00(0000) или FF(FFFF), то флажки CF и OF устанавливаются в единицу. Состояние остальных флажков не определено. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ IMUL Регистр ¦ t = 80…98 тактов ¦ 1111011 w ¦ +-------------------------+ (пpи байте pегистpа) ¦----------------¦ t = 128…154 такта ¦ 11101 reg ¦ (при слове регистра) +----------------+ 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ IMUL Память ¦ t = (86…104)+ЕА тактов ¦ 1111011 w ¦ +-------------------------+ (пpи байте памяти) ¦----------------¦ t = (134…160)+EA тактов¦ mod 101 r/m ¦ (при слове памяти) ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Команда DIV ######################################################### ### Производит деление аккумулятора и его расширения на содержимое операнда команды. Деление выполняется над числами, интерпретированными как беззнаковые. Делимое должно быть в 2 раза длиннее делителя. Байтовые команды делят 16-битовое число, расположенное в аккумуляторе AX, на 8-битный делитель. Частное результата помещается в регистр AL, а остаток в регистр AH. Команда, работающая со словами, делит 32-битовое число, расположенное в регистре DX (старшая часть) и аккумуляторе AX, на 16-битный делитель. Частное результата помещается в регистр AX, а остаток в регистр DX. ### Состояние регистра флажков не определено. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ DIV Регистр ¦ t = 80…90 тактов ¦ 1111011 w ¦ +-------------------------+ (пpи байте pегистpа) ¦----------------¦ t = 144…162 такта ¦ 11110 reg ¦ (пpи слове pегистpа) +----------------+ 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ DIV Память ¦ t = (86…96)+ЕА тактов ¦ 1111011 w ¦ +-------------------------+ (пpи байте памяти) ¦----------------¦ t = (150…168)+EA тактов¦ mod 110 r/m ¦ (при слове памяти) ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Примечание: Если частное результата превышает разрядность аккумулятора или делитель равен нулю, генерируется прерывание типа 0, а частное и остаток не определены. Если нет подпрограммы обработки такого прерывания, необходимо до операции деления проверить возможность его возникновения. При делении на числа, котоpые являются степенями 2, удобнее пользоваться командой сдвига вправо. ### Команда IDIV ######################################################### ### Производит деление аккумулятора и его расширения на содержимое операнда команды. Деление выполняется над числами, интерпретированными как знаковые. Делимое должно быть в 2 раза длиннее делителя. Байтовые команды делят 16-битовое число, расположенное в аккумуляторе AX, на 8-битный делитель. Частное результата помещается в регистр AL, а остаток в регистр AH. Команда, работающая со словами, делит 32-битовое число, расположенное в регистре DX (старшая часть) и аккумуляторе AX, на 16-битный делитель. Частное результата помещается в регистр AX, а остаток в регистр DX. ### Состояние регистра флажков не определено. ### Форматы команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ IDIV Регистр ¦ t = 101…112 тактов ¦ 1111011 w ¦ +-------------------------+ (пpи байте pегистpа) ¦----------------¦ t = 165…184 такта ¦ 11111 reg ¦ (при слове регистра) +----------------+ 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ IDIV Память ¦ t = (107…118)+ЕА тактов¦ 1111011 w ¦ +-------------------------+ (пpи байте памяти) ¦----------------¦ t = (107…190)+EA тактов¦ mod 111 r/m ¦ (при слове памяти) ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ ### Примечание: Если частное результата превышает разрядность аккумулятора или делитель равен нулю, генерируется прерывание типа 0, а частное и остаток не определены. Если нет подпрограммы обработки такого прерывания, необходимо до операции деления проверить возможность его возникновения. Если результат отрицательный, частное усекается (в направлении нуля), а остаток имеет тот же знак, что и делимое. Например: +---------------------------------------------------+ ¦делимое (AX)¦ делитель ¦частное (AL)¦остаток (AH)¦ +------------+------------+------------+------------¦ ¦ 7 ¦ 2 ¦ 3 ¦ 1 ¦ ¦ 7 ¦ - 2 ¦ - 3 ¦ 1 ¦ ¦ - 7 ¦ 2 ¦ - 3 ¦ - 1 ¦ ¦ - 7 ¦ - 2 ¦ 3 ¦ - 1 ¦ +---------------------------------------------------+ ======================================== = Команды управления циклом ======================================== ### Команды управления циклами - это близкие (NEAR) относительные переходы. Операнд - метка является 8-битным смещением (относительно текущего состояния указателя команд IP), поэтому команды могут выполнить переход только на 127 байт вперед или на 128 байт назад. ### Команда LOOP######################################################### ### Производит декремент регистра CX и, если CX не равен 0, происходит переход к началу цикла. ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ LOOP Метка ¦ t1 = 5 тактов ¦ 11100010 ¦ +-------------------------+ (без перехода) ¦----------------¦ t2 = 17 тактов ¦ dispL ¦ (с переходом) +----------------+ ### Примечание: Команда эквивалентна последовательности DEC и JNZ, но экономит байт памяти и один цикл времени. ### Команды LOOPE / LOOPZ ############################################# ### Производят декремент регистра CX и, если CX не равен 0, а флажок ZF равен 1, происходит переход к началу цикла. Длина команд равна 2 байтам, а время выполнения - 6 тактам (без перехода) и 18 (с переходом). ### Регистр флажков не модифицируется. ### Форматы команд: 7 0 +-------------------------+ +----------------+ ¦ LOOPE Метка ¦ ¦ 11100001 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ LOOPZ Метка ¦ +----------------+ +-------------------------+ ### Команды LOOPNE / LOOPNZ ############################################# ### Производят декремент регистра CX и, если CX не равен 0, а флажок ZF равен 0, происходит переход к началу цикла. Длина команд равна 2 байтам, а время выполнения - 6 тактам (без перехода) и 18 (с переходом). ### Регистр флажков не модифицируется. ### Форматы команд: 7 0 +-------------------------+ +----------------+ ¦ LOOPNE Метка ¦ ¦ 11100000 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ LOOPNZ Метка ¦ +----------------+ +-------------------------+ ======================================== = Команды условных переходов ======================================== ### Команды условного перехода - это близкие (NEAR) относительные переходы. Операнд - метка является 8-битным смещением (относительно текущего состояния указателя команд IP), поэтому команды могут выполнить переход только на 127 байт вперед или на 128 байт назад. ### Время выполнения команд равно 4 тактам синхронизации (если переход не осуществлен) и 16 тактам (если переход произошел). При этом не учитывается время реинициализации очереди команд, которое увеличивает время выполнения на 4 такта. Длина команд равна 2 байтам. ### Переход по результату знакового сравнения ########################### ### Команды осуществляют переход, если выполнено условие сравнения двух чисел, интерпретированных как знаковые. Допустим, арифметические флажки установлены в результате сравнения двух знаковых чисел командой CMP. Тогда переход осуществляется, если: +-----------------------------------------------------------------------+ ¦ мнемоника команд ¦состояние флажков¦ соотношение двух чисел ¦ ¦ условного перехода +-----------------¦ ¦ ¦ ¦ OF ¦ ZF ¦ SF ¦ ¦ +---------------------+-----+-----+-----+-------------------------------¦ ¦ JL / JNGE ¦ 0 ¦ - ¦ 1 ¦ меньше / не больше или равны ¦ ¦ ¦ 1 ¦ - ¦ 0 ¦ ¦ +---------------------+-----+-----+-----+-------------------------------¦ ¦ JNL / JGE ¦ 0 ¦ - ¦ 0 ¦ больше или равны / не меньше ¦ ¦ ¦ 1 ¦ - ¦ 1 ¦ ¦ +---------------------+-----+-----+-----+-------------------------------¦ ¦ JLE / JNG ¦ 0 ¦ 1 ¦ 1 ¦ меньше или равны / не больше ¦ ¦ ¦ 1 ¦ 1 ¦ 0 ¦ ¦ +---------------------+-----+-----+-----+-------------------------------¦ ¦ JNLE / JG ¦ 0 ¦ 0 ¦ 0 ¦ больше / не меньше или равны ¦ ¦ ¦ 1 ¦ 0 ¦ 1 ¦ ¦ +-----------------------------------------------------------------------+ ### Регистр флажков не модифицируется. ### Форматы команд: 7 0 +-------------------------+ +----------------+ ¦ JL Метка ¦ ¦ 01111100 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JNGE Метка ¦ +----------------+ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JLE Метка ¦ ¦ 01111110 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JNG Метка ¦ +----------------+ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JNL Метка ¦ ¦ 01110101 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JGE Метка ¦ +----------------+ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JNLE Метка ¦ ¦ 01111101 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JG Метка ¦ +----------------+ +-------------------------+ ### Переход по результату беззнакового сравнения ######################## ### Команды осуществляют переход, если выполнено условие сравнения двух чисел, интерпретированных как беззнаковые. Допустим, арифметические флажки установлены в результате сравнения двух беззнаковых чисел командой CMP. Тогда переход осуществляется, если: +-----------------------------------------------------------------------+ ¦ мнемоника команд ¦состояние флажков¦ соотношение двух чисел ¦ ¦ условного перехода +-----------------¦ ¦ ¦ ¦ CF ¦ ZF ¦ ¦ +---------------------+--------+--------+-------------------------------¦ ¦ JB / JNAE / ¦ 1 ¦ - ¦ ниже / не выше или равны / ¦ ¦ JC ¦ ¦ ¦ есть перенос ¦ +---------------------+--------+--------+-------------------------------¦ ¦ JBE / JNA ¦ 1 ¦ 0 ¦ ниже или равны / не выше ¦ ¦ ¦ 0 ¦ 1 ¦ ¦ ¦ ¦ 1 ¦ 1 ¦ ¦ +---------------------+--------+--------+-------------------------------¦ ¦ JNB / JAE / ¦ 0 ¦ - ¦ выше или равны / не ниже / ¦ ¦ JNC ¦ ¦ ¦ нет переноса ¦ +---------------------+--------+--------+-------------------------------¦ ¦ JNBE / JA ¦ 0 ¦ 0 ¦ выше / не ниже или равны ¦ +-----------------------------------------------------------------------+ ### Регистр флажков не модифицируется. ### Форматы команд: 7 0 +-------------------------+ +----------------+ ¦ JB Метка ¦ ¦ 01110010 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JNAE Метка ¦ +----------------+ +-------------------------+ +-------------------------+ ¦ JC Метка ¦ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JBE Метка ¦ ¦ 01110110 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JNA Метка ¦ +----------------+ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JNB Метка ¦ ¦ 01110011 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JAE Метка ¦ +----------------+ +-------------------------+ +-------------------------+ ¦ JNC Метка ¦ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JNBE Метка ¦ ¦ 01110111 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JA Метка ¦ +----------------+ +-------------------------+ ### Переход по состоянию отдельных флажков ############################## ### Команды проверяют состояние соответствующего флажка и, в зависимости от равенства его 0 или 1, осуществляют переход. +-------------------------------------------------------------------+ ¦ мнемоника ¦ состояние флажков ¦ комментарий ¦ ¦ команды +-------------------¦ ¦ ¦ ¦ OF ¦ ZF ¦ PF ¦ SF ¦ ¦ +------------+----+----+----+----+----------------------------------¦ ¦ JE / JZ ¦ - ¦ 1 ¦ - ¦ - ¦ равно / нуль ¦ +------------+----+----+----+----+----------------------------------¦ ¦ JP / JPE ¦ - ¦ - ¦ 1 ¦ - ¦ есть паритет / паритет четный ¦ +------------+----+----+----+----+----------------------------------¦ ¦ JO ¦ 1 ¦ - ¦ - ¦ - ¦ есть переполнение ¦ +------------+----+----+----+----+----------------------------------¦ ¦ JS ¦ - ¦ - ¦ - ¦ 1 ¦ есть знак ¦ +------------+----+----+----+----+----------------------------------¦ ¦ JNE / JNZ ¦ - ¦ 0 ¦ - ¦ - ¦ не равно / не нуль ¦ +------------+----+----+----+----+----------------------------------¦ ¦ JNP / JPO ¦ - ¦ - ¦ 0 ¦ - ¦ нет паритета / паритет нечетный ¦ +------------+----+----+----+----+----------------------------------¦ ¦ JNO ¦ 0 ¦ - ¦ - ¦ - ¦ нет переполнения ¦ +------------+----+----+----+----+----------------------------------¦ ¦ JNS ¦ - ¦ - ¦ - ¦ 0 ¦ нет знака ¦ +-------------------------------------------------------------------+ ### Регистр флажков не модифицируется. ### Форматы команд: 7 0 +-------------------------+ +----------------+ ¦ JE Метка ¦ ¦ 01110100 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JZ Метка ¦ +----------------+ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JNE Метка ¦ ¦ 01111000 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JNZ Метка ¦ +----------------+ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JP Метка ¦ ¦ 01110110 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JPE Метка ¦ +----------------+ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JPO Метка ¦ ¦ 01111011 ¦ +-------------------------+ ¦----------------¦ +-------------------------+ ¦ dispL ¦ ¦ JNP Метка ¦ +----------------+ +-------------------------+ 7 0 +-------------------------+ +----------------+ ¦ JO Метка ¦ ¦ 01111010 ¦ +-------------------------+ ¦----------------¦ ¦ dispL ¦ +----------------+ 7 0 +-------------------------+ +----------------+ ¦ JNO Метка ¦ ¦ 01110001 ¦ +-------------------------+ ¦----------------¦ ¦ dispL ¦ +----------------+ 7 0 +-------------------------+ +----------------+ ¦ JS Метка ¦ ¦ 01110000 ¦ +-------------------------+ ¦----------------¦ ¦ dispL ¦ +----------------+ 7 0 +-------------------------+ +----------------+ ¦ JNS Метка ¦ ¦ 01111001 ¦ +-------------------------+ ¦----------------¦ ¦ dispL ¦ +----------------+ ### Команда JCXZ######################################################### ### Осуществляет переход, если регистр СХ равен 0. Используется для обхода цикла в случаях, когда счетчик циклов равен нулю. ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 2 байта +----------------+ ¦ JCXZ Метка ¦ t = 6 тактов (без ¦ 11100001 ¦ +-------------------------+ перехода) ¦----------------¦ t = 18 тактов (с ¦ dispL ¦ переходом) +----------------+ ======================================== = Команды установки флагов ======================================== ### Управляют состоянием отдельных флажков. +---------------------------------------------------------------+ ¦ мнемоника ¦ ф у н к ц и я ¦ ¦ команды ¦ ¦ +------------+--------------------------------------------------¦ ¦ CLC ¦ Cбросить флажок CF в 0 ¦ +------------+--------------------------------------------------¦ ¦ STC ¦ Установить флажок CF в 1 ¦ +------------+--------------------------------------------------¦ ¦ CMC ¦ Инвертировать флажок CF ¦ +------------+--------------------------------------------------¦ ¦ CLD ¦ Сбросить флажок DF в 0 ¦ +------------+--------------------------------------------------¦ ¦ STD ¦ Установить флажок DF в 1 ¦ +------------+--------------------------------------------------¦ ¦ CLI ¦ Сбросить флажок IF в 0 ¦ +------------+--------------------------------------------------¦ ¦ STI ¦ Установить флажок IF в 1 ¦ +---------------------------------------------------------------+ ### Длина команд составляет 1 байт. Время выполнения равно 2 тактам синхронизации. ### Форматы команд: 7 0 +-------------------------+ +----------------+ ¦ CLC ¦ ¦ 11111000 ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ +----------------+ ¦ CMC ¦ ¦ 11110101 ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ +----------------+ ¦ STC ¦ ¦ 11111001 ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ +----------------+ ¦ CLD ¦ ¦ 11111100 ¦ +-------------------------+ +----------------+ Флажок DF устанавливают в 0 для автоинкремента регистров SI и DI в командах обработки строк. 7 0 +-------------------------+ +----------------+ ¦ STD ¦ ¦ 11111101 ¦ +-------------------------+ +----------------+ Флажок DF устанавливают в 1 для автодекремента регистров SI и DI в командах обработки строк. 7 0 +-------------------------+ +----------------+ ¦ CLI ¦ ¦ 11111010 ¦ +-------------------------+ +----------------+ Флажок IF устанавливают в 0 для запрещения восприятия аппаратных прерываний. 7 0 +-------------------------+ +----------------+ ¦ STI ¦ ¦ 11111011 ¦ +-------------------------+ +----------------+ Флажок IF устанавливают в 1 для разрешения восприятия аппаратных прерываний. ======================================== = Специальные команды ======================================== ### Команда HLT############################################################ ### Переводит микропроцессор в состояние останова. Если прерывания были заблокированы, из состояния останова микропроцессор можно вывести только выключением и включением ЭВМ. Если прерывания были разрешены, микропроцессор можно вывести из останова внешним прерыванием. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ HLT ¦ t = 2 и более тактов ¦ 11110100 ¦ +-------------------------+ +----------------+ ### Команда WAIT######################################################### ### Переводит микропроцессор в состояние ожидания. Через каждые 5 тактов синхронизации микропроцессор проверяет наличие сигнала на входе TEST. Если сигнал есть, микропроцессор продолжает работу. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ WAIT ¦ t = 3 и более тактов ¦ 10011011 ¦ +-------------------------+ +----------------+ ### Применяется совместно с командой ESC. ### Команда LOCK######################################################### ### IBM PC не использует аппаратные сигналы для поддержки работы префикса блокировки LOCK, поэтому его описание не дается. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ LOCK ¦ t = 2 такта ¦ 11110000 ¦ +-------------------------+ +----------------+ ### Команда ЕSC############################################################ ### Передает внешнему процессору (сопроцессору) предназначенные ему команды и операнды. Описание не дается. ### Формат команды: 7 0 +-------------------------+ l = 2-4 байта +----------------+ ¦ ESC ¦ t = 8+ЕА тактов ¦ 11011 *** ¦ +-------------------------+ +----------------+ ### Команда NOP############################################################ ### Команда не производит никаких действий. ### Формат команды: +-------------------------+ l = 1 байт +----------------+ ¦ NOP ¦ t = 3 такта ¦ 10010000 ¦ +-------------------------+ +----------------+ ### Примечание: Используется для удаления из программы ненужных байт и в программных циклах задержки. ======================================== = Стековые команды ======================================== ### Команда PUSH ######################################################### ### Включает в стек слово операнда. После выполнения команды производится автоматическое уменьшение указателя стека SP на 2. Если стек организуется из 64К (максимальный размер), то при полном его заполнении каждое следующее включение разрушает ранее записанную информацию. Если стек имеет меньший размер, то при полном его заполнении каждое следующее включение разрушает область памяти, находящуюся вне стекового сегмента. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ PUSH Память ¦ t = 16+ЕА тактов ¦ 11111111 ¦ +-------------------------+ ¦----------------¦ ¦ mod 110 r/m ¦ ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ PUSH Регистр ¦ t = 11 тактов ¦ 01010 reg ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ PUSH СегРегистр ¦ t = 10 тактов ¦ 000 sreg 110 ¦ +-------------------------+ +----------------+ ### Примечание: Некоторые команды (например, CALL) заносят информацию в стек автоматически. С помощью стековых команд можно производить загруку одного сегментного регистра из другого. Например: PUSH CS MOV AX, CS POP DS - эквивалентно - MOV DS, AX (потери в скорости) (потери в размере) ### Команда POP ######################################################### ### Извлекает слово из стека в операнд команды. После выполнения команды производится автоматическое увеличение указателя стека SP на 2. Команде POP должна предшествовать команда PUSH. Извлеченное слово остается в памяти на том же месте и не разрушается до следующего применения команды PUSH. ### Регистр флажков не модифицируется. ### Форматы команды: 7 0 +-------------------------+ l = 3-4 байта +----------------+ ¦ POP Память ¦ t = 17+ЕА тактов ¦ 10001111 ¦ +-------------------------+ ¦----------------¦ ¦ mod 110 r/m ¦ ¦----------------¦ ¦ dispL ¦ +----------------¦ ¦ dispH ¦ +----------------+ 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ POP Регистр ¦ t = 8 тактов ¦ 01011 reg ¦ +-------------------------+ +----------------+ 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ POP СегРегистр ¦ t = 8 тактов ¦ 000 sreg 111 ¦ +-------------------------+ +----------------+ ### Примечание: Некоторые команды (например, RET) извлекают информацию из стека автоматически. С помощью стековых команд можно производить загруку одного сегментного регистра из другого. Например: PUSH CS MOV AX, CS POP DS - эквивалентно - MOV DS, AX (потери в скорости) (потери в размере) ### Команда PUSHF ######################################################### ### Включает в стек регистр флажков. Команда аналогична команде PUSH. ### Регистр флажков не модифицируется. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ PUSHF ¦ t = 10 тактов ¦ 10011100 ¦ +-------------------------+ +----------------+ ### Примечание: Команд прямого воздействия на флажок TF нет. Изменение этого флажка осуществляется включением регистра флажков в стек, модификацией 8-го бита и последующего извлечения. ### Команда POPF ######################################################### ### Извлекает из стека регистр флажков. Команда аналогична команде POP. ### Регистр флажков принимает значение, извлеченное из стека. ### Формат команды: 7 0 +-------------------------+ l = 1 байт +----------------+ ¦ POPF ¦ t = 8 тактов ¦ 10011101 ¦ +-------------------------+ +----------------+ ### Применение и особенности программирования: Команд прямого воздействия на флажок TF нет. Изменение этого флажка осуществляется включением регистра флажков в стек, модификацией 8-го бита и последующего извлечения.