Главная страница
Навигация по странице:

  • 10. Команды работы с двоично-десятичными числами ( AAA , DAA , AAS , DAS , AAD , AAM ). Назначение, принцип работы.

  • 11. Команды работы с битами ( BT , BTS , BTC , BTR , BSF , BSR ). Назначение, устанавливаемые флаги. BT

  • 12. Команды переходов. Условный ( Jcc ) и безусловный ( JMP ) переход. Ограничение на дальность перехода. Короткий, близкий и дальний переход. Косвенный переход.

  • Прямой короткий переход

  • Прямой ближний переход

  • Косвенный ближний переход

  • Косвенный дальний переход

  • 13. Команда организации циклов ( LOOP ). Алгоритм работы. Команда организации циклов с условием ( LOOPE / LOOPZ и LOOPNE / LOOPNZ

  • LOOPZ / LOOPNZ LOOPE/LOOPNE

  • 14. Команды вызова ( CALL ) процедур и возврата ( RET ( RETF , RETN

  • Способы передачи параметров в процедуры Через регистры

  • Через внешние имена Имя считается внешним, если оно объявлено в одном сегменте, а использовалось в другомЧерез общую область

  • Через таблицу параметров

  • 15. Понятие прерывания. Аппаратные и программные прерывания. Таблица векторов прерываний. Команды вызова ( INT ) прерываний и возврата ( IRET ) из них.

  • ЯП. 1. Регистры общего назначения (рон) процессора. Назначение и использование. Специальное назначение регистров


    Скачать 0.61 Mb.
    Название1. Регистры общего назначения (рон) процессора. Назначение и использование. Специальное назначение регистров
    Дата26.01.2022
    Размер0.61 Mb.
    Формат файлаdocx
    Имя файлаYAPE.docx
    ТипДокументы
    #343006
    страница3 из 4
    1   2   3   4

    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) из них.

    Прерывание означает временное прекращение основного процесса вычислений для выполнения некоторых запланированных или незапланированных действий, вызванных работой устройств или программы.

    В зависимости от источника различаются прерывания:

    - аппаратные (внешние) – реакция процессора на физический сигнал от некоторого устройства. Возникают в случайные моменты времени, а значит – асинхронные.

    - программные (внутренние) – возникает в заранее запланированный момент времени – синхронные.
    1   2   3   4


    написать администратору сайта