- •Машинное исполнение
- •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. Передача параметров.
2. Программа: использование директивы public в кодовом сегменте.
2.1. Записать в текстовом редакторе следующую программу в ЕХЕ-формате:
.286
TITLE CALLMUL2 (EXE) Вызов подпрограммы умножения
;-------------------------------------------------------
EXTRN SUBMUL2: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 PUBLIC '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 SUBMUL2 ;Вызвать подпрограмму
RET ;Вернуться в DOS
BEGIN ENDP
CODESG ENDS
END BEGIN
Записать эту программу на диск под именем callmul2.asm.
2.2. Записать в текстовом редакторе следующую подпрограмму:
.286
TITLE SUBMUL2 Вызываемая подпрограмма умножения
;-------------------------------------------------------
CODESG SEGMENT PARA PUBLIC 'Code'
SUBMUL2 PROC FAR
ASSUME CS:CODESG
PUBLIC SUBMUL2
MUL BX ;AX-стоимость,
;ВХ-количество
;Произведение в DX:AX
RET ;Вернуться в DOS
SUBMUL2 ENDP
CODESG ENDS
END SUBMUL2
Записать эту подпрограмму на диск под именем submul2.asm.
2.3. Выполнить ассемблирование основной программы и подпрограммы.
Просмотреть листинги основной программы и подпрограммы и записать их в отчет.
Для данного примера имеется одно изменение в основной программе и одно - в подпрограмме. В обоих случаях в директиве SEGMENT используется атрибут PUBLIC.
Из таблицы идентификаторов (в конце каждого листинга ассемблирования) следует, что обобщенный тип кодового сегмента CODESG - PUBLIC (в предыдущем примере было NONE). При этом компоновщик объединит два логических кодовых сегмента в один физический кодовый сегмент.
Таким образом подпрограмма будет находиться в общем с основной программой кодовом сегменте.
2.4. Выполните компоновку основной программы и подпрограммы.
Выполните трассировку программы с помощью отладчика DEBUG. Обратите внимание как изменяется содержимое регистров CS и IP при вызове подпрограммы и при возврате в основную программу. Выводы о работе программы запишите в отчет.
3. Программа: общие данные в подпрограмме.
3.1. Записать в текстовом редакторе следующую программу в ЕХЕ-формате:
.286
TITLE CALLMUL3 (EXE) Вызов подпрограммы для умножения
;-------------------------------------------------------
EXTRN SUBMUL3:FAR
PUBLIC QTY,PRICE
;-------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 64 DUP(?)
STACKSG ENDS
;-------------------------------------------------------
DATASG SEGMENT PARA PUBLIC 'Data'
QTY DW 0140H
PRICE DW 2500H
DATASG ENDS
;--------------------------------------------------------
CODESG SEGMENT PARA PUBLIC 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
CALL SUBMUL3 ;Вызвать подпрограмму
RET ;Вернуться в DOS
BEGIN ENDP
CODESG ENDS
END BEGIN
Записать эту программу на диск под именем callmul3.asm.
3.2. Записать в текстовом редакторе следующую подпрограмму:
.286
TITLE SUBMUL3 Подпрограмма для умножения
;------------------------------------------------------
EXTRN QTY:WORD,PRICE:WORD
;-------------------------------------------------------
CODESG SEGMENT PARA PUBLIC 'Code'
SUBMUL3 PROC FAR
ASSUME CS:CODESG
PUBLIC SUBMUL3
MOV AX,PRICE
MOV BX,QTY
MUL BX ;Произведение в DX:AX
RET ;Вернуться в DOS
SUBMUL3 ENDP
CODESG ENDS
END SUBMUL3
Записать эту подпрограмму на диск под именем submul3.asm.
3.3. Выполнить ассемблирование основной программы и подпрограммы.
Просмотреть листинги основной программы и подпрограммы и записать их в отчет.
Для данного примера области QTY и PRICE по-прежнему определяются в основной программе, но загрузка значений из этих областей в регистры АХ и ВХ выполняется в подпрограмме.
В основной программе имена QTY и PRICE определены как PUBLIC. Сегмент данных также определен с атрибутом PUBLIC.
В подпрограмме имена QTY и PRICE определены как EXTRN и WORD. Такое определение указывает ассемблеру на длину этих полей в 2 байт. Благодаря этому ассемблер сгенерирует правильный код операции для команд MOV, а компоновщик установит значения операндов.
Команды MOV в листинге программы имеют следующий вид:
А1 0000е MOV AX,PRICE
8B 1E 0000e MOV BX,QTY
В объектном коде А1 обозначает пересылку слова из памяти в регистр АХ, а 8В - пересылку слова из памяти в регистр ВХ (объектный код для операций с регистром АХ чаще требует меньшего числа байтов, чем с другими регистрами).
3.4. Выполните трассировку программы callmul3.exe с помощью отладчика DEBUG.
Трассировка выполнения программы показывает, что компоновщик установил в объектном коде следующие операнды:
А1 0200
8В 1Е 0000
Объектный код теперь идентичен коду, сгенерированному в предыдущем примере, где команды MOV находились в вызывающей программе.
Выводы о работе программы запишите в отчет.