Бройдо В.Л., Ильина О.П. Архитектура ЭВМ и систем (2006) (1186249), страница 81
Текст из файла (страница 81)
Операнды ба1 и вгс должны иметь одинаковый формат (оба или байт или слово) и тип данных: згс — г, гп, й с181— г, пт (невозможно гвецт,! и нельзя, чтобы оба типа были гп или оба гвецпт). Команда А00 формирует флаги АЕ, СЕ, ОЕ, РЕ, ЗЕ и 2Е. О 80В бз1, згс — вычитание двоичных чисел (зпЫгасс — вьгчесть). Вычитает байт или слово, взятое из памяти, регистра или непосредственно из содержимого регистра, или вычитает байт или слово, взятое из регистра или непосредственно из памяти (содержимое вгс вычитается из содержимого ба1). Операнды бз1 и вгс должны иметь одинаковый формат (оба или байт или слово) и могут быть: вгс — г, гп, й бе — г, гп (невозможно гвецгп и нельзя, чтобы оба типа были гп).
Команда 808 формирует флаги АЕ, СЕ, ОЕ, РЕ, ЗЕ и 2Е. О СМР бз1, згс — сравнение (сошраге — сравнить). Сравнивает содержимое двух полей данных; фактически, команда вычитает второй операнд (згс) из первого (бзс), но значение бв1 не изменяет, а лишь формирует флаги. Операнды бм и вгс должны иметь одинаковый формат (оба или байт или слово) и могут быть: згс — г, пт, й бв1 — г, гп (невозможно гаецв, 1 и нельзя, чтобы оба типа были гп или оба гзецгп). Команда СМР формирует флаги: СЕ, ЕЕ при сравнении чисел без знака; СЕ, ОЕ, ЗЕ, ЕЕ при сравнении чисел со знаком; флаги АЕ, РЕ не определены. Команды приращения Команды приращения — одноадресные.
О 1ьгс бз1: инкремент (1 псгетепс — нарастить, увеличить). прибавляет 1 к содержимому бз1. Операнд бвс может быть представлен оператором типа г или ш. Команда 1НС формирует флаги РЕ, АЕ, ЕЕ, ЗЕ, ОЕ. О ОЕС бз1: декремент (десгешепС вЂ” уменьшить). Вычитает 1 из содержимого бв1. Операнд бвс может быть представлен оператором типа г или ш. Команда 0ЕС формируе. флаги РЕ, АЕ, 2Е, ЗЕ, ОЕ.
Команды умножения Команды умножения — одноадресные. Указывается только ЗВС (множитель); ОЗТ (множимое) задается строго определенным образом. Основные команды ассемблера 369 О М0~ згс — умножение (вц1йр!у — умножить). Выполняет умножение беззнакового множимого (8 или 16 бит) на беззнаковый множитель (8 или 16 бит). Команда одноадресная — указывается только ЗВС (множитель); 08Т (множимое) берется строго определенным образом. ЗВС может быть представлен оператором типа г или в (1 — нельзя). Если формат ЗВС вЂ” байт, то множимое (байт) находится в А1., произведение (слово) будет в АХ; если формат ЗйС— слово, то множимое (слово) извлекается из АХ, произведение (двойное слово) помещается в ОХ:АХ (старшие два байта в ОХ, младшие — в АХ).
Команда М01. формирует флаги СЕ, ОЕ; воздействует на флаги АЕ, РЕ, ЗЕ, 2Е (флаги не определены). О 1М01. згс — целое умножение знаковых чисел (всейег вп!йр!у — умножение целых чисел со знаком). Выполняет умножение знакового множимого (8 или 16 бит) на знаковый множитель (8 или 16 бит). Команда одноадресная — указывается только ЗВС (множитель); ОЗТ (множимое) берется строго определенным образом. ЗйС может быть представлен оператором типа г или в (1 не допускается). Если формат ЯВС вЂ” байт, то множимое (байт) извлекается из А~ произведение (слово) будет в АХ; если формат ЗВС вЂ” слово, то множимое (слово) находится в АХ, произведение (двойное слово) заносится в ОХ:АХ (старшие два байта результата в ОХ, младшие — в АХ). Команда 1М01.
формирует флаги СЕ, ОЕ; воздействует на флаги АЕ, РЕ, ЯЕ, 2Е (флаги не определены). Команды деления Команды деленая — одноадресные, указывается только ЯВС (делитель); ОЗТ (делимое) задается строго определенным образом. [2 01Ч згс — деление (ЙчЫе — делить). Выполняет деление беззнакового делимого (16 или 32 бит) на беззнаковый делитель (8 или 16 бит). Команда одно- адресная — указывается только ЗВС (делнтель); ОЗТ (делимое) берется строго определенным образом. ЗйС может быть представлен оператором типа г или в (1 — нельзя).
Если формат ЯВС вЂ” байт, то делимое (слово) находится в АХ, частное от деления (байт) будет в А1., остаток от деления (байт) помещается в АН; если формат ЗВС вЂ” слово, то делимое (двойное слово) заносится в ОХ;АХ (старшие два байта в ОХ, младшие — в АХ), частное от деления (слово) в АХ, остаток от деления (байт) сохраняется в 01. Команда 01Ч формирует флаг 1Е (1Е - 1 при делении на О и при делении большого числа на очень малое, если частное вне диапазона); воздействует на флаги АЕ, СЕ, ОЕ, РЕ, ЗЕ, 2Е (флаги не определены). (з 601ч згс — деление целых чисел со знаком (1пгейег Йч(г)е — деление целых чисел со знаком).
Выполняет деление знакового делимого (16 или 32 бит) на знаковый делитель (8 или 16 бит). Команда одноадресная — указывается только ЗВС (делитель); ОЗТ (делимое) берется строго определенным образом. ЗйС может быть представлен оператором типа г или в (1 — нельзя). Если формат ЗйС вЂ” байт, то делимое (слово) — в АХ, частное от деления (байт) будет в А1., остаток от деления (байт) — в АН; если формат ЗВС вЂ” слово, то делимое (двойное слово) попадает в ОХ:АХ (старшие два байта в ОХ, младшие в АХ), частное от деления (слово) — в АХ, остаток от деления (байт) — в О1 Команда 101Ч формирует флаг 1Е (1Е - 1 при делении на О и при делении боль- 370 Глава 18. Элементы программирования на языке ассемолера шого числа на очень малое, если частное вне диапазона), воздействует на флаги АЕ, СЕ, ОЕ, РЕ, 8Е, ЕЕ (флаги не определены).
Логические команды Это двухадресные команды, они используются для сравнения, сброса и установки битов операнда в операциях преобразования кодов и при выполнении арифметических операции в кодах АЯСП. С3 Ой Пзй згс — логическое сложение (ог — или). Команда выполняет поразрядную дизъюнкцию (логическое сложение — операцию ИЛИ) битов двух операндов; устанавливает 1 в тех битах операнда Пзй в которых была 1 хотя бы у одного из исходных операндов. Операнды оз1 и згс должны иметь одинаковый формат (оба или байт, или слово) и могут быть: згс типа г, п1, 'к пи типа г, т (невозможно гзепт и нельзя, чтобы оба типа были Гп).
Команда Ой сбрасывает ОЕ - О и СЕ - О; формирует РЕ, 8Е, ЕЕ; значение АЕ не определено. й АИО пз1, згс — логическое умножение (апо — и). Команда выполняет поразрядную конъюнкцию (логическое умножение — операцию И) битов двух операндов; устанавливает 1 в тех битах операнда пзй в которых у обоих исходных операндов были 1. Операнды озг и згс должны иметь одинаковый формат (оба или байт или слово) и могут быть: згс типа г, в, д озг типа г, в (невозможно гзецт и нельзя, чтобы оба типа были Гл). Флаги: ОЕ - О и СЕ = О; команда формирует РЕ, 8Е, ЕЕ; значение АЕ не определено.
Команды безусловной передачи управления дМР орг — команда безусловной передачи управления бшпр ппсопйс[опаПу— перейти безусловно). Операнд орг может быть задан прямым или косвенным адресом. 0 По прямому адресу: дМР метка. 0 Если метка в том же сегменте, что и команда дМР, переход считается внутренним (пеаг), если не в том же сегменте — переход внешний (1аг). В написании самой команды дМР разницы нет; тип перехода определяется видом метки: после метки для внутреннего перехода ставится двоеточие «нп Транслятор по таблице меток и их адресов сам определяет атрибуты пеаг или [аг и соответственно транслирует команду передачи управления в более короткую или более длинную команду (более длинную, так как надо менять не только содержимое смешения [Р, но и регистра сегментов С8).
Несколько сократить длину команды может указание программиста «]МР зпогс метка» о том, что метка не далее +128 байтов от первого байта команды дМР (это указание не обязательно, но если оно есть и ошибочно, то транслятор выдаст ошибку). С] По косвенному адресу. Косвенный адрес может быть задан в регистре — ]МР в или в памяти — 1МР символьное имя. С) В памяти с косвенной адресацией: дМР пеаг р1г [8!];,3МР 1аг р1г [ВХ] и т. д. В последних двух командах пеаг р1г и 1аг р1г указывать обязательно, так как какое слово содержится в регистре 8[ — обычное или двойное, — ассемблер заранее не знает, и ему нужно помочь. Основные команды ассемблера эи Команды перехода к подпрограмме и выхода из подпрограммы Подпрограммы оформляются как процедуры.
Процедура начинается меткой— именем процедуры и заканчивается командой выхода ге1 (гегпгп). В программе процедура помещается в операторные скобки: ргос ... епбр Около оператора ргос могут быть указаны атрибуты дистанции: пеаг — близкая процедура (в том же сегменте) или гаг — дальний вызов (если этот атрибут опущен, то подразумевается пеаг). Пример: О!8Р ргос 1аг; в отличие от метки после имени процедуры двоеточие не ставится: ге1 015Р епбр Команда перехода к подпрограмме: СНЕ орг Вызов процедуры (са1! а ргоседпге — вызов процедуры), безусловная передача управления, выполняющая короткий или дальний вызов процедуры.
Флаги не меняются. В команде САЫ. атрибуты пеаг или 1аг указывать не надо, так как ассемблер нужную информацию получит сам из директивы определения процедуры. По команде САЕЕ должны быть выполнены: С! запоминание в стеке адреса возврата (содержимого !Р и С8 для следующей команды: 16 бит, если пваг, и 32 бит, если гаг); О переход к выполнению процедуры (инициируется записью в !Р и в С8 (если 1аг) нового адреса команды).
Операнд орг, определяющий адрес процедуры, бывает: З непосредственным: СА!.!. имя процедуры; 0 прямым — процедуру с атрибутом пеаг можно вызвать через регистр, в котором содержится смещение адреса процедуры: СА~~ г; О косвенным: О процедура с атрибутом пеаг вызывается, используя переменную размером в слово: САВЕ кгогб р1г символьное имя, О процедура с атрибутом 1аг вызывется, используя переменную размером в двойное слово: САВЕ Пкгогб р1г символьное имя.
Команда выхода из подпрограммы йЕТ вЂ” возврат из процедуры (гегпгп !гол ргоседпге). Команда извлекает из стека адрес возврата и возвращает управление из процедуры, вызванной ранее командой САВЕ Необязательный числовой параметр команды йЕТ указывает количество байтов, которые освобождаются в стеке после извлечения адреса возврата. Если процедура имеет атрибут пеаг, то команда йЕТ извлекает из стека одно слово и заносит его в регистр !Р; если процедура имеет атрибут 1аг, то команда йЕТ Зтг Глава 18. Элементы программирования иа языке ассемблера извлекает из стека два слова: сначала смещение адреса, а затем адрес сегмента— и заносит их, соответственно, в регистр !Р и в регистр СЗ.