
- •Машинное исполнение
- •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. Записать в текстовом редакторе NORTON следующую программу в EXE-формате:
.286
TITLE CALLPR (EXE) Вызов процедур
;-------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
;-------------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR
ASSUME CS:CODESG,SS:STACKSG
PUSH DS ;Записать DS в стек
SUB AX,AX ;Записать в стек
PUSH AX ;нулевой адрес
CALL B10 ;Вызвать В10
MOV DS,AX ;в регистр DS
MOV AX,0250 ;Переслать 0250 в АХ
ADD AX,0125 ;Прибавить 0125 к АХ
MOV CX,AX ;Записать сумму в CX
RET ;Вернуться в DOS
BEGIN ENDP
;--------------------------------------------------------
B10 PROC
CALL C10 ;Вызвать С10
SUB AX,AX
SUB CX,CX
RET ;Вернуться в вызывающую программу
B10 ENDP
;---------------------------------------------------------
C10 PROC
ADD AX,1
MOV BX,AX
INC BX
RET ;Вернуться в вызывающую программу
C10 ENDP
;-----------------------------------------------------------
CODESG ENDS
END BEGIN
Команда CALL автоматически записывает в стек относительный адрес команды, следующий непосредственно за командой CALL, уменьшая при этом указатель вершины стека. В вызываемой процедуре команда RET использует этот адрес для возврата в вызывающую процедуру и при этом автоматически увеличивается указатель вершины стека.
При передаче управления в ЕХЕ-программу в регистрах микропроцессора устанавливаются следующие значения:
DS и ES: Адрес префикса программного сегмента - область в 256 (100Н) байт, которая предшествует выполняемому программному модулю в памяти.
CS: Адрес точки входа в программу (адрес первой выполняемой команды).
IP: Нуль.
SS: Адрес сегмента стека.
SP: Относительный адрес, указывающий на вершину стека.
3.2. Выполните ассемблирование программы callpr.asm с получением листинга. Запишите листинг в отчет. Выполните компоновку программы.
3.3. Вызовите отладчик DEBUG для пошагового выполнения программы. С помощью команды R просмотрите начальное состояние регистров микропроцессора. С помощью команды D SS:00 просмотрите сегмент стека. Параграфы, отведенные под стек должны быть обнулены. Определите адрес по которому кончается стек и сравните этот адрес с содержимым указателя вершины стека SP. Введите команду Т,
после чего выполнится первая команда PUSH. Определите, как изменилось содержимое указателя вершины стека SP. Проверьте записалось ли содержимое регистра DS в стек, просмотрев еще раз сегмент стека.
Обратите внимание, слова в стек записываются в обратной последовательности, например, 00 07 записывается в виде 07 00. Отладчик DEBUG при использовании его для просмотра стека заносит в стек другие значения, включая содержимое IP, для собственных нужд.
3.4. Продолжая пошаговый режим выполните вторую команду PUSH. Определите, как изменилось содержимое указателя вершины стека и проверьте записался ли нулевой результат из регистра АХ в стек, еще раз просмотрев сегмент стека.
3.5. Выполните команду CALL B10. Определите, как изменилось содержимое указателя вершины стека и какое новое число записалось в стек. Это число является адресом возврата после окончания процедуры CALL B10. Найдите этот адрес по листингу программы и определите команду на которую перейдет микропроцессор после окончания процедуры CALL B10. Сама команда CALL B10 вызывает процедуру B10, первой командой которой является команда CALL C10.
3.6. Выполните команду CALL C10. Определите, как изменилось содержимое указателя вершины стека и какое новое число записалось в стек. Выводы запишите в отчет.
3.7. Продолжая пошаговый режим, выполните команду RET процедуры С10. Определите, как изменилось содержимое указателя вершины стека SP, какое число записалось в регистр команд IP, какое число исчезло из стека. Проверьте по листингу, какая команда находится по адресу, указанному в регистре команд IP. Выводы запишите в отчет.
3.8. Продолжая пошаговый режим, выполните команду RET процедуры B10. Определите, как изменилось содержимое указателя вершины стека SP, какое число записалось в регистр команд IP, какое число исчезло из стека. Проверьте по листингу, какая команда находится по адресу, указанному в регистре команд IP. Выводы запишите в отчет.
3.9. Для выхода из отладчика введите команду Q.