- •Машинное исполнение
- •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. В данном разделе изучим пересылку данных, которые имеют длину более двух байт.
В текстовом редакторе NORTON запишите следующую программу в ЕХЕ-формате:
.286
TITLE EXMOVE (EXE) Расширенная пересылка
;-------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
;-------------------------------------------------------
DATASG SEGMENT PARA 'Data'
NAME1 DB 'ABCDEFGHI'
NAME2 DB 'JKLMNOPQR'
NAME3 DB 'STUVWXYZ*'
DATASG ENDS
;--------------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
PUSH DS ;Записать DS в стек
SUB AX,AX ;Записать в стек
PUSH AX ;нулевой адрес
MOV AX,DATASG ;Поместить адрес DATASG
MOV DS,AX ;в регистр DS
MOV ES,AX
CALL B1OMOVE ;Вызвать п/п
CALL C1OMOVE ;Вызвать п/п
RET ;Вернуться в DOS
BEGIN ENDP
; Расширенная пересылка,
; использующая переход по условию:
;------------------------------------------------------------
B1OMOVE PROC
LEA SI,NAME1 ;Инициализация адресов
LEA DI,NAME2 ;NAME1 и NAME2
MOV CX,09 ;Переслать 9 символов
B20: MOV AL,[SI] ;Переслать из NAME1
MOV [DI],AL ;Переслать в NAME2
INC SI ;Следующ.симв.в NAME1
INC DI ;Следующ.поз. в NAME2
DEC CX ;Уменьшить сч. цикла
JNZ B20 ;Счетчик > 0? Да-цикл
RET ;Если счетчик = 0, то вернуться
B1OMOVE ENDP
; Расширенная пересылка,
; использующая команду LOOP
;----------------------------------------------------------
C1OMOVE PROC
LEA SI,NAME2 ;Инициализация адресов
LEA DI,NAME3 ;NAME2 и NAME3
MOV CX,09 ;Переслать 9 символов
C20: MOV AL,[SI] ;Переслать из NAME2
MOV [DI],AL ;Переслать в NAME3
INC SI ;Следующ.симв.в NAME2
INC DI ;Следующ.поз. в NAME3
LOOP C20 ;Уменьшить счетчик,
;если не 0, то цикл
RET ;Если счетчик = 0, то вернуться
C1OMOVE ENDP
CODESG ENDS
END BEGIN
Сегмент данных содержит три девятибайтовых поля: NAME1, NAME2, NAME3. Цель программы - переслать данные из поля NAME1 в поле NAME2 и переслать данные из поля NAME2 в поле NAME3. Так как эти поля имеют длину девять байт каждое, то для пересылки данных кроме простой команды MOV требуются еще другие команды.
Процедура BEGIN инициализирует сегментные регистры и затем вызывает процедуры B1OMOVE и C1OMOVE. Процедура B1OMOVE пересылает содержимое поля NAME1 в поле NAME2. Так как каждый раз пересылается только один байт, то процедура начинает с самого левого байта в поле NAME1 и в цикле пересылает затем второй байт, третий и т.д.
Для продвижения в полях NAME1 и NAME2 в регистр СХ заносится значение 9, а регистры SI и DI используются в качестве индексных. Две команды LEA загружают относительные адреса полей NAME1 и NAME2 в регистры SI и DI.
Для пересылки содержимого первого байта из поля NAME1 в первый байт поля NAME2 используются адреса в регистрах SI и DI. Квадратные скобки в командах MOV означают, что для доступа к памяти используется адрес в регистре, указанном в квадратных скобках. Таким образом, команда MOV AL,[SI] означает: использовать адрес в регистре SI (т.е.NAME1) для пересылки соответствующего
байта в регистр АL. И команда MOV [DI],AL означает: переслать содержимое регистра AL по адресу, лежащему в регистре DI (т.е.NAME2).
Следующие команды увеличивают значения регистров SI и DI и уменьшают значение в регистре СХ. Если в регистре СХ не нулевое значение, управление передается на следующий цикл (на метку В20). Так как содержимое регистров SI и DI было увеличено на 1, то следующие команды MOV будут иметь дело с адресами NAME1+1 и NAME2+1. Цикл продолжается таким образом, пока не будет передано содержимое NAME1+8 и NAME2+8.
Команда JNZ выполняет переход на метку В20, если в результате выполнения команды DEC CX получится результат, отличный от нуля. Команда DEC CX уменьшает содержимое регистра СХ на 1.
Процедура С1OMOVE аналогична процедуре B1OMOVE с двумя исключениями: она пересылает данные из поля NAME2 в поле NAME3 и использует команду LOOP вместо DEC и JNZ.
4.2. Выполните ассемблирование и компоновку программы. Листинг программы запишите в отчет.
4.3. Вызовите отладчик DEBUG на выполнение программы exmove.exe.
4.4. Проведите пошаговое выполнение команд до первой команды CALL. При этом, в регистр DS загрузится начальный адрес сегмента данных. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.5. Продолжите пошаговое выполнение команд до метки В20. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.6. Продолжите пошаговое выполнение команд до первой команды INC. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.7. Продолжите пошаговое выполнение команд до команды JNZ. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.8. Выполните команду JNZ. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.9. Выполните полный цикл до команды JNZ, продолжая пошаговое выполнение команд. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.10. Продолжите пошаговое выполнение команд, выполните все оставшиеся циклы, до выполнения команды RET. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.11. Выполните команду RET. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.12. Выполните команду CALL. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.13. Выполните полный цикл до команды LOOP, продолжая пошаговое выполнение команд. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.14. Выполните команду LOOP. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.15. Выполните программу до конца. Последнюю команду RET не выполнять. Определите, какие изменения произошли в регистрах микропроцессора, просмотрите, что записано в сегменте данных вводом команды D DS:00, просмотрите, что записано в сегменте стека вводом команды D SS:00. Выводы запишите в отчет.
4.16. Выйдите из отладчика, введя команду Q.