ЯП. 1. Регистры общего назначения (рон) процессора. Назначение и использование. Специальное назначение регистров
Скачать 0.61 Mb.
|
SHRD SHRD <приемник>, <источник>, <количество_сдвигов> - сдвиг двойной точности вправо. Команда сдвигает операнд приемник вправо на число битов, указанных третьим операндом. Операнд источник обеспечивает биты, которые вдвигаются в приемник слева (начиная со старшего бита приемника). Меняет флаги: CF, OF, SF, ZF, PF, AF. CF заполняется последним битов, сдвинутым из приемника. 10. Команды работы с двоично-десятичными числами (AAA, DAA, AAS, DAS, AAD, AAM). Назначение, принцип работы. AAA AAA – ASCII-коррекция регистра AX после сложения. Команда ААА используется вслед за операцией сложения ADD в регистре AL двух неупакованных двоично-десятичных (BCD) чисел, если в АХ находится двухразрядное неупакованное двоично-десятичное число. Команда не имеет параметров. Она преобразует результат сложения в неупакованное двоично-десятичное число, младший десятичный разряд которого находится в AL. Если результат превышает 9, выполняется инкремент содержимого регистра АН. Команда воздействует на флаги AF и CF. (НеупакованныйBCD-формат. Для каждой десятичной цифры отводится один байт. Значение байта равно значению его младшей тетрады (четырех бит). Для обозначения знака применяются неиспользованные тетрады. Упакованный формат - В каждом байте записаны две десятичные цифры. Число состоит из 20 цифр и занимает 10 байт. Число определяется с помощью директивы DT) AAD AAD – ASCII-коррекция регистра AX перед делением. Команда AAD используется перед операцией деления неупакованного двоично-десятичного (BCD) числа в регистре АХ на другое неупакованное двоично-десятичное число. Команда не имеет параметров. Она преобразует делимое в регистре АХ в двоичное число без знака, чтобы в результате деления получились правильные неупакованные двоично-десятичные числа (частное в AL, остаток в АН). Команда воздействует на флаги SF, ZF и PF. AAM AAM – ASCII-коррекция регистра АХ после умножения. Команда AAM используется вслед за операцией умножения двух неупакованных двоично-десятичных чисел. Команда не имеет параметров. Она преобразует результат умножения, являющийся двоичным числом, в правильное неупакованное двоично-десятичное (BCD) число, младший разряд которого помещается в AL, а старший - в АН. Команда воздействует на флаги SF, ZF и PF. AAS AAS – ASCII-коррекция регистра AL после вычитания. Команда AAS используется вслед за операцией вычитания одного неупакованного двоично-десятичного числа (BCD) из другого в AL. Команда не имеет параметров. Она преобразует результат вычитания в неупакованное двоично-десятичное число. Если результат вычитания оказывается меньше 0, выполняется декремент содержимого регистра АН. Команда воздействует на флаги AF и CF; после ее выполнения AF=1, CF=1. DAS DAS – десятичная коррекция в регистре AL после вычитания. Команда DAS корректирует результат вычитания в регистре AL двух упакованных двоично-десятичных (BCD) чисел (по одной цифре в каждом полубайте), чтобы получить пару правильных упакованных десятичных цифр. Команда используется вслед за операцией вычитания упакованных двоично-десятичных чисел. Если для вычитания требовался заем, устанавливается флаг CF. Команда воздействует на флаги SF, ZF, AF, PF и CF. DAA DAA – десятичная коррекция в регистре AL после сложения. Команда DAA корректирует результат сложения в регистре AL двух упакованных двоично-десятичных (BCD) чисел (по одной цифре в каждом полубайте), чтобы получить пару правильных упакованных двоично-десятичных цифр. Команда используется вслед за операцией сложения упакованных двоично-десятичных чисел. Если результат сложения превышает 99, возникает перенос и устанавливается флаг CF. Команда воздействует на флаги SF, ZF, AF, PF и CF. 11. Команды работы с битами (BT, BTS, BTC, BTR, BSF, BSR). Назначение, устанавливаемые флаги. BT BT <источник>, <индекс> - проверка бита. Номер проверяемого бита операнда источник задается операндом индекс. Команда копирует значение бита во флаг CF. (Команда BT копирует значение проверяемого бита во флаг CF) Влияет на флаги: OF, SF, ZF, AF, PF, CF. BTS BTS <источник>, <индекс> - проверка и установка бита. Номер проверяемого бита операнда источник задается операндом индекс. Команда копирует значение бита во флаг CF и затем устанавливает его в 1. Влияет на флаги: OF, SF, ZF, AF, PF, CF. BTC BTC <источник>, <индекс> - проверка и инверсия бита. Номер проверяемого бита операнда источник задается операндом индекс. Команда копирует значение бита во флаг CF и затем инвертирует его. Влияет на флаги: OF, SF, ZF, AF, PF, CF. BTR BTR <источник>, <индекс> - проверка и сброс бита. Номер проверяемого бита операнда источник задается операндом индекс. Команда копирует значение бита во флаг CF и затем сбрасывает его. Влияет на флаги: OF, SF, ZF, AF, PF, CF. BSF BSF <результат>, <источник> - прямое сканирование битов. Команда осуществляет просмотр битов операнда источник, начиная с младшего. Номер позиции первого единичного бита записывается в регистр результат, флаг ZF устанавливается в 0. Если единичных битов нет, то флаг ZF устанавливается в 1, а регистр результат оказывается неопределенным. Влияет на флаги: OF, SF, ZF, AF, PF, CF. BSR BSR <результат>, <источник> - обратное сканирование битов. Команда осуществляет просмотр битов операнда источник, начиная со старшего. Номер позиции первого единичного бита записывается в регистр результат, флаг ZF устанавливается в 0. Номер позиции считается, начиная с младшего бита. Если единичных битов нет, то флаг ZF устанавливается в 1, а регистр результат оказывается неопределенным. Влияет на флаги: OF, SF, ZF, AF, PF, CF. 12. Команды переходов. Условный (Jcc) и безусловный (JMP) переход. Ограничение на дальность перехода. Короткий, близкий и дальний переход. Косвенный переход. Безусловные переходы Безусловный переход – переход, который выполняется всегда. Безусловный переход осуществляется с помощью команды JMP. У этой команды один операнд, который может быть непосредственным адресом (меткой), регистром или ячейкой памяти, содержащей адрес. jmp metka ;Переход на метку jmp bx ;Переход по адресу в BX jmp word[bx] ;Переход по адресу, содержащемуся в памяти по адресу в BX Условные переходы Условный переход осуществляется, если выполняется определенное условие, заданное флагами процессора. Если условие не выполняется, что управление переходит к следующей команде. Существует много команд для различных условных переходов. Косвенный переход – используется, когда адрес перехода известен только во время исполнения. В этом случае в команде перехода указывается не адрес перехода, а место, где он находится. Адрес может находиться в регистре общего назначения или занимать слово памяти. Полученный адрес рассматривается как “настоящий”, а не отсчитанный от команды перехода. Существует пять разновидностей команды JMP, переход может быть: - прямым коротким (в пределах -128…+ 127 байт) - прямым ближним (в пределах текущего сегмента команд) - прямым дальним (в другой сегмент команд) - косвенным ближним (в пределах текущего сегмента команд через ячейку с адресом перехода) - косвенным дальним (в другой сегмент команд через ячейку с адресом перехода) Прямой короткий переход – переход, в команде которого в явной форме указывается метка, на которую нужно перейти. Разумеется, метка должна присутствовать в том же программном сегменте, при этом помеченная ею команда может находиться как до, как и после команды JMP. Достоинство команды короткого перехода заключается в том, что она занимает лишь 2 байт памяти: в первом байте записывается код операции, во втором - смещение к точке перехода. Расстояние до точки перехода отсчитывается от очередной команды, т.е. команды, следующей за командой jmp. Поскольку требуется обеспечить переход как вперед, так и назад, смещение рассматривается, как число со знаком и, следовательно, переход может быть осуществлен максимум на 127 байт вперед или 128 байт назад. Пример: code segment … jmp short go go: … code ends Прямой ближний переход – внутрисегментный переход. Отличается от предыдущего только тем, что на смещение к точке перехода отводится целое слово. Это дает возможность перехода в любую точку 64-кбайтного сегмента. Пример: code segment … jmp go … go: … code ends Косвенный ближний переход. Адрес перехода не указывается явным образом в виде метки, а содержится либо в ячейке памяти, либо в одном из регистров. Это позволяет при необходимости модифицировать адрес перехода и осуществлять переход по известному абсолютному адресу. DS – указывает через какой сегментный регистр надо обращаться к ячейке. Пример: code segment … jmp DS:go_addr … go: ; Точка перехода … code ends data segment … go_addr dw go ;Адрес перехода (слово) … data ends Прямой дальний переход – межсегментный переход. Переход позволяет передать управление в любую точку любого сегмента. Команда дальнего перехода имеет длину 5 байт и включает код операции и полный адрес точки перехода, т.е. сегментный адрес и смещение. Транслятору надо сообщить, что переход дальний, это делается с помощью описателя far ptr, указываемого перед именем точки перехода. Пример: code segment 1 … jmp far ptr go … code ends code2 segment … go: … code2 ends Косвенный дальний переход. Как и в случае ближнего косвенного перехода, переход осуществляется по адресу, который содержится в ячейке памяти, однако ячейка имеет размер два слова, и в ней содержится полный адрес точки перехода. Пример: codel segment assume CS:codel,DS:data … jmp DS:go_addr ; Код FF 2E dddd … codel ends code2 segment assume CS:code2 … go: ;Точка перехода в другом сегменте команд … code2 ends data segment … go_addrdd go ;Двухсловный адрес точки перехода … data ends LOOPZ__и_LOOPNE_/_LOOPNZ'>13. Команда организации циклов (LOOP). Алгоритм работы. Команда организации циклов с условием (LOOPE/LOOPZ и LOOPNE/LOOPNZ). Команда JCXZ. LOOP Для организации цикла предназначена команда LOOP. У этой команды один операнд – имя метки, на которую осуществляется переход. В качестве счетчика используется регистр CX. Команда LOOP выполняет декремент CX, а затем проверяет его значение. Если содержимое CX не равно нулю, то осуществляется переход на метку, иначе управление переходит к следующей после LOOP команде. Метка должна находиться в диапазоне -127…+128 байт от команды LOOP. Пример программы, которая печатает буквы английского алфавита Иногда требуется организовать вложенный цикл, тогда необходимо сохранить значение CX перед началом вложенного цикла и восстановить его после завершения. LOOPZ/LOOPNZ LOOPE/LOOPNE Действие команд схоже с LOOP, за исключением того, что дополнительно анализируется флаг нуля ZF. Переход к метке цикла осуществляется в том случае, если после декремента содержимое CX не равно 0 и выполняется условие ZF = 1 (для LOOPZ/LOOPE) и ZF=0 (LOOPNZ/LOOPNE). Используется, когда: - выполнено требуемое количество итераций - выполнено некоторое условие досрочного завершения цикла Пример: Простейший пример такого алгоритма — поиск числа или символа в массиве. Поиск завершается, если один из элементов массива совпал с искомым или если достигнут конец массива. В качестве примера рассмотрим программу для поиска символов в строке. Пользователь вводит символ, а программа определяет, содержится такой символ в строке или нет. Для выхода из программы нужно нажать ENTER. 14. Команды вызова (CALL) процедур и возврата (RET (RETF, RETN) из них. Принцип работы. Способы передачи параметров процедурам. Задание передачи параметров через стек. Стандартный пролог и эпилог процедур при передаче параметров через стек. С помощью команды CALL выполняется вызов процедуры. Эта команда работает почти также, как команда безусловного перехода JMP, но с одним отличием – одновременно в стек сохраняется текущее значение регистра IP. Это позволяет потом вернуться к тому месту в коде, откуда была вызвана процедура. В качестве операнда указывается адрес перехода, который может быть непосредственным значением (меткой), 16-разрядным регистром (кроме сегментных) или ячейкой памяти, содержащей адрес. Возврат из процедуры выполняется командой RET. Эта команда восстанавливает значение из вершины стека в регистр IP. Таким образом, выполнение программы продолжается с команды, следующей сразу после команды CALL. Обычно код процедуры заканчивается этой командой. Команды CALL и RET не изменяют значения флагов (кроме некоторых особых случаев в защищенном режиме). Небольшой пример разных способов вызова процедуры: RET – возврат из процедуры Если командой RET завершается ближняя процедура, объявленная с атрибутом near, или используется модификация команды RETN, со стека снимается одно слово- относительный адрес точки возврата. Передача управления в этом случае осуществляется в пределах одного программного сегмента. Если командой RET завершается дальняя процедура, объявленная с атрибутом far, или используется модификация команды RETF, со стека снимаются два слова: смещение и сегментный адрес точки возврата. В этом случае передача управления может быть межсегментной. Способы передачи параметров в процедуры Через регистры Перед вызовом необходимые параметры сохраняются в регистрах. Такой метод является самым быстрым, но есть существенный недостаток: количество регистров ограничено. Через внешние имена Имя считается внешним, если оно объявлено в одном сегменте, а использовалось в другом Через общую область Вызывающая и вызываемая процедура “договариваются” о совместном использовании некоторой области памяти. Сегменты данных при этом должны иметь одинаковые имена. Таким образом сегменты «накладываются»: переменные находящиеся на одинаковых местах, даже если у них разные имена, позволяют обращаться к одним и тем же данным. Важно помнить, что изменения этих данных внутри процедуры ведет к изменению их в главной программе. Через таблицу параметров В основном сегменте данных выделяется дополнительная память – таблица параметров. В эту таблицу перед вызовом процедуры заносятся значения параметров, а в подпрограмму передается только адрес таблицы. Через стек Перед вызовом процедуры все параметры заносятся в стек. Размещенные параметры удаляются из стека внутри вызываемой или вызывающей процедуры. Для того, чтобы иметь доступ к сохраненным в стеке аргументам, необходимо в начале вызываемой процедуры сохранить в регистре BP адрес вершины стека, для этого пишут пролог. Теперь можно обращаться в аргументам в стеке относительно адреса хранящегося в BP. Важно при этом помнить, что команда вызова процедуры САLL поместит на верхушку стека значение IP или IP и CS в зависимости от типа вызываемой подпрограммы. Для восстановления состояния стека до его использования подпрограммой, необходимо загрузить в регистр IP адрес хранящийся в BP (написать эпилог): Пример: Решение задачи суммирования элементов массива с использованием стека для передачи параметров 15. Понятие прерывания. Аппаратные и программные прерывания. Таблица векторов прерываний. Команды вызова (INT) прерываний и возврата (IRET) из них. Прерывание означает временное прекращение основного процесса вычислений для выполнения некоторых запланированных или незапланированных действий, вызванных работой устройств или программы. В зависимости от источника различаются прерывания: - аппаратные (внешние) – реакция процессора на физический сигнал от некоторого устройства. Возникают в случайные моменты времени, а значит – асинхронные. - программные (внутренние) – возникает в заранее запланированный момент времени – синхронные. |