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

  • Порядок выполнения INT ( INTerrupt )

  • (MOVS, LODS, STOS, CMPS, SCAS, INS, OUTS). Назначение. Префиксы повторения строковых команд ( REP , REPE / REPZ , REPNE / REPNZ ).

  • 17. Команды работы с флагами. Команды NOP и HALT . Флаг переноса CF

  • 18. Операторы ассемблера. Операторы присваивания, арифметические, логические, сдвигов, сравнения. Отличия операторов от команд ассемблера. Арифметические

  • 19. Понятие макроопределения. Директивы определения макросов. Условные директивы и их использование в макросах. Макросы повторения ( %REP). Директивы работы с текстовыми макросами.

  • Директивы компиляции по условию

  • IFDIF

  • Директивы генерации ошибок

  • WHILE

  • 20. Многомодульная разработка программ. Директивы описания внешних процедур и данных. Директивы включения заголовочных и библиотечных файлов. Процесс компиляции и компоновки многомодульных программ.

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


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

    Вектор прерываний – адрес процедуры обработки прерываний.

    Адреса размещаются в специальной области памяти доступной для всех подпрограмм. Вектор прерывания одержит 4 байта: старшее слово содержит сегментную составляющую адреса процедуры обработки исключения, младшее — смещение.

    Вызов прерывания осуществляется с помощью директивы INT номер_прерывания.
    00h – 1Fh – прерывания BIOS
    20h – 3Fh – прерывания DOS
    40h – 5Fh – зарезервировано
    60h – 7Fh – прерывания пользователя
    80h – FFh – прерывания Бейсика

    Порядок выполнения INT (INTerrupt):
    1) В стек помещается содержимое регистра флагов FLAGS
    2) Флаги трассировки и прерывания устанавливаются в нуль (TF = 0, IF = 0)
    3) Вычисляется адрес соответствующего вектора прерываний – 4*номер_прерывания
    4) Содержимое сегментного регистра CS помещается в стек
    5) Содержимое второго слова вектора прерываний заносится в CS
    6) Содержимое управляющего регистра IP заносится в стек
    7) Первое слово вектора прерываний помещается в IP

    Процедура используемая для обработки прерывания должна быть дальней (FAR). Возврат с прерывания осуществляется при помощи директивы IRET, которая восстанавливает CS:IP и FLAGS. Все параметры в процедуру и из нее передаются через регистры, какое – зависит от прерывания.

    16. Строковые команды (MOVS, LODS, STOS, CMPS, SCAS, INS, OUTS). Назначение. Префиксы повторения строковых команд (REP, REPE/REPZ, REPNE/REPNZ).

    MOVS <приемник>, <источник> – пересылает один байт или одно слово из одной области памяти в другую.

    LODS <источник> - служит для загрузки строкового операнда в регистр AX.

    STOS <приемник> - записать содержимое регистра AL или AX в память.

    CMPS <приемник>, <источник> - сравнить содержимое двух областей памяти, размером в один байт или в одно слово.

    SCAS <приемник> - сравнить содержимое двух областей памяти, размером в один байт или в одно слово.

    INS <приемник>, <номер_порта> - производит ввод данных из порта ввода-вывода в строку байт

    OUTS <источник>, <номер_порта> - применяется для отправки строки байт в порт ввода-вывода.

    REPпрефикс повторения цепочечной команды. Несмотря на то, что цепочечные команды имеют отношение к одному байта или одному слову, префикс REP обеспечивает повторение команды несколько раз. Префикс кодируется непосредственно перед командой, например, REP MOVS. Для использования префикса REP необходимо установить начальное значение в регистре CX. При выполнении цепочечной команды с префиксом REP происходит уменьшение на 1 значения в регистре CX до нуля.

    Таким образом, можно обрабатывать строки любой длины.

    REPE/REPZ

    Префиксы являются абсолютными синонимами. Команда повторяется до тех пор, пока содержимое CX не равно нулю и флаг ZF = 1.

    REPNE/REPNZ

    Префиксы являются абсолютными синонимами. Команда повторяется до тех пор, пока содержимое CX не равно нулю и флаг ZF = 0.

    17. Команды работы с флагами. Команды NOP и HALT.

    Флаг переноса CF

    Команда CLC сбрасывает флаг CF.

    Команда STC устанавливает флаг CF в единицу.

    Команда CMC инвертирует значение флага CF.

    Флаг направления DF

    Этот флаг определяет направление обработки данных цепочечными командами (о них подробно расскажу в отдельной статье). Он должен устанавливаться или сбрасываться перед использованием этих команд.

    Команда CLD сбрасывает флаг DF.

    Команда STD устанавливает флаг DF в единицу.

    Флаг прерывания IF

    Этот флаг определяет, разрешены в данный момент прерывания или нет (о прерываниях тоже будет отдельная статья).

    Команда CLI сбрасывает флаг IF (запрещает прерывания).

    Команда STI устанавливает флаг IF в единицу (разрешает прерывания).

    Команды LAHF и SAHF

    Команда LAHF загружает младший байт регистра флагов в AH. Её удобно использовать, когда нужно получить значения сразу нескольких флагов. Порядок расположения флагов представлен на рисунке:



    Команда SAHF выполняет обратную операцию — загружает содержимое AH в младший байт регистра флагов. Это позволяет одновременно изменить значения нескольких флагов. При этом биты 1, 3, 5 регистра AH игнорируются.

    NOP

    Не выполняет никаких действий. Единственный эффект от команды - инкремент регистра EIP. На флаги не влияет.

    HALT (HLT)

    В результате выполнения команды микропроцессор переходит в состояние остановки. Из этого состояния его можно вывести сигналами на входах RESET, NMI, INTR. На флаги не влияет.

    18. Операторы ассемблера. Операторы присваивания, арифметические, логические, сдвигов, сравнения. Отличия операторов от команд ассемблера.

    Арифметические

    Сложение:

    ADD – сложение

    ADC – сложение с переносом

    INC – инкремент

    Вычитание

    SUB – вычитание

    DEC – декремент

    NEG – изменить знак

    CMP – сравнить два операнда

    Умножение

    DIV – деление

    IDIV – деление целых чисел

    Логические

    AND – логическое ИЛИ

    OR – логические ИЛИ

    XOR – исключающее ИЛИ

    NOT – инверсия битов

    TEST – логические ИЛИ влияющее только на флаги

    Сдвигов

    SHL – логический сдвиг влево

    SHR – логический сдвиг вправо

    SAL – арифметический сдвиг влево

    SAR – арифметический сдвиг вправо

    RCL – циклический сдвиг влево через перенос

    RCR – циклический сдвиг право через перенос

    ROL – циклический сдвиг влево

    ROR – циклический сдвиг вправо

    SHLD – сдвиг двойной точности влево

    SHRD – сдвиг двойной точности вправо

    Сравнения



    19. Понятие макроопределения. Директивы определения макросов. Условные директивы и их использование в макросах. Макросы повторения (%REP). Директивы работы с текстовыми макросами.

    Макроопределение - это способ дать имя фрагменту кода. После того как макрос определен, программист может вместо фрагмента кода писать имя макроса. В сущности, макрос - это просто имя фрагмента кода.

    Хотя в разных языках ассемблера определение макроса выглядит немного по-разному, во всех оно состоит из одних и тех же базовых частей:

    + заголовок макроса, в котором дается имя определяемого макроса;

    + текст, в котором приводится тело макроса;

    + директива, которая завершает определение (например, ENDM).

    Директивы

    Для создания макроса используется директива macro. Эта директива имеет следующий синтаксис:



    Тело макроса – код, который подставляется в то место, где макрос будет вызван.

    Если необходимо написать собственный набор макросов и использовать их в своих программах, то можно поместить макросы в отдельный файл и воспользоваться директивой включения файла include. Синтаксис директивы:

    include ‘пусть/к/файлу’

    Условные директивы

    Директивы условной компиляции делятся на два типа:

    - директивы компиляции по условию позволяют проанализировать определенные условия в ходе генерации макрорасширения и, при необходимости, изменить этот процесс.

    - директивы генерации ошибок по условию также контролируют ход генерации макрорасширения с целью генерации или обнаружения определенных ситуация, которые могут интерпретироваться как ошибочные.

    Директивы компиляции по условию

    Данные директивы предназначены для организации выборочной трансляции фрагментов программного кода. Такая выборочная компиляция означает, что в макрорасширение включаются не все строки макроопределения, а только те, которые удовлетворяют определенным условиям. То, какие конкретно условия должны быть проверены, определяется типом условной директивы.

    Введение в язык ассемблера этих директив значительно повышает его мощь.

    Всего имеется 10 типов условных директив компиляции. Их логично попарно объединить в четыре группы:

    1. Директивы IF и IFE — условная трансляция по результату вычисления логического выражения.

    2. Директивы IFDEF и IFNDEF — условная трансляция по факту определения символического имени.

    3. Директивы IFB и IFNB — условная трансляция по факту определения фактического аргумента при вызове макрокоманды.

    4. Директивы IFIDN, IFIDNI, IFDIF и IFDIFI — условная трансляция по результату сравнения строк символов.

    Условные директивы компиляции имеют общий синтаксис и применяются в составе следующей синтаксической конструкции:



    Директивы генерации ошибок

    Существует ряд директив, называемых директивами генерации пользовательской ошибки. Их можно рассматривать и как самостоятельное средство, и как метод, расширяющий возможности директив условной компиляции. Они предназначены для обнаружения различных ошибок в программе, таких как неопределенные метки или пропуск параметров макроса.

    К безусловным директивам генерации пользовательской ошибки относится только одна директива — это ERR

    Макросы повторения

    Директивы WHILE и REPT

    Директивы WHILE и REPT применяют для повторения определенное количество раз некоторой последовательности строк.

    Эти директивы имеют следующий синтаксис:



    При использовании директивы WHILE макрогенератор транслятора будет повторять последовательность_строк до тех пор, пока значение константное_выражение не станет равно нулю. Это значение вычисляется каждый раз перед очередной итерацией цикла повторения (то есть значение константное_выражение должно подвергаться изменению внутри последовательность_строк в процессе макрогенерации).

    Директива REPT, подобно директиве WHILE, повторяет последовательность_строк столько раз, сколько это определено значением константное_выражение. Отличие этой директивы от WHILE состоит в том, что она автоматически уменьшает на единицу значение константное_выражение после каждой итерации.

    Директивы работы с текстовыми макросами

    Директива слияния строк CATSTR.

    CATSTR строка_1,строка_2,... — значением этого макроса будет новая строка, состоящая из сцепленной слева направо последовательности строк строка_1,строка_2,... . В качестве сцепляемых строк могут быть указаны имена ранее определенных макросов.

    Директива выделения подстроки в строке SUBSTR

    SUBSTR <строка>,<номер_позиции>,<размер> — значением данного макроса будет часть заданной строки, начинающаяся с позиции с номером номер_позиции и длиной, указанной в размер.

    Если требуется только остаток строки, начиная с некоторой позиции, то достаточно указать только номер_позиции без указания размера.

    Директива определения вхождения одной строки в другую INSTR

    INSTR номер_нач_позиции,строка_1,строка_2 — после обработки данного макроса транслятором идентификатору будет присвоено числовое значение, соответствующее номеру (первой) позиции, с которой совпадают строка_1 и строка_2.

    Если такого совпадения нет, то идентификатор получит значение 0;

    директива определения длины строки в текстовом макросе SIZESTR:

    Идентификатор SIZESTR строка — в результате обработки данного макроса значение идентификатор устанавливается равным длине строки.

    20. Многомодульная разработка программ. Директивы описания внешних процедур и данных. Директивы включения заголовочных и библиотечных файлов. Процесс компиляции и компоновки многомодульных программ.

    Только самые простые программы изготавливаются из одного файла исходной программы. Более сложные программы в процессе разработки разбиваются на множество исходных модулей, как наиболее обще называют отдельные файлы исходной программы. Такое разбиение помогает справиться с общей сложностью программы и выполнять разработку по частям: вначале написать и отладить только часть программы, затем аналогичное выполнить с другой частью и т.д.

    Встает вопрос, что нужно делать, если разработчик хочет использовать в программе одного исходного модуля данные, описанные подобными конструкциями в другом исходном модуле. Нетрудно понять, что описать их тем же самым способом в первом из указанных модулей нельзя - одни и те же данные (по смыслу их использования и, главное, по имени области их размещения) нельзя размещать в разных местах памяти. Нельзя потому, что в машинных командах указываются действия над данными, расположенными по конкретным адресам, и не может быть данных, расположенных по двум или более различным адресам для одной исполняемой программы. Поэтому в исходном модуле программ для данных, определенных в другом месте и приходится записывать буквально (с учетом английского диалекта, на котором записаны ключевые слова программ), что данные с таким-то именем в действительности определены и размещены в другом исходном модуле.

    Такая запись на языке ассемблера NASM делается в директиве EXTERN. Последняя имеет вид

    EXTERN имя_внешнего_имени

    или, в общем случае,

    EXTERN перечисление_внешних_имен

    где перечисление_внешних_имен представляет собой перечисление через запятую набора различных внешних имен.

    В свою очередь те имена, которые предполагается использовать для доступа к данным и подпрограммам из другого исходного модуля, необходимо дополнительно сопровождать соответствующей информацией для системы разработки. Эта информация на ассемблере NASM задается в директиве GLOBAL. Именно, все имена, которые будут использоваться как внешние (или которые только могут использоваться как внешние), следует включить в состав перечисления после служебного слова GLOBAL. Имена, перечисленные в одной из директив GLOBAL, называются глобальными. Существенной особенностью таких имен является то, что они попадают в объектный модуль, сохраняя в нем свое обозначение

    1   2   3   4


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