- •Машинное исполнение
- •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. Деление в ascii-формате.
4.1. Составьте программу ascaad.asm в текстовом редакторе NORTON в СОМ-формате:
MAIN PROC NEAR
MOV AX,3238H
MOV CL,37H
AND CL,0FH ;Преобр. CL в распак. дес.
AND AX,0F0FH ;Преобр. АХ в распак. дес.
AAD ;Преобр в двоичный
DIV CL ;Разделить на 7
RET
MAIN ENDP
Команда AAD умножает содержимое АН на 0АН (10), прибавляет результат 14Н (20) к регистру AL и очищает регистр АН. Полученное значение 001С - это шестнадцатиричное представление числа 28.
4.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.
4.3. Выполнить трассировку программы внимательно определяя изменения содержимого регистров AL и АН. Выводы о работе записать в отчет.
4.4. Запишите в текстовом редакторе NORTON программу ascdiv.asm в COM-формате:
.286
TITLE ASCDIV (COM) Деление ASCII-чисел
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
DIVND DB '3698' ;Элементы данных
DIVSOR DB '4'
QUOTNT DB 4 DUP(0)
;--------------------------------------------------------
MAIN PROC NEAR
MOV CX,04 ;4 цикла
SUB AH,AH ;Стереть левый байт делимого
AND DIVSOR,0FH ;Стереть ASCII 3 в делителе
LEA SI,DIVND
LEA DI,QUOTNT
A20: MOV AL,[SI] ;Загрузить ASCII-байт
AND AL,0FH ;Стереть ASCII тройку
AAD ;Коррекция для деления
DIV DIVSOR ;Деление
MOV [DI],AL ;Сохранить частное
INC SI
INC DI
LOOP A20 ;Циклиться 4 раза
RET
MAIN ENDP
CODESG ENDS
END BEGIN
Программа выполняет деление четырехбайтового делимого на однобайтовый делитель. В программе организован цикл обработки делимого справа налево. Остатки от деления находятся в регистре АН и команда AAD корректирует их в регистре AL. Окончательный результат - 00090204 и в регистре АН остаток 02.
4.5. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.
4.6. Выполнить трассировку программы до первой команды AND. Просмотреть сегмент кодов. Выполнить команду AND. Просмотреть сегмент кодов. Продолжить трассировку программы проверяя сегмент кодов после каждого цикла оканчивающегося командой LOOP. Внимательно следить за изменением содержимого регистров СХ, АН, AL, SI и DI. Выводы о работе программы записать в отчет.
5. Двоично-десятичный формат (bcd).
5.1. Запишите в текстовом редакторе NORTON программу bcdadd.asm в COM-формате:
.286
TITLE BCDADD (COM) Преобр. ASCII в BCD, сложение
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
ASC1 DB '057836' ;Элементы данных
ASC2 DB '069427'
BCD1 DB '000'
BCD2 DB '000'
BCD3 DB 4 DUP(0)
;--------------------------------------------------------
MAIN PROC NEAR ;Основная процедура
LEA SI,ASC1+4 ;Инициализировать для ASC1
LEA DI,BCD1+2
CALL B10CONV ;Вызвать преобразование
LEA SI,ASC2+4 ;Инициализировать для ASC2
LEA DI,BCD2+2
CALL B10CONV ;Вызвать преобразование
CALL C10ADD ;Вызвать сложение
RET
MAIN ENDP
; Преобразование ASCII в BCD
; --------------------------
B10CONV PROC
MOV CL,04 ;Фактор сдвига
MOV DX,03 ;Число слов
B20: MOV AX,[SI] ;Получить ASCII-пару
XCHG AH,AL
SHL AL,CL ;Удалить тройки ASCII-кода
SHL AX,CL
MOV [DI],AH ;Записать BCD-цифру
DEC SI
DEC SI
DEC DI
DEC DX
JNZ B20
RET
B10CONV ENDP
; Сложение BCD-чисел
; ------------------
C10ADD PROC
XOR AH,AH ;Очистить АН
LEA SI,BCD1+2 ;Инициализация BCD адресов
LEA DI,BCD2+2
LEA BX,BCD3+3
MOV CX,03 ;Трехбайтовые поля
CLC
C20: MOV AL,[SI] ;Получить BCD1
ADC AL,[DI] ;Прибавить BCD2
DAA ;Десятичная коррекция
MOV [BX],AL ;Запись в BCD3
DEC SI
DEC DI
DEC BX
LOOP C20 ;Циклить 3 раза
RET
C10ADD ENDP
CODESG ENDS
END BEGIN
В программе выполняется преобразование чисел из ASCII-формата в BCD-формат и сложение их. Процедура B10CONV преобразует ASCII в BCD.
Процедура C10ADD выполняет сложение чисел в BCD-формате. Окончательный результат - 127263.
Команда XCHG AH,AL переставляет два байта местами.
5.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.
5.3. Выполните трассировку программы. Перед первой процедурой B10CONV порверьте сегмент кодов. Проверяйте сегмент кодов после каждого цикла в каждой процедуре. Выводы о работе программы запишите в отчет.