- •Машинное исполнение
- •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. Сложение в ascii-формате.
1.1. Запишите в текстовом редакторе NORTON программу ascadd.asm в COM-формате:
.286
TITLE ASCADD (COM) Сложение в ASCII-формате
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
ASC1 DB '578' ;Элементы данных
ASC2 DB '694'
ASC3 DB '0000'
;--------------------------------------------------------
MAIN PROC NEAR
CLC
LEA SI,ASC1+2 ;Адреса ASCII-чисел
LEA DI,ASC2+2
LEA BX,ASC3+3
MOV CX,03 ;Выполнить 3 цикла
A20: MOV AH,00 ;Очистить регистр АН
MOV AL,[SI] ;Загрузить ASCII-байт
ADC AL,[DI] ;Слож. (с переносом)
AAA ;Коррекция для ASCII
PUSHF ;Сохранение флагов
OR AL,30H ;Запись левой тройки
POPF ;Восстановление флагов
MOV [BX],AL ;Сохранение суммы
DEC SI
DEC DI
DEC BX
LOOP A20 ;Циклиться 3 раза
MOV [BX],AH ;Сохранить перенос
RET
MAIN ENDP
CODESG ENDS
END BEGIN
Команда CLC устанавливает флаг CF в нулевое состояние.
В программе используется команда ADC, так как любое сложение может вызвать перенос, который должен быть прибавлен к следующему (слева) байту.
Команда MOV очищает регистр АН в каждом цикле, так как команда ААА может прибавить к нему единицу.
Когда завершается каждый цикл, происходит пересылка содержимого регистра АН (00 или 01) в левый байт суммы.
В результате выполнения программы получается сумма в виде 01020702. Программа использует команду OR после команды ААА для занесения левой тройки. При выполнении команды OR может измениться флаг CF, что изменит результат команды ADC. Для того, чтобы этого не произошло, перед командой OR все флаги запоминаются с помощью команды PUSHF, а после выполнения команды OR все флаги восстанавливаются с помощью команды POPF. Таким образом влияние
команды OR на флаг CF исключается.
1.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.
1.3. Просмотреть сегмент кодов (D CS:100) перед выполнением команды CLC. Выполнить трассировку определяя, как изменяется содержимое регистров АН, AL, CX, SI, DI, BX. Внимательно следите за изменением флага переноса CF. Перед каждой командой LOOP проверяйте сегмент кодов. Выводы о работе программы запишите в отчет.
2. Вычитание в ascii-формате.
2.1. Составьте программу ascsub.asm в текстовом редакторе NORTON в СОМ-формате:
;-------------------------------------------------------
ASC1 DB 38H ;Элементы данных
ASC2 DB 34H
;--------------------------------------------------------
MAIN PROC NEAR
; Пример 1
; --------
MOV AL,ASC1
SUB AL,ASC2
AAS
; Пример 2
; --------
MOV AL,ASC2
SUB AL,ASC1
AAS
RET
MAIN ENDP
CODESG ENDS
END BEGIN
В примере 1 данные не нуждаются в коррекции по команде AAS (при выполнении команды изменений не происходит). В примере 2 после вычитания правая цифра в регистре AL равна С, команда AAS вычитает 6 из регистра AL (С-6=6) и 1 из регистра АН (00-1=FF) и устанавливает в 1 флаг CF. Число FF06 это закодированное -4.
2.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG для выполнения программы.
2.3. Выполнить трассировку программы внимательно определяя изменения содержимого регистра AL. Выводы о работе записать в отчет.