- •Машинное исполнение
- •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. Передача параметров.
2. Табличный поиск.
2.1. Записать в текстовом редакторе NORTON следующую программу в СОМ-формате:
.286
TITLE TABSRC1 (COM) Табличный поиск
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
STOKNIN DW '23' ;Элементы данных
STOKTAB DB '05','Excavators'
DB '08','Lifters '
DB '09','Presses '
DB '12','Valves '
DB '23','Processors'
DB '27','Pumps '
DESCRN DB 10 DUP(?)
;--------------------------------------------------------
MAIN PROC NEAR
MOV AX,STOKNIN ;Загр. N элемента
XCHG AL,AH
MOV CX,06 ;Число элементов
LEA SI,STOKTAB ;Начальный адрес
A20: CMP AX,[SI] ;Сравнить элементы
JE A30 ;Если равны - выйти
ADD SI,12 ;нет - следующий
LOOP A20
CALL R10ERR ;Элем. в табл. не найден
RET
A30: MOV CX,05 ;Длина описания элем.
LEA DI,DESCRN ;Адрес описания элем.
INC SI
INC SI
REP MOVSW ;Выделить описание из таблицы
RET
MAIN ENDP
R10ERR PROC
RET ; <Вывод сообщения об ошибке>
R10ERR ENDP
CODESG ENDS
END BEGIN
Программа определяет таблицу и выполняет табличный поиск. Таблица содержит шесть пар номеров и наименований. Цикл поиска начинается со сравнения введенного номера в поле STOKNIN с первым номером в таблице. Если номера различные, то адрес в таблице увеличивается для сравнения со следующим номером. Если номера равны, то программа (А30) выделяет наименование из таблицы и записывает
его в поле DESCRN.
Поиск выполняет максимум шесть сравнений, и если требуемый номер в таблице отсутствует, то происходит переход на программу обработки ошибки R10ERR (сама процедура не приводится).
В начале программы имеется команда, которая пересылает содержимое поля STOKNIN в регистр АХ. Хотя STOKNIN определено в сегменте кодов как 3332, команда MOV загрузит в регистр АХ это значение в прямой последовательности байтов 3233. Так как элементы таблицы в сегменте кодов имеют обратную последовательность байтов, то после команды MOV имеется команда XCHG, которая меняет местами байты в регистре АХ, возвращая им обратную последовательность, т.е. 3332. Команда CMP сравнивает сначала правые байты, а затем левые. Следовательно, проверка на равенство будет корректной, но проверки на больше или меньше дадут неправильные результаты.
2.2. Выполнить ассемблирование и компоновку программы. Листинг программы записать в отчет.
2.3. Вызвать отладчик DEBUG на выполнение программы. Выполнить трассировку программы до команды REP MOVSW. Просмотреть сегмент кодов. После каждого шага выполнения команды REP MOVSW просматривать сегмент кодов. Выводы о работе программы записать в отчет.
2.4. С помощью текстового редактора изменить начало программы tabsrc.asm до команды ADD SI,12:
MOV AX,STOKNIN
MOV CX,06
LEA SI,STOKTAB
A20: MOV BX,[SI]
XCHG BL,BH
CMP AX,BX
JA A30
В этом примере программа будет выполнять сравнение на меньше. Элемент таблицы пересылается командой MOV в регистр ВХ. Команда XCHG меняет байты в регистре BX. Затем сравнивается содержимое регистров АХ и ВХ.
2.5. Выполнить ассемблирование и компоновку программы. Листинг программы записать в отчет.
2.6. Вызвать отладчик DEBUG на выполнение программы. Просмотреть сегмент кодов перед трассировкой программы. Выполнить трассировку программы до команды REP MOVSW. Проверить сегмент кодов после выполнения команды REP MOVSW. Выводы о выполнении программы записать в отчет.