- •Машинное исполнение
- •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. Передача параметров.
3. Умножение.
3.1. Запишите в текстовом редакторе NORTON программу exmult1.asm в СОМ-формате:
.286
TITLE EXMULT1 (COM) Пример команд умножения
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
BYTE1 DB 80H ;Элементы данных
BYTE2 DB 40H
WORD1 DW 8000H
WORD2 DW 4000H
;--------------------------------------------------------
MAIN PROC NEAR ;Основная процедура
CALL C10MUL ;Вызвать умнож. MUL
CALL D10IMUL ;Вызвать умнож. IMUL
RET
MAIN ENDP
; Пример умножения MUL
; --------------------
C10MUL PROC
MOV AL,BYTE1 ;Байт * байт
MUL BYTE2 ;Произведение в АХ
MOV AX,WORD1 ;Слово * слово
MUL WORD2 ;Произведение в DX:AX
MOV AL,BYTE1 ;Байт * слово
SUB AH,AH ;Расш. множ. в АН
MUL WORD1 ;Произведение в DX:AX
RET
C10MUL ENDP
; Пример умножения IMUL
; ---------------------
D10IMUL PROC
MOV AL,BYTE1 ;Байт * байт
IMUL BYTE2 ;Произведение в АХ
MOV AX,WORD1 ;Слово * слово
IMUL WORD2 ;Произведение в DX:AX
MOV AL,BYTE1 ;Байт * слово
CBW ;Расшир. множ. в АН
IMUL WORD1 ;Произвед. в DX:AX
RET
D10IMUL ENDP
CODESG ENDS
END BEGIN
В процедуре C10MUL дано три примера умножения: байт на байт, слово на слово и слово на байт. Первый пример команды MUL перемножает 80Н (128) на 40Н (64). Произведение 2000Н (8192) получается в регистре АХ.
Второй пример команды MUL генерирует 2000 0000Н в регистрах DX:AX.
Третий пример команды MUL перемножает слово на байт и требует расширения байта BYTE1 до размеров слова. Для расширения используется команда SUB, обнуляющая регистр АН. Произведение 0040 0000Н получается в регистровой паре DX:AX.
В процедуре D10IMUL используются те же три примера умножения, что и в процедуре C10MUL, но вместо команд MUL записаны команды IMUL.
Первый пример команды IMUL перемножает 80Н (отрицательное число) на 40Н (положительное число). Произведение Е000 получается в регистре АХ. Команда IMUL рассматривает 80Н как -128. В результате умножения -128 на +64 получается -8192 или шестнадцатиричное Е000.
Второй пример команды IMUL перемножает 8000Н (отрицательное значение) на 2000Н (положительное значение). Произведение Е000 0000 получается в регистрах DX:AX и представляет собой отрицательное значение.
Третий пример команды IMUL перед умножением выполняет расширение байта BYTE1 до размеров слова в регистре АХ. Так как значения предполагаются знаковые, то в примере используется команда CBW для перевода левого знакового бита в регистр АН: шестнадцатиричное 80 в регистре AL превращается в FF80 в регистре АХ. Поскольку множитель в слове WORD1 имеет также отрицательное значение, то
произведение будет положительным.
3.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.
3.3. Просмотреть сегмент кодов с помощью команды D CS:100 и определить в каких ячейках памяти записаны элементы данных программы. Выполнить трассировку программы, записывая выводы в отчет о выполнении каждой команды.