- •Машинное исполнение
- •1. Просмотр памяти.
- •2. Пример машинных кодов: непосредственные данные.
- •3. Пример машинных кодов: определение данных.
- •4. Пример машинных кодов: определение размера памяти.
- •5. Специальные средства отладчика.
- •6. Сохранение программы из отладчика.
- •Ассемблирование и выполнение программы
- •1. Ввод программы
- •2. Ассемблирование программы.
- •3. Компоновка программы.
- •4. Выполнение программы.
- •5. Ввод, ассемблирование, компоновка, выполнение и анализ листинга исходной программы.
- •Определение данных
- •1. Директивы определения данных.
- •2. Определение данных с числом повторений.
- •3. Директива определения байта (dв).
- •4. Директива определения слова (dw).
- •5. Директива определения двойного слова (dd).
- •6. Директива определения поля из четырех слов (dq).
- •7. Директива определения десяти байт (dt), директива equ.
- •Программы в com-файлах
- •1. Создание exe-файла.
- •2. Получение com-файла.
- •Логика и организация программы
- •1. Команда jmp.
- •2. Команда loop.
- •3. Сегмент стека.
- •4. Программа: расширение операции пересылки.
- •5. Программа: замена строчных букв на заглавные.
- •6. Команды сдвига и циклического сдвига.
- •7. Команды логических операций: and, or, xor, test, not.
- •Xor al,bl ;Логическое сравнение
- •Команды обработки строк
- •1. Rep: префикс повторения команды.
- •2. Программа: строковые операции.
- •3. Сканирование и замена.
- •4. Дублирование образца.
- •5. Программа: выравнивание справа при выводе на экран.
- •Арифметические операции 1: обработка двоичных данных
- •1. Сложение и вычитание.
- •2. Многословное сложение.
- •3. Умножение.
- •4. Повышение эффективности умножения.
- •5. Многословное умножение.
- •6. Сдвиг регистровой пары dx:ax.
- •7. Деление.
- •8. Деление вычитанием.
- •9. Преобразование знака.
- •Арифметические операции 2: обработка данных в форматах ascii и
- •1. Сложение в ascii-формате.
- •2. Вычитание в ascii-формате.
- •3. Умножение в ascii-формате.
- •4. Деление в ascii-формате.
- •5. Двоично-десятичный формат (bcd).
- •6. Преобразование ascii-формата в двоичный формат и наоборот.
- •Обработка таблиц
- •1. Прямой табличный доступ
- •2. Табличный поиск.
- •3. Табличный поиск с использованием сравнения строк.
- •4. Транслирующая команда xlat.
- •5. Программа: вывод шестнадцатиричных и ascii-кодов.
- •6. Программа: сортировка элементов таблицы.
- •Макрокоманды
- •If (условие)
- •If (условие)
- •1. Простое макроопределение.
- •2. Использование параметров в макрокомандах.
- •3. Комментарии в макрокомандах.
- •4. Использование макрокоманд внутри макроопределения.
- •5. Директива local.
- •6. Использование библиотек макроопределений.
- •7. Конкатенация (&).
- •8. Директивы повторения: rept, irp, irpc.
- •Inc ctr ;Увеличить счетчик
- •Inc dx ;Увеличить счетчик
- •Inc dx ;Увеличить счетчик
- •9. Макрокоманды, использующие директивы if и ifndef.
- •10. Макрокоманды, использующие директиву ifidn.
- •Связь между подпрограммами
- •1. Программа: использование директив extrn и public для меток.
- •2. Программа: использование директивы public в кодовом сегменте.
- •3. Программа: общие данные в подпрограмме.
- •4. Передача параметров.
4. Использование макрокоманд внутри макроопределения.
4.1. Составить в текстовом редакторе следующую программу в ЕХЕ-формате:
.286
TITLE MACRO4 (EXE) Вложенные макрокоманды
;--------------------------------------------
INIT2 MACRO CSNAME,DSNAME,SSNAME
ASSUME CS:CSNAME,DS:DSNAME
ASSUME SS:SSNAME,ES:DSNAME
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSNAME
MOV DS,AX
MOV ES,AX
ENDM ;Конец макрокоманды
;--------------------------------------------------
DOS21 MACRO DOSFUNC
MOV AH,DOSFUNC
INT 21H
ENDM
;-------------------------------------------------------
DISP MACRO CHAR
MOV DL,CHAR
DOS21 02
ENDM
;--------------------------------------------------------
STAC SEGMENT PARA 'Stac'
DW 32 DUP(?)
STAC ENDS
;---------------------------------------------------
DATA SEGMENT PARA 'Data'
NAMEPAR LABEL BYTE ;Список параметров
MAXLEN DB 20 ;Максимальная длина
ACTLEN DB ? ;Реальная длина
NAMEFLD DB 20 DUP (' ') ;Введенные символы
DATA ENDS
;---------------------------------------------------
CSEG SEGMENT PARA 'Code'
BEGIN PROC FAR
.SALL
INIT2 CSEG,DATA,STAC ;Макрокоманда
LEA DX,NAMEPAR
DOS21 0AH
.LALL
DISP '*'
RET
BEGIN ENDP
CSEG ENDS
END BEGIN
Макроопределение DOS21 заносит в регистр АН номер функции DOS и выполняет INT 21H. Макроопределение DISP использует макроопределение DOS21 для установки в регистре АН функции 02 для вывода символа. Указывая параметр макроопределения DISP можно выводить любой символ.
4.2. Выполнить ассемблирование и компоновку программы. Запустить программу из панели NORTON. Просмотреть листинг программы и записать его в отчет.
5. Директива local.
5.1. Составить в текстовом редакторе следующую программу в COM-формате:
.286
TITLE MACRO5 (COM) Использование директивы LOCAL
;--------------------------------------------
DIVIDE MACRO DIVIDEND,DIVISOR,QUOTIENT
LOCAL COMP
LOCAL OUT
; AX=делимое ВХ=делитель СХ=частное
MOV AX,DIVIDEND ;Загрузить делимое
MOV BX,DIVISOR ;Загрузить делитель
SUB CX,CX ;Регистр для частного
COMP: CMP AX,BX ;Делимое < делителя?
JB OUT ;да - выйти
SUB AX,BX ;Делимое - делитель
INC CX ;Частное + 1
JMP COMP
OUT: MOV QUOTIENT,CX ;Записать результат
ENDM ;Конец макрокоманды
;--------------------------------------------------
CSEG SEGMENT PARA 'Code'
ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG
ORG 100H
BEGIN: JMP SHORT MAIN
;---------------------------------------------------
DIVDND DW 150 ;Делимое
DIVSOR DW 27 ;Делитель
QUOTNT DW ? ;Частное
;---------------------------------------------------
MAIN PROC NEAR
.LALL
DIVIDE DIVDND,DIVSOR,QUOTNT
RET
MAIN ENDP
CSEG ENDS
END BEGIN
Программа иллюстрирует использование директивы LOCAL. В приведенной программе выполняется деление вычитанием; делитель вычитается из делимого и частное увеличивается на 1 до тех пор, пока делимое больше делителя. Для данного алгоритма необходимы две метки: COMP - адрес цикла, OUT - адрес выхода из цикла по завершении. Обе метки COMP и OUT определены как LOCAL и могут иметь
любые правильные ассемблерные имена.
В макрорасширении для COMP генерируется метка ??0000, а для OUT - ??0001. Если макрокоманда DIVIDE будет использована в этой программе еще один раз, то в следующем макрорасширении будут сгенерированы метки ??0002 и ??0003 соответственно. Таким образом, с помощью директивы LOCAL, обеспечивается уникальность меток в макрорасширениях в одной программе.
5.2. Выполнить ассемблирование и компоновку программы. Запустить программу из панели NORTON. Просмотреть листинг программы и записать его в отчет.