В.Н. Пильщиков - Программирование на языке ассемблера IBM PC (1110551), страница 17
Текст из файла (страница 17)
Загрузка флагов в регастр ЬВ (1оаб ЬВ Тгсаа Р1адв) г ГЬВР чтеюзе флагов вз регистра ьи (заче ьи зато У1аде): вану Коыаида (.АНЕ записывает в регистр АН правую половину реп(стра флагов Р)адз, а команда ЗАНР записывает содержимое АН в правую половину регистра НаИв. Зти команды введены для совместимости с процессором 8080 (прсдшсствснником пропсссора 8086) и практически нс используются. Очистка флага иереаоса (с1еак сакку Т1ад)г СЬС Установка фгага иаревоса (зеч саггу Тзад)г ВТС Взиевеаие флага леревоса (совр1езюак саггу Т1ад): СИС По команде С1 С флаг СР обнуляется (СЕ:в0), по команде 8ТС флаг СР пачучает значение 1 (СР:и1), а по команде СМС значение флага СГ ыснястся на противоположное (СР;в1-СР). Остальные флаги нс меняются.
Зти команды могут использоваться перед командами циклического сдвига КС1. и КСК для установки нужного значения флага СГ перед сдвигом. Кроме того, поскольку с помощью этих команд значение флага СР можно менять достаточно просто, то флаг СР иногда используется для фиксации того, выполнено или нет некоторое условие; наприыср, процедура может этим флагом сообщить, успешно она проработала или нет. Очистка флага лреразааиа (с1еаг звсеггсра Т1ад)з СЬГ Устааовка флага лреразавил (еек ьзаеггерк Й1ад): втх По команде СЫ флаг 1Р обнуляется (1Г:вО), а по команде 8'П флаг получает значение 1 (1Р:в1). Установка флага 1Г в 1 означает, что процессору разрешено рсапгровать на поступающие к нему прерывания, а при значении 0 процессор нс будет раап(ровать на прерывания (кромс прерываний из-за ошибок в работе аппаратуры).
Эти команды обычно используются в процедурах операционной системы, занимающихся обработкой прерываний (при обработке одного прерывания приходится игнорировать другис прерывания). ЬЬО вгч т моч а(в11 ьп 1ИС Вт ЬООР ОЧ ИОЧ В,ЬВ ;ЬХ язовчаое число из цифр ЬВ а Ьм ) делеавез ли=остаток, ЬХ =велолаое частвоа ;зались иелолвого часюзого в Х Дополнительные воэможности 267 Преривваие нри перенолвевве (звсеггнрс 12 очегя1ом)т 1НТО Если перед этой командой флаг переполнения ОР оказался равным 1, то она вырабатывает прерывание с номероы 4 (работает как команда )й)Т 4). В ПК при выполнении сложения н вычитания знаковых чисел возможно переполнение мантиссы (ее абсолютная величина превышает допустимый разыер и "залезает" на знаковый бит, изыеняя его на противоположный), при котором получается неправильный результат.
Однако процессор не фиксирует в этоы случае ошибку, а лишь засылает 1 в флаг ОР. "Поймать" такую ошибку можно командой условного перехода, а можно и с поыошью команды Е~1ТО. Она ставится сразу же за арифметической коыандой, например: авв ах,т ХВТО и при переполнении мантиссы (при ОРо1) вырабатывает прерывание с номером 4, которое можно обработать по-своеыу, если в 4-й элемент вектора прерываний (по адресу 0000:0010Ь) заранее записать начальный адрес процедуры обработки этого прерывания. (При начальной загрузке вектора прерываний в этот элемент записывается адрес некоторой ячейки, содержащей команду 1ВЕТ, т. е. по умолчанию нет никакой реакции на это прерывание.) "пустая" коивввв (но орегве1ов)т нор Коианда ХОР ничего не делает.
Эта однобайтовая команда обычно используется для того, чтобы "забить" команды, ставшие ненужныыи, не сдвигая при этом остальные команды программы, либо длв того, чтобы сначала зашпь место в програыие, в которое затем будут занесены "настоящие" коыанды. остапов (Ьв).е): пьт По этой команде процессор приостанавливает свою работу и ждет поступления любого прерывания.
В этот моыент регистры СЗ и 1Р указывают на следующую за Н1.Т коыанду. При возникновении прерывания, как обычно, в стек записывается содержимое этих регистров и управление передается в операционную систему на состветствуюшую процедуру обработки прерывания. По завершении ее рабаты в регистрах СЗ и 1Р будет восстановлен адрес команды, следующей за Н1.Т. С этой следующей команды и возобновится выполнение приостановленной програымы. Команда Н(.Т используется, когда процессору нечего делать и он ожидает, например, нажатия какой-нибудь клавишы на клавиатуре. Ввогировга вава (1оси Еье Ьнв): ЬОСК Эта команда блокирует передачу какой-либо информации по линиям связи, пока не будет полностью завершено выполнение следующей за ней команды (перед которой л(ожет находиться префикс повторения или префикс сегментного реп(стра).
"ДИАЛОГ.МИФИ" 266 Прогрвммироевние нв языке ассемблере lеы рС Команда 1.ОСК нужна для реализации многозадачного режима работы ПК, когда одновременно выполняется несколько программ. Она используется, чтобы запретить другим программам прерывать текущую программу в тот момент, когда та выполняет сложную операцию (типа пересылки строки из одного места памяти в другое), чтобы другие программы не могли в "середине" такой операции испортить ее операнды. Пврекявчвяив яв сопроцессор (ввеарв)л КЯС ор1,ор2 По этой команде посылается сипюл арифметическому сопроцессору (8087, 80287 и т. и.), чтобы он выполнил одну из своих операций: ор1 задает код этой операции, а ор2 указывает местоположение ее операнда. После этого сопроцессор начинает выполнять закаюнную операцию, а центральный процессор, не дожидаясь ее окончания, переходит к выполнению команды, следующей за ЕБС.
Отметим, что в ЯА предусмотрены специальные мнемокоды для разных вариантов комыщы ЕЗС (например, мнемокод гАРП, если нужно выполнить сложение вещественных чисел), поэтому в программах на ЯА в явном виде команда ЕБС обычно не указывается. Поскольку сопроцессор работает медленнее центрального процессора (наполняемые сопроцессором операции на вещественными числаыи требуют значительного времени), то для согласованной (синхронной) работы центральный процессор в общем-то должен приостанавливать свою работу, пока сопроцессор не закончит операцию.
Для этого центральный процессор должен использовать следующую команду: переход в ооотояавв окядввяял их1т По этой команде центральный процессор прекращает свою рабозу и ожидает, пока сопроцессор не пришлет сигнал об окончании выполнения заказанной ему операции. 142. Дополнительные операторы. В агом разделе вкратце описываются те операторы ЯА, которые не были рассмотрены в предыдущих главах книги. <коаотватаов вярвкваяв> вня <коаствятяов вирвкваив> <коаетввтаов вврвквяяв> ВВЬ <кояотватяов вмрвкваяв> Это операторы сдвига, они относятся к констаитныл» выражениям. Оператор ЗНК (ЗНЦ сдвигает значение своего первого операнда, трактуемое как шкала из 1б битов, вправо (влево) на число разрядов, равное значению второго операнда, которое должно быть неотрицательным целым. Биты, сдвигаемые за пределы шкалы, теряются. Примеры: Дополнительные еозыо нное ти 209 ;МОР СХ,101100Ь )АМО ЗВ,101Ъ ;оэавяа (2-й операнд - 160Ь - ае байт) Операторы ЗНК и ЗН1.
обычно используются лля построения одних масок по другим при работе с упакованными данныыи, записями. Действие этих операторов совпадает с действием одноименных коьащд ПК, одмако не надо путать их: операторы вычисляются на этапе трансляции программы и в машинной программе их уже нет, а команды выполняются на этапе счета программы. ЬВМСРВ <имя перемеяяой> Этот оператор относится к константным выражениям. Его операнд должен быль именем переменной, описанной в директиве ОВ, ПЧЧ, 1)1) или директиве, определяющей структуру или запись. Значение оператора - коэффициент кратности в конструкции ЮЩ если она является первым операндом этой директивы, и 1 во всех остальных случаях.
Примеры: А ОВ 100 ООР(2) В ОИ 100 ООР (1тз ОВР(0) ) С ОО 20,30,66 ООР(0) О ОВ 'евой' Оператор 1 с(нОТН имеет смысл, только если в директиве, описывающей имя переменной, указан один операнд и им является конструкция вида )г 1)АР(х); в этоы случае оператор сообщает количество (1() элементов, описаннмх по этой директиве. В остальных случаях сыысл оператора малопонятен. 3122 <амя перемеаэой> И этот оператор относится к константныьг выражемиям, а его операнд должен быть таким же, как и в операторе (.ЕХОТН.
Значение оператора ЯКЕ вычисчяется по следующей формуле: ахгв ч = (тхвв ч) * (ьгнетв ч) Оператор 31ЕЕ имеет смысл, только если в директиве, описывающей нмя переменной, указан один операнд и им является конструкция вида 1г ОУР(х); в этом случае оператор указывает количество байтов, занятых всеми элементами, описанных по этой директиве. В остальных случаях оператор мало о чем говорит. РХРВ <амя> Это константный оператор, его операндоы может быть любое имя. Значением оператора является число разыером в байт, биты которого указывают следующие днлпог-мнии" Н 200 1ОНЬ МОЧ СХ,М ВВЬ 2 ВМО ВВ,М ВВВ 1 ов ам,н внь 5 )ьвнегв а 1ое )Ьвмегв В 100 ;ьгнатв с ;ЬВМСРВ О - 1 270 Прогреммироввние нв воине ассемблере ГВМ РС характеристики имени (нумерация битов ведется справа налево от 0 до 7, значе- ние 1 у бита означает наличие характеристики): номер бима эараднэрнснгнна иьш описано как метка или имя процедуры имя описано кюс переменная или описано (так или иначе) в программе юш описано (в ЕХТК)ч) квк внешнее тнгв <тлл> Этот оператор относится к адресным выражениям.
Его значение - адрес, который равен текущему значению счетчика размещения (3) и которому предписывается указанный тип. (В качестве операзда могут использоваться служебные слова ВУТЕ, ЪУОКТЗ, ьэФОКО, ХЕАК, РАК или соответствующие им числовые значения). Оператор ТН13 обычно используется в директиве Е(2() лля поро:кдения имени, адресующего текущую точку программы и имеющую заданный тип (в подобных целях используется и директива ЬАВЕЬ - см. разд. 14.6). Например: ЗХ а В ссвлввтсл ав одна а тот ле мвссав, ао а - мвссяз яз слов, в В - аз байтов зь1 я Ь2 метлт одну л ту кв команду, ао Ь1 - двлзаял метка, в Ь2 - влазквя а впв тиха вовд В ВВ 20 ВВР (Г) щ впв тньа уьи Ьзэ МОЧ аХ,О В1СИ <колстватаов варвкеале> ЬОИ <колстватаое зарвкеаяв> Это константные операторы.
Нх результат - старший (левмй) байт (для Н10Н) или ьшадший байт (для ЬОУн) значения операнда. Например: Х ВПЧ 12ЗЭЬ моч сь,нхан х;вкзазвлеатао иоч сь,12ь МОЧ СЬ,ЬОИ Х ;вквлзвлеатао ИОЧ СЬ,З4Ь (остальные биты равны О). Лля имен регистров, констант, сегментов, групп, ыакросов, типов записей и структур, полей 'записей и структур оператор выдает значение 20й.