- •Машинное исполнение
- •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. Передача параметров.
1. Программа: использование директив extrn и public для меток.
1.1. Записать в текстовом редакторе следующую программу в ЕХЕ-формате:
.286
TITLE CALLMUL1 (EXE) Вызов подпрограммы умножения
;-------------------------------------------------------
EXTRN SUBMUL:FAR
;-------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 64 DUP(?)
STACKSG ENDS
;-------------------------------------------------------
DATASG SEGMENT PARA 'Data'
QTY DW 0140H
PRICE DW 2500H
DATASG ENDS
;--------------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV AX,PRICE ;Загрузить стоимость
MOV BX,QTY ;и количество
CALL SUBMUL ;Вызвать подпрограмму
RET ;Вернуться в DOS
BEGIN ENDP
CODESG ENDS
END BEGIN
Записать эту программу на диск под именем callmul1.asm.
1.2. Записать в текстовом редакторе следующую подпрограмму:
.286
TITLE SUBMUL1 Подпрограмма для умножения
;-------------------------------------------------------
CODESG SEGMENT PARA 'Code'
SUBMUL PROC FAR
ASSUME CS:CODESG
PUBLIC SUBMUL
MUL BX ;AX-стоимость,
;ВХ-количество
;Произведение в DX:AX
RET ;Вернуться в DOS
SUBMUL ENDP
CODESG ENDS
END SUBMUL
Записать эту подпрограмму на диск под именем submul1.asm.
1.3. Выполнить ассемблирование основной программы и подпрограммы. Для этого в командной строке DOS необходимо ввести следующую команду:
tasm.exe callmul1.asm+submul1.asm /l
При этом ассемблер создаст два obj-модуля и два листинга для основной программы и подпрограммы соответственно.
1.4. Просмотреть листинги основной программы и подпрограммы и записать их в отчет.
В основной программе определены сегменты для стека, данных и кода. В сегменте данных определены поля QTY и PRICE. В кодовом сегменте регистр АХ загружается значением PRICE, а регистр ВХ - значением QTY, после чего происходит вызов подпрограммы. Директива EXTRN в основной программе определяет SUBMUL как точку входа в подпрограмму.
Подпрограмма содержит директиву PUBLIC (после ASSUME), которая указывает компоновщику, что точкой входа для выполнения является метка SUBMUL. Подпрограмма умножает содержимое регистра АХ (цена) на содержимое регистра ВХ (количество). Результат умножения вырабатывается в регистровой паре DX:AX в виде числа 002Е 4000.
Так как подпрограмма не определяет каких-либо данных, то ей не требуется сегмент данных. Если бы подпрограмма имела сегмент данных, то только она одна использовала бы свои данные.
Также в подпрограмме не определен стековый сегмент, так как она использует те же стековые адреса, что и основная программа. Таким образом, стек, определенный в основной программе, является доступным и в подпрограмме. Для компоновщика необходимо обнаружить по крайней мере один стек и определение стека в основной программе является достаточным.
1.5. Выполните компоновку основной программы и подпрограммы.
Для этого в командной строке DOS введите следующую команду:
tlink.exe callmul1.obj+submul1.obj
Компоновщик создаст загрузочный модуль callmul1.exe.
1.6. Выполните трассировку программы с помощью отладчика DEBUG. Обратите внимание как изменяется содержимое регистров CS и IP при вызове подпрограммы и при возврате в основную программу. Выводы о работе программы запишите в отчет.