- •Машинное исполнение
- •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. Измените процедуру C10MUL в программе exmult1.asm следующим образом:
C10MUL PROC
MOV AL,BYTE1
SHL AX,1 ;Умножение на 2
MOV CL,3
SHL AX,CL ;Умножение на 8
RET
C10MUL ENDP
При умножении на степень числа 2 (2, 4, 8 и т.д.) более эффективен сдвиг влево на требуемое число битов. Сдвиг более чем на 1
требует загрузки счетчика сдвига в регистр CL.
4.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.
4.3. Выполнить трассировку программы, записывая выводы в отчет
о выполнении каждой команды.
5. Многословное умножение.
5.1. Запишите в текстовом редакторе NORTON программу exmult2.asm в СОМ-формате:
.286
TITLE EXMULT2 (COM) Пример команд умножения
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
MULTCND DW 3206H ;Элементы данных
DW 2521H
MULTPLR DW 6400H
DW 0A26H
PRODUCT DW 0
DW 0
DW 0
DW 0
;--------------------------------------------------------
MAIN PROC NEAR ;Основная процедура
CALL E10XMUL ;Вызвать 1 4-е 0 умножение
CALL Z10ZERO ;Очистить произведение
CALL F10XMUL ;Вызвать 2 4-е 0 умножение
RET
MAIN ENDP
; Умножение дв. слова на слово
; ----------------------------
E10XMUL PROC
MOV AX,MULTCND+2 ;Умнож. прав. сл.
MUL MULTPLR ;множимого
MOV PRODUCT+4,AX ;Записать произв.
MOV PRODUCT+2,DX
MOV AX,MULTCND ;Умножить лев. сл.
MUL MULTPLR ;множимого
ADD PRODUCT+2,AX ;Сложить с полученным ранее
ADC PRODUCT,DX
RET
E10XMUL ENDP
; Перемножение двух двойных слов
; ------------------------------
F10XMUL PROC
MOV AX,MULTCND+2 ;Слово-2 множимого
MUL MULTPLR ;* слово-2 множителя
MOV PRODUCT+6,AX ;Сохранить рез.
MOV PRODUCT+4,DX
MOV AX,MULTCND+2 ;Слово-2 множимого
MUL MULTPLR ;* слово-1 множителя
ADD PRODUCT+4,AX ;Сложить с пред.
ADC PRODUCT+2,DX
ADC PRODUCT,00 ;Прибавить перенос
MOV AX,MULTCND ;Слово-1 множимого
MUL MULTPLR+2 ;* слово-2 множителя
ADD PRODUCT+4,AX ;Сложить с пред.
ADC PRODUCT+2,DX
ADC PRODUCT,00 ;Прибавить перенос
MOV AX,MULTCND ;Слово-1 множимого
MUL MULTPLR ;* слово-1 множителя
ADD PRODUCT+2,AX ;Сложить с пред.
ADC PRODUCT,DX
RET
F10XMUL ENDP
; Очистка области результата
; --------------------------
Z10ZERO PROC
MOV PRODUCT,0000
MOV PRODUCT+2,0000
MOV PRODUCT+4,0000
MOV PRODUCT+6,0000
RET
Z10ZERO ENDP
CODESG ENDS
END BEGIN
Процедура E10XMUL умножает двойное слово на слово. Множимое MULTCND состоит из двух слов, содержащих соответственно 3206Н и 2521Н. Определение данных в виде двух слов (DW) вместо двойного слова (DD) обусловлено необходимостью правильной адресации для команд MOV, пересылающих слова в регистр АХ. Множитель MULTPLR содержит 6400Н. Область для записи произведения PRODUCT состоит из трех слов. Первая команда MUL перемножает MULTPLR и правое слово поля MULTCND; произведение 0Е80 Е400 записывается в PRODUCT+2 и PRODUCT+4. Вторая команда MUL перемножает MULTPLR и левое слово поля MULTCND, получая в результате 138А 5800. Далее выполняется сложение двух произведений следующим образом:
PRODUCT PRODUCT+2 PRODUCT+4
Произведение 1: 0000 0E80 E400
DX AX
Произведение 2: 138A 5800
-----------------------------
PRODUCT PRODUCT+2 PRODUCT+4
Результат: 138A 6680 E400
Так как первая команда ADD может выработать перенос, то второе сложение выполняется командой сложения с переносом ADC. Если команда ADD не дала перенос, то команда ADC выполняется также как и ADD. Если команда ADD дала перенос, то команда ADC выполняет сложение и прибавляет к полученной сумме 1.
Умножение двух двойных слов в процедуре F10XMUL включает следующие четыре операции умножения:
Множимое Множитель
слово 2 х слово 2
слово 2 х слово 1
слово 1 х слово 2
слово 1 х слово 1
Первое произведение загружается в PRODUCT+4:PRODUCT+6. Второе произведение складывается с PRODUCT+2:PRODUCT+4. Третье произведение складывается с PRODUCT+2:PRODUCT+4. Четвертое произведение складывается с PRODUCT:PRODUCT+2.
После пары команд сложения ADD/ADC используется еще одна команда ADC, которая прибавляет 0 к значению в поле PRODUCT. Это необходимо потому, что первая команда ADC сама может вызвать перенос. Вторая команда ADC прибавит 0, если переноса нет, и прибавит 1, если перенос есть. Таким образом возникший перенос будет
учтен в поле PRODUCT. Финальная пара команд ADD/ADC не требует дополнительной команды ADC, так как область PRODUCT достаточно велика для генерации окончательного результата и переноса на последнем этапе не будет.
Окончательный результат 138А 687С 8Е5С ССЕ6 получится в области памяти, отведенной под результат PRODUCT (4 слова).
5.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.
5.3. Просмотреть область данных программы в памяти командой D CS:100. Выполнить трассировку программы, внимательно отслеживая содержимое регистров DX и АХ. После каждой пары команд ADD/ADC необходимо проверять область данных программы и все изменения в ней фиксировать в отчет. Записать выводы о работе программы в отчет и уметь объяснить выполнение каждой команды программы.