- •Машинное исполнение
- •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. Команда jmp.
1.1. Одна из команд, обычно используемых для передачи управления - команда JMP. Эта команда выполняет безусловный переход, т.е. обеспечивает передачу управления при любых обстоятельствах.
Создать файл exjump.asm и записать в него следующую программу в COM-формате:
.286
TITLE EXJUMP (COM) Организация цикла с помощью JMP
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;Инициализация АХ
MOV BX,01 ;Инициализация ВХ
MOV CX,01 ;Инициализация СХ
A20: ADD AX,01 ;Прибавить 01 к АХ
ADD BX,AX ;Прибавить АХ к ВХ
SHL CX,1 ;Удвоить СХ
JMP A20 ;Переход на А20
MAIN ENDP
CODESG ENDS
END MAIN
В этой программе выполняется цикл. Начало цикла имеет метку, в данном случае А20: - двоеточие обозначает, что метка находится внутри процедуры (В данном случае MAIN) в сегменте кода. В конце цикла находится команда JMP A20, указывающая на то, что управление должно быть передано команде с меткой А20. Обратите внимание, адресная метка в операнде команды указывается без двоеточия. Данный цикл не имеет выхода и приводит к бесконечному выполнению - такие циклы обычно не используются.
Адрес А20 указывает на первый байт команды ADD AX,01. Двоеточие в метке А20 означает тип метки - NEAR.
1.2. Просмотреть листинг программы с помощью текстового редактора LEXICON и записать его в отчет. Определить код команды JMP и ее операнд. Операнд команды, размером в один байт, представляет отрицательное число. Преобразовать операнд в двоичную и перевести число из отрицательного в положительное, затем обратно преобразовать число в шестнадцатиричную систему счисления. Полученное число вычесть из содержимого командного указателя, которое устанавливается после выполнения команды JMP (IP=0112). Объяснить полученный результат.
1.3. Используйте отладчик DEBUG для пошагового выполнения COM-модуля и просмотрите несколько повторений цикла. Когда регистр АХ будет содержать 08, ВХ и СХ увеличатся до 24Н (36) и 80Н (128) соответственно. Для выхода из отладчика используйте команду Q.
2. Команда loop.
2.1. Команда LOOP применяется когда требуется прерывание выполняемого цикла. Эта команда использует начальное значение в регистре СХ. В каждом цикле команда LOOP автоматически уменьшает содержимое регистра СХ на 1. Пока значение в СХ не равно нулю, управление передается по адресу, указанному в операнде, и если в СХ будет 0, управление переходит на следующую после LOOP команду.
2.2. Записать в текстовом редакторе NORTON следующую программу:
.286
TITLE EXLOOP (COM) Организация цикла командой LOOP
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
ORG 100H
BEGIN PROC NEAR
MOV AX,01 ;Инициализация АХ
MOV BX,01 ;Инициализация ВХ
MOV DX,01 ;Инициализация DХ
MOV CX,10 ;Число циклов
A20: INC AX ;Прибавить 01 к АХ
ADD BX,AX ;Прибавить АХ к ВХ
SHL DX,1 ;Удвоить DХ
LOOP A20 ;Уменьшить СХ и повторить цикл,
;если не нуль
RET ;Завершить работу
BEGIN ENDP
CODESG ENDS
END BEGIN
Эта программа завершается после десяти циклов. Команда MOV инициализирует регистр СХ значением 10. Так как команда LOOP использует СХ, то в программе для удвоения начального значения 1 вместо регистра СХ используется DX. Кроме того для увеличения АХ на 1 используется команда INC.
2.3. Выполнить ассемблирование программы exloop.asm с получением листинга. Просмотреть листинг в текстовом редакторе и записать его в отчет. Определить операнд команды LOOP. Операнд является отрицательным числом, перевести его в положительное число. Из содержимого командного указателя после выполнения команды LOOP вычесть операнд. Объяснить полученный результат.
2.4. Выполнить компоновку и преобразование COM-файл. Для трассировки всех десяти циклов используйте отладчик DEBUG. Определите, какое значение будет в регистрах АХ, ВХ и DX когда значение в регистре СХ уменьшится до нуля. Определите, как изменяется содержимое регистра СХ при выполнении команды LOOP. Определите, как изменяется содержимое командного указателя IP при выполнении
команды LOOP.
2.5. Для выхода из отладчика введите команду Q.