Бройдо В.Л. Вычислительные системы, сети и телекоммуникации (2002) (1186248), страница 69
Текст из файла (страница 69)
Команда передает управление по прямому адресу — метке, если условие, указанное в команле, выполняется; в противном случае выполняется следующая по порядку команла. Выполнение условия определяется состояниями флагов регистра ГС, которые установлены по результатам прелылущих формирующих условие перехода операций; арифметических, логических, сравнения и т. л.
Команды условной передачи управления могут быть знаковыми (условие проверяется с учетом знака операндов) и беззнаковыми (условие проверяется по абсолютным значениям операндов). Каким типом УПУ пользоваться, определяется по содержанию решаемой задачи и, соответственно, типами данных (знаковых или 294 Глава9. П ограммновуп авление — основаавтоматизации беззнаковых), над которыми выполнялись операции, формирующие условие перехода.
Надо четко различаться* без знака (если сравниваются целые, без знака) и сознаком (если сравниваются целые со знаком), иначе результат будет совсем не тем (неверным). Например, пусть регистр АХ содержит 11000110, а регистр ВХ вЂ” 00010110, и команда СМР АХ, ВХ сравнивает содержимое этих регистров. Если данные беззнаковые, то число в АХ больше, а если знаковые — то меньше (поскольку в последнем случае единица в крайнем левом разряде определяет знак числа — в АХ число отрицательное).
Команды условной передачи управления для беззнаковых данных О ВАЕЛВЕ (!шпр 1( АЬотс/Хог Ве1ои пог Епиа1) — переход, если выше/не ниже или равно (переход, если флаги ХР = 0 и СГ = О). О ВАеглВ (!ишр 1(Аьоте ог ес!иа1/хот Ве1ош) — переход, если выше или равно/не ниже (СГ - О). О ЗВ/ЛАЕ (!ишр 1Е Ве1ош/Хог АЬоте пог Ециа1) — переход, если ниже/не выше или равно (СГ = 1) О ЗВЕАЛА (!ишр й Ве!очг ог Ес1иа1/Хог АЬоче) — переход, если ниже или равно/не выше (СР = 1 илн АГ - 1). Команды условной передачи управления для знаковых данных О )ЫЛЕЕ (!ишр 11 Сгеасег/Хог Ьезз пог Ейиа1) — переход, если больше/не меньше илп равно (ХР - 0 и ЯГ - ОГ).
О ~ВЕ! ЛЕ ( !ипр 1( Сгеатег ог Ег1иа1/Хот 1.езз) — переход, если больше или равно/ не меньше (БР - ОГ). О ВЕРЛЕНЕ ((ишр Ы Ьезз/Хот Сгеагег пог Епиа1) — переход, если меньше/не больше или равно (ЯГ><ОР). О,)ееиий ()шпр 11 ьезз ог ег1иа1/хот сгеатег) — переход, если меньше или равно/ не больше (7Г=1 или ЯР><ОР). Команды условной передачи управления для прочих проверок О,)ЕА)Е ( !шпр Ы Евана!/Лего) — переход, если равно/нуль (ХГ = 1). О ЛЕММЕ ( !ишр1(Хог Ециа1/Хог Лего) — переход, если не равно/не нуль (ХГ - О). О,)5 ()ишр 1!В!пп) — переход, если есть знак (отрицательно) (ЗР - 1). О Л5 ( !шпр 1!Хит Яяп) — переход, если нет знака (положительно) (ЯГ - О). О зб () ишр 11Саггу) — переход, если есть перенос (аналог !В) (СР = 1).
О ЛС Цшпр КХог Саггу) — переход, если нет переноса (аналог )ХВ) (СГ О). О 00(!шпр 110чегйои) — переход, если есть переполнение(ОГ - 1). О ЛО ( !ишр 1(Хо( Отегйочг) — переход, если нет переполнения (ОГ - О). а,!РА!Ре ((ишр ы Рагйу/Рапгу ечеп) — переход, если есть четность (РР = 1). ЛРГВРС (!ишр !! Хо Рапгу/Рагйу ОгЫ) — переход, если нет четности (РР - О), О,)ЕХЕ (Яишр 11 СХ й Хего) — переход если содержимое регистра СХ равно 0 (СХ - О). 295 Элементы программирования на языке ассемблер Команды управления циклами Используются для повторения цикла известное число раз.
Количество повторений предварительно записывается в регистр СХ (счетчик циклов). Каждый цикл автоматически уменьшает показание СХ на 1. Основная команда: ОООР иетка. Цикл (1оор нпс11 соопс соер1 ете — повторять до обнуления сх), команда уменьшает значение в регистре СХ на единицу и передает управление по прямому адресу — метке, если значение в регистре СХ не равно нулю; в противном случае выполняется следующая по порядку команда. Флаги не меняет. Существуют еше четыре альтернативные команды, в которых можно поставить дополнительные условия.
Передачи управления командами типа 1оор только ближние и короткие (метки пеаг и зПогг). Команды прерывания У команд прерывания есть некоторая аналогия с командами вызова процедуры САТЛ.: прекращается выполнение текущей программы и осуществляется переход к подпрограмме обработки прерывания; но при прерываниях нет деления на процедуры пеаг или Таг, так как начальный адрес подпрограммы обработки прерывания (вектор прерывания) берется из таблицы векторов ОЗУ всегда 32-битовым; кроме того, при вызове процедуры в стеке сохраняется только адрес возврата, а при прерывании еше и флаги. Имеются три команды прерывания. 1З 1лТ орг: Прерывание (1птеггнрг — прервать).
Прерывает выполнение программы и передает управление по одному из 256 адресов (векторов прерывания), определяемых номером прерывания — орг. По этой команде микропроцессор: ° помещает в стек содержимое регистров: г 1. (флагов), СЯ (сегмента команд), 1Р (указателя команд); ° обнуляет флаги Тг и 1Е (флаги системного прерывания и блокировки прерывания); ° загружает в С5 и 1Р соответственно второе и первое слова вектора прерываний, считанного из таблицы векторов в ОЗУ по адресу 4'орг (4'номер прерывания); вся таблица векторов занимает 1024 байт, то есть всего может быть 256 различных векторов прерывания. Например, команда 1НТ 1аП считает из ОЗУ вектор, находящийся по адресу 68П=4*1аП, то есть в регистр СЯ булет загружен адрес сегмента 6аП, а в регистр 1Р— смещение 68П программы обработки этого прерывания.
Команда устанавливает флаги 1г = 0 и Тг = О. О 11110 — прерывание по переполнению (1пгеггнрг Ц очегйоач — прервать при переполнении). Глава 9. Программное уп веление — основа автоматизации Прерывает выполнение программы при возникновении переполнения (флаг ОР = 1) и передает управление по адресу 10Н (аналог команды 1НТ 4). Команда устанавливает флаги 1Р - 0 и ТР - О. О [НЕТ вЂ” возврат из обработки прерывания ([п[еггцрт ге[пгп — возврат после прерывания).
Обеспечивает возврат из программы обработки прерывания. ИЕТ— последняя команда подпрограммы обработки прерывания, по этой команде из стека извлекаются три последних слова и загружаются в регистры 1Р, СЯ и Р1., при этом содержимое БР увеличивается на 6. Команла устанавливает значения всех флагов. Основные директивы ассемблера Напомним, что директивы (псевдооператоры) — вто инструкции ассемблеру, то есть они выполняются только при ассемблировании (транслировании) программы.
Приведем некоторые из часто используемых директив. Директивы определения идентиФикаторов Присваивают идентификатору с данным именем некоторое текстовое или числовое значение (выражение). Формат директив: иня ЕРЬ теист иия = числовое значение [внраиение) Разница между псевдооператорами ЕОР и =: ЕОР— присваивает значение постоянно (изменять нельзя), текст может быть символьным, числовым или смешанным выражением, определяющим константу, адрес, другое символьное имя, метку и т, дх О = — выполняет текущее присвоение (значение может быть переприсвоено, ио только при трансляции, естественно); присваивает только числовое выражение, содержащее простые математические преобразования, которые при трансляции и будут выполнены (например, сола[+1, 15Н*4, 3*12/4 и т, д.).
Директивы определения данных Используются для идентификации переменных и полей памяти. Формат директивы [иия] О* внраиение [.внраиение) [. ..] Р* может быть: О РВ (с)етт' ле ьуте) — опрелелить байт (1 байт); О РН [т)е[т ле ног[)) — определить слово (2 байт); О 00 (т)е[т пе с)ятогт)) — определить двойное слово (4 байт); О 00(т)егтле В Ьу[е) — определить 8 байт; О РТ (т)еТтпе 10 Ьуге) — определить 10 байт. Рассматриваемые директивы определяют переменную (иия) или присваивают тюлям (ячейкам) памяти начальные значения; резервируют в памяти один или несколько байт — РВ, слов — РН, двойных слов — 00 и т.
д. (с более поздним присвоением значения). 297 Элементы программирования на языке ассемблер Выражение показывает, какое количество элементов памяти необходимо выделить н какие данные там должны содержаться. Выражение может быть: О константой: сопя( 08 56: сопят ОИ 1936 сопвь 00 ЗЕМАН. Обязательно следует учитывать лиапаэон и вместимость байта, слова и т.
дб так, для 08 константа не может быть больше 255, для ОИ вЂ” 65535, для 00 — (65535)" 2-4294836225; (3 вектором или таблицей: ьаЫе1 08 30,4,-15.0.0.0.56: гаЫе2 ОИ 1936,3004.56,15. В одном псевдооператоре можно поместить строку до 132 позиций, причем вместо повторения одного и того же значения несколько раз (О в гаЫе1) можно использовать псе вдооператор 008 (г!цр! !саге — дублировать): гаЫ е1 08 30,4. -15, 3 бор(0) .
56); (3 строкойснмволов: всг1 08 'Вн ввели слишкои большое число': впг2 08 'Ваб соптпапб'; в псевдооператоре 08 строка может содержать 255 символов, во всех остальных (ОИ, 00, 00. О?) — только два символа. ья пустым полем ро)е1 08?: ро) е2 ОИ 12 бор(?), при этом в элементы резервируемой памяти ничего не записывается (записывается не О, как, например, в директиве ро) еЗ ОИ 5 бор(б), а просто резервируются ячейки памяти); (3 символическим именем переменной: чьг1 ОИ б15р; чаг2 00 чесЛог (одна переменная опрелеляется адресом другой, в директивах указывать о1(зеь не надо, ибо нмя переменной воспринимается как ее адрес).
Такой вариант может использоваться, например, для хранения адресов ячеек памяти, меток, на которые можно ссылаться в программе (чвг1 ОИ б15р), причем если переменная находится в том же сегменте, что и ссылаюшаяся команда, то достаточно в качестве адреса указать только смешение (2 байт), то есть обойтись ОИ; если же переменная находится в лругом сегменте, то необходимо указать и сегмент, и смешение (всего 4 байт), то есть следует использовать уже 00 (чаг2 00 чеспог); (З простым выражением: тп1 08 80*3; Гп2 ОИ (б)вр)+256, вычисляемым, естественно, только при трансляции программы. Директивы определения сегментов и процедур Сегмент определяется псевдооператорамн: иия сег яедшеп( иия сег епбя В программе можно использовать четыре сегмента (по числу сегментных регистров) н для кажлого указать соответствуюший регистр сегмента псевдооператором Я550МЕ (азяшпе — присвоить), например: собеяед яебиепг аяяиие С5 собвяед, 05:батаяед, 55 ятасяяец собеяед епбв ВднрективеАвяоше регистр сег:иия сег (...), в частностилвьоше сгнсобевед,указывается, что для сегмента иия сег (сог!езе8) выбран регистр регистр сег (С5).