spo1_theor1x

advertisement
1.
Система команд. Группы команд: сложение, вычитание, умножение,
деление, арифметическая коррекция.
Сложение ADD dst, src (dst = dst + src)
Сложение с учетом переноса
ADS dst, src
000100 d w
mod reg r/m
1111111 w
mod 000 r/m
Инкремент
INC dst
Коррекция аккумулятора AL при сложении распакованных двоично-десятичных чисел (в коде ASCII)
AAA
001100111
Коррекция аккумулятора AL при сложении упакованных двоично-десятичных чисел
DAA
00100111
Вычитание SUB dst, src (dst = dst - src)
Вычитание с учетом заема
SBB dst, src
000110 d w
mod reg r/m
1111111 w
mod 001 r/m
1111011 w
mod 011 r/m
Декремент
DEC dst
Изменение знака
NEG dst
Сравнение CMP dst, src
( dst – src )
- Непосредственных данных с аккумулятором
AAS
00101111
Десятичная коррекция распакованных чисел для вычитания
DAS
00101111
Умножение без знака AL или AX на операнд src
MUL src
1111011 w
mod 100 r/m
Умножение с учетом знака AL или AX на операнд src ( умножение целых чисел)
IMUL src
1111011 w
mod 101 r/m
Десятичная коррекция AX при умножении распакованных чисел (код ASCII)
AAM src
11010100
00001010
Беззнаковое деление содержимого DX, AX на операнд src
DIV src
1111011 w
mod 110 r/m
Деление содержимого DX, AX на src с учетом знака (деление целых чисел )
IDIV src
1111011 m
mod 111 r/m
Десятичная коррекция AL при делении распакованных чисел (код ASCII)
AAD src
11010101
00001010
Преобразование байта в слово
CBW
10011001
Преобразование слова в двойное слово
CWD
10011001
2.
Выполнение арифметическиx операций над двоичными числами
(byte, word, doubleword).
Над двоичными числами без знака можно выполнять операции сложения,
вычитания, умножения и деления.
Над двоичными числами со знаком могут быть выполнены операции умножения
деления.
и
3.
Выполнение арифметическиx операций над десятичными числами.
4.
Функции прерывания 21h DOS для ввода с клавиатуры и вывода на дисплей.
Прерывание 21h, номер функции в регистре ah
Функция 1: ввод символа с клавиатуры с эхом, ожиданием нажатия клавиши.
ASCII код символа возвращается в al. Для специальных клавиш al=0. Повторный вызов функции возвращает скэн-код.
Функция 2: вывод символа на экран. Символ в dl.
Функция 7: ввод с клавиатуры без эха с ожиданием.
ASCII код символа возвращается в al. Для специальных клавиш al=0. Повторный вызов функции возвращает скэн-код.
Функция 9: вывод строки на экран. Адрес строки в ds:dx, окончание строки $.
Функция 0Аh: ввод строки с клавиатуры с ожиданием и эхом. Адрес буфера ввода - ds:dx, первый байт буфера - его размер, второй – число
реально введенный байтов. Окончание ввода – Enter (0Dh)
Функция 2Сh: получить время. Возвращает в ch – часы (0-23), в cl – минуты (0-59), в dh – секунды (0-59), в dl – сотые доли секунды (00-99).
5.
Функции прерывания 10h BIOS для вывода на дисплей.
Функция 0: установить режим выдачи изображения. Номер режима в al.
Функция 1: установить размер курсора.
Установить количество строк развертки, нумеруемых сверху от 0 до 1fh.
ch – начальная строка растра для курсора
cl – конечная строка растра для курсора
Если установлен 5 разряд регистра ch (20h) – удаление курсора.
Функция 2: установить позицию курсора.
Задать координаты строки и колонки экрана.
dh –строка
dl –столбец
bh – номер страницы
Отсчет номера строки и столбца ведется от верхнего левого угла экрана с (0,0).
Функция 3: считать положение и размер курсора.
bh – номер страницы
Положение и размер курсора возвращаются в dx, cx.
dh, dl – строка и столбец текущей позиции курсора
ch, cl – первая и последняя строки развертки курсора
Функция 5: установить активную страницу
al – номер страницы
В текстовом режиме 3 – номера страниц 0-3.
Функция 6: прокрутить окно вверх
Позволяет задать на экране прямоугольную область и прокрутить ее содержимое на 1 или более строк
al – число строк прокрутки (если al=0 – очищается все окно («рисуем» окно))
ch, cl – строка и столбец верхнего левого угла
dh, dl – строка и столбец правого нижнего угла
bh – атрибут для выдачи пустых строк
Обычно прокрутка окна выполняется в 2 стадии: 1) с помощью функции 6 внизу окна вводятся строки (при этом исчезают верхние); 2) в новую
строку позиционируется курсор и выводятся символы.
Функция 7: прокрутить окно вниз
Аналогично функции 6, но новые строки появляются в верхней части окна и исчезают в нижней.
Функция 8: считать символ и атрибут символа в текущей позиции курсора
bh – номер страницы
Возвращаемые значения:
ah – атрибут символа
al – ASCII –код символа
Функция 9: вывести символ с заданным атрибутом на экран
bh – номер страницы
al – ASCII- код символа
bl – атрибут символа
cx – число повторений символа
Каждый символ на экране описывается 2 байтами - ASCII-кодом и атрибутом.
Байт атрибутов: биты 0-3 – символ, биты 4-7 – фон.
Биты 0-2 – цвет символа, бит 3 – символ яркого цвета (или мигание фона).
Биты 4-6 – цвет фона, бит 7 – символ мигает (или фон яркого цвета).
000 – черный, 001 – синий, 010 – зеленый, 011 – голубой, 100 – красный, 101 –пурпурный,
110 – коричневый, 111 – серый.
Функция 0Аh: вывести символ с текущим атрибутом на экран ( в качестве атрибута символа используется атрибут, который имел символ,
находившийся ранее в данной позиции).
bh – номер страницы
al – ASCII-код символа
cx –число повторений символа
6.
Функции прерывания 16h BIOS для ввода с клавиатуры.
Функция 0: чтение символа с ожиданием
Если нажатой клавише соответствует ASCII –символ, то в al - код этого символа, в ah – скан-код клавиши;
Если нажатой клавише соответствует расширенный ASCII-код, то в al – префикс скан-кода или 0 , если префикса нет, в ah – расширенный ASCII –
код.
Функция 1: проверка символа в буфере клавиатуры (без ожидания)
Выход:zf=1 буфер пуст
zf=0 в буфере присутствует символ,
в al - код этого символа, 0 или префикс скан-кода
в ah – скан-код клавиши или расширенный ASCII –код
Функция 2: считать состояние клавиатуры.
Выход: al – байт состояния клавиатуры (байт расположен в памяти по адресу 0:417h); бит 0: правая Shift нажата, бит 1: левая Shift нажата, бит 2:
любая Ctrl нажата, бит 3: любая Alt нажата, бит 4: ScrollLock включена, бит 5: NumLock включена, бит 6: CapsLock включена, бит 7: Ins включена.
КОНТРОЛЬНЫЕ ВОПРОСЫ:
1.
Понятия макроопределение, макровызов, макрорасширение.
Макроопределение - это способ дать имя фрагменту кода. После того как макрос определен, программист может вместо фрагмента кода
писать имя макроса. В сущности, макрос - это просто имя фрагмента кода.
Хотя в разных языках ассемблера определение макроса выглядит немного по-разному, во всех оно состоит из одних и тех же базовых частей:
+ заголовок макроса, в котором дается имя определяемого макроса;
+ текст, в котором приводится тело макроса;
+ директива, которая завершает определение (например, ENDM).
Когда ассемблер наталкивается на макроопределение в программе, он сохраняет его в таблице макроопределений для последующего
использования. Всякий раз, когда в программе в качестве кода операции будет появляться макрос (в нашем примере - SWAP), ассемблер
заменит его телом макроса. Использование имени макроса в качестве кода операции называется макровызовом, а его замена телом макроса макрорасширением.
Макрорасширение происходит в ходе ассемблирования, а не во время выполнения программы.
Макровызовы не следует путать с вызовами процедур. Основное отличие состоит в том, что макровызов - это команда ассемблеру заменить
имя макроса телом макроса. Вызов процедуры - это машинная команда, которая, будучи вставлена в объектную программу, позднее должна
быть выполнена для вызова процедуры.
2.
Директивы макроопределений, формальные и фактические параметры.
Директива MACRO указывает ассемблеру, что следующие команды до
директивы ENDM являются частью макроопределения.
Формальные параметры в макроопределении указывают ассемблеру на соответствие их имен любым аналогичным именам в теле
макроопределения. Формальные параметры могут иметь любые правильные ассемблерные имена, не обязательно совпадающими именами в
сегменте данных.
Фактические параметры помещаются в поле операндов макровызова
Макроопределение:
INIT2 MACRO CSNAME,DSNAME,SSNAME (формальные параметры)
Макрокоманда: INIT2 CSEG,DSEG,STACK (параметры)
Так как ассемблер уже определил соответствие между формальными параметрами и операторами в макроопределении, то теперь ему
остается подставить фактические параметры макрокоманды в макрорасширении:
3.
Специальные операции макроопределений. Локальные метки.
Локальные метки
Локальная метка - это метка, которая известна только внутри того оператора Asm,
где она была определена. Локальные метки
- Начинаются со знака @
4.
Макрокоманды повторения REPT, IRP, IRPC.
Директивы повторения заставляют ассемблер повторить блок
операторов, завершаемых директивой ENDM. Эти директивы не
обязательно должны находится в макроопределении, но если они
там находятся,
то одна директива ENDM
требуется для
завершения повторяющегося блока,
а вторая ENDM - для
завершения макроопределения.
REPT: Повторение
Операция REPT приводит к повторению блока операторов до
директивы ENDM в соответствии с числом повторений, указанным
в выражении:
REPT выражение
IRP: Неопределенное повторение
Операция IRP приводит к повторению блока команд до
директивы ENDM. Основной формат:
IRP dummy,<arguments>
Аргументы, содержащиеся в угловых скобках, представляют
собой любое число правильных символов, строк, числовых или
арифметических констант. Ассемблер генерирует блок кода для
каждого аргумента.
IRPC: Неопределенное повторение символа
Операция IRPC приводит к повторению блока операторов до
директивы ENDM. Основной формат:
IRPC dummy,string
Ассемблер генерирует блок кода для каждого символа в строке
"string".
5.
Директивы условной трансляции и управления листингом.
Данные директивы предназначены для организации выборочной трансляции фрагментов программного кода.
Директивы IF и IFE — условная трансляция по результату вычисления логического выражения.
Директивы IFDEF и IFNDEF — условная трансляция по факту определения символического имени.
Директивы IFB и IFNB — условная трансляция по факту определения фактического аргумента при вызове макрокоманды.
Директивы IFIDN, IFIDNI, IFDIF и IFDIFI — условная трансляция по результату сравнения строк символов.
общие директивы управления листингом
директивы вывода в листинг включаемых файлов
директивы вывода блоков условного ассемблирования
директивы вывода в листинг макрокоманд
директивы вывода в листинг информации о перекрестных ссылках
директивы изменения формата листинга
При рассмотрении директив обращайте внимание на то, что их формат отличается для режимов работы транслятора MASM и IDEAL:
директивам режима MASM предшествует точка;
директивам режима IDEAL предшествует знак “%”.
Общие директивы управления листингом
Директивы этой группы предназначены для управления видом файла листинга. Все директивы являются парными — это означает, что если
одна директива что-то разрешает, то другая, наоборот, запрещает. %LIST и %NOLIST (.LIST и .XLIST)
Директивы .LIST или %LIST определяют необходимость вывода в файл листинга всех строк исходного кода. Эти директивы подразумеваются по
умолчанию.
Для запрета вывода в файл листинга всех строк исходного кода необходимо использовать директивы .XLIST или %NOLIST. В тексте программы
их можно применять произвольное количество раз, при этом очередная директива отменяет действие предыдущей.
%CTLS и %NOCTLS
Если предыдущие директивы влияют на полноту представления исходного кода в целом, то директивы %CTLS и %NOCTLS управляют выводом в
файл листинга самих директив управления листингом.
%SYMS и %NOSYMS Эти директивы определяют, включать (%SYMS) или не включать (%NOSYMS) в файл листинга таблицу идентификаторов.
6.
Директивы и команды организации процедур.
Для организации процедур применяются директивы PROC и ENDP
для передачи управления процедуре используется команда CALL. При достижении команды RET, находящейся в процедуре, управление
передается команде, непосредственно идущей за командой CALL.
7.
Способы передачи параметров в процедуры.
1). Передача параметров через регистры общего назначения.
Достоинства: быстрый и удобный;
Недостатки: ограничен в размерах (не более 5).
Применение: написание операционных систем (печать строки. и др.).
2). Передача через общую область памяти. (общие переменные)
Общие переменные описываются следующим образом,
в вызывающей:
PUBLIC список имен (имена переменных или меток).
В вызываемой процедуре:
EXTERN {имя параметра, тип}
3). Передача параметров через стек.
Такой метод применим не только между ассемблерными модулями, но и с разными языками. STDCALL- стандартная взаимосвязь процедур по
параметрам. Основным средством доступа к параметрам является BP, для которого:
его значение при запуске процедуры сохраняется в стеке;
доступ к параметрам осуществляется с помощью базовой адресации
8.
Взаимодействие процедур, созданных в разных программных модулях.
Для того чтобы объявить о подобного рода видимых извне объектах, программа должна использовать две директивы TASM: extrn и public.
Директива extrn предназначена для объявления некоторого имени внешним по отношению к данному модулю. Это имя в другом модуле
должно быть объявлено в директиве public. Директива public предназначена для объявления некоторого имени, определенного в этом модуле,
и видимом в других модулях. Синтаксис этих директив следующий:
extrn имя: тип,..., имя: тип
public имя,... ,имя
Здесь имя - идентификатор, определенный в другом модуле. В качестве идентификатора могут выступать:
• имена переменных, определенных директивами типа db, dw и т. д.;
• имена процедур;
• имена констант, определенных операторами = и equ.
Тип определяет тип идентификатора. Указание типа необходимо, для того, чтобы транслятор правильно сформировал соответствующую
машинную команду.
Действительные адреса будут вычислены на этапе редактирования, когда будут разрешаться внешние ссылки. Возможные значения типа
определяются допустимыми типами объектов для этих директив:
• если имя - это имя переменной, то тип может принимать значения byte, word, dword, pword, fword, qword и tbyte;
• если имя - это имя процедуры, то тип может принимать значение near или far;
• если имя - это имя константы, то тип должен быть abs.
9.
Макробиблиотеки и библиотеки объектных модулей.
Утилита "Библиотекарь" LIB.EXE.
Макробиблиотека представляет собой файл с текстами макроопределений. Макроопределения записываются в этот файл точно в таком же
виде, как и в текст программы.
Для решения проблем, возникающих при поддержании порядкав наборах из большого количества объектных модулей, еще на
заревычислительной техники были придуманы библиотеки объектных модулей.
Библиотека, как правило, представляет последовательный файл,состоящий из заголовка, за которым последовательно уложены объектные
модули.В заголовке содержится следующая информация:
Список всех объектных модулей, со смещением каждого модуля отначала библиотеки. Это нужно для того, чтобы можно было легко
найтитребуемый модуль.
Список всех глобальных символов, определенных в каждом из модулей,с указанием, в каком именно модуле он был определен.
Линкер обычно собирает в программу все объектные модули,которые были ему заданы в командной строке, даже если на этот модульне было
ни одной ссылки.С библиотечными модулями он ведет себя несколько иначе.
lib.exe – для работ с библиотеками *.lib
LIB.EXE /LIST LIBC.LIB>1 -просмотр всех объектных модулей в библиотеке
LIB.EXE /EXTRACT:build\intel\st_obj\crt0init.obj LIBC.lib –извлечение
Download