- •Машинное исполнение
- •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. Рассмотрим пример в котором значения 0123 и 0025 определены в сегменте данных. Доступ к сегменту данных осуществляется посредством регистра DS и адресного смещения. Разместим значения в ячейках памяти следующим образом:
Адрес в DS Шестнадцатиричные значения Номера байтов
(обратный код)
0000 2301 0 и 1
0002 2500 2 и 3
0004 0000 4 и 5
0006 2A2A2A 6, 7 и 8
Программа для обработки этих данных на машинном языке выглядит следующим образом:
Команда Назначение
A10000 Переслать слово (два байта), начинающееся в DS по адресу 0000, в регистр AX.
03060200 Прибавить содержимое слова (двух байт), начинающегося в DS по адресу 0002, к регистру AX.
A30400 Переслать содержимое регистра AX в слово, начинающееся в DS по адресу 0004.
CB Вернуться в DOS.
Для ввода данной программы ввести команду DOS(команду операционной системы), вызывающую отладчик:
DEBUG
3.2. Сначала введите две команды E для сегмента данных:
E DS:00 23 01 25 00 00 00
Эта команда вводит 0,1,2,3,4 и 5 байты данных в сегмент указанный в регистре DS со смещением 00.
E DS:06 2A 2A 2A
Эта команда вводит 6,7 и 8 байты данных в сегмент указанный в регистре DS со смещением 06.
3.3. Введите команды программы в сегмент кодов со смещением 100. Для этого также необходимо ввести две команды E:
E CS:100 A1 00 00 03 06 02 00
Эта команда вводит первые две команды исходной программы.
E CS:107 A3 04 00 CB
Эта команда отладчика вводит последние две команды исходной программы.
3.4. Для просмотра информации в сегменте данных и в сегменте кодов введите две команды отладчика D:
D DS:000
Для просмотра сегмента данных.
D CS:100
Для просмотра сегмента кодов.
В сегменте данных байт информации 2A является кодом символа *, что видно в строке в правой части экрана для первого параграфа дампа данных.
3.5. Введите команду отладчика R для просмотра содержимого регистров и флагов и для отображения первой команды введенной программы. На языке Ассемблер первая команда обозначается MOV AX,[0000], это означает что данные берутся из ячейки с адресом 0000 относительно начала сегмента данных и пересылаются в регистр AX.
3.6. С помощью команд отладчика T выполните трассировку программы. Последняя выполняемая команда должна быть команда RETF. Будьте внимательны!
3.7. С помощью команды отладчика D выведите на дисплей дамп сегмента данных. Объясните какие изменения произошли в первом параграфе сегмента и почему.
3.8. Для завершения работы с программой и выхода из DEBUG в DOS введите команду отладчика Q.