- •Машинное исполнение
- •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. Передача параметров.
6. Сдвиг регистровой пары dx:ax.
6.1. Составьте в текстовом редакторе NORTON программу exdxax.asm в СОМ-формате:
MAIN PROC NEAR
MOV AX,4100H
MOV DX,30H
; Сдвиг влево на 4 бита
; ---------------------
MOV CX,04 ;4 цикла
C20: SHL DX,1 ;DX на 1 бит влево
SHL AX,1 ;AX на 1 бит влево
ADC DX,00 ;Плюс перенос
LOOP C20 ;Повторить
; Сдвиг вправо на 4 бита
; ----------------------
MOV CX,04 ;4 цикла
D20: SHR AX,1 ;AX на 1 бит вправо
SHR DX,1 ;DX на 1 бит вправо
JNC D30 ;Если есть перенос
OR AH,10000000B ;то 1 в АН
D30: LOOP D20 ;Повторить
; Сдвиг влево без цикла
; ---------------------
MOV CL,04 ;Установить фактор сдвига
SHL DX,CL ;DX влево на 4 бита
MOV BL,AH ;Сохранить АН в BL
SHL AX,CL ;AX влево на 4 бита
SHR BL,CL ;BL вправо на 4 бита
OR DL,BL ;4 бита из BL в DL
RET
MAIN ENDP
6.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.
6.3. Выполнить трассировку программы внимательно отслеживая содержимое регистров AX, DX, BX и CX, а также флаг переноса. Выводы о выполнении программы записать в отчет.
7. Деление.
7.1. Запишите в текстовом редакторе NORTON программу exdiv.asm в СОМ-формате:
.286
TITLE EXDIV (COM) Пример операций DIV и IDIV
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
ORG 100H ;Начало в конце PSP
BEGIN: JMP SHORT MAIN ;Обход через данные
;-------------------------------------------------------
BYTE1 DB 80H ;Элементы данных
BYTE2 DB 16H
WORD1 DW 2000H
WORD2 DW 0010H
WORD3 DW 1000H
;--------------------------------------------------------
MAIN PROC NEAR ;Основная процедура
CALL D10DIV ;Вызов п/п DIV
CALL E10IDIV ;Вызов п/п IDIV
CALL F10SHR ;Вызов п/п SHR
RET
MAIN ENDP
; Примеры с командой DIV
; ----------------------
D10DIV PROC
MOV AX,WORD1 ;Слово / байт
DIV BYTE1 ;ост:частное в AH:AL
MOV AL,BYTE1 ;Байт / байт
SUB AH,AH ;расшир. делимое а АН
DIV BYTE2 ;ост:частное в AH:AL
MOV DX,WORD2 ;Двойное слово / слово
MOV AX,WORD3 ;делимое в DX:AX
DIV WORD1 ;ост:частное в DX:AX
MOV AX,WORD1 ;Слово / слово
SUB DX,DX ;расшир. делимое в DX
DIV WORD3 ;ост:частное в DX:AX
RET
D10DIV ENDP
; Пример с командой IDIV
; ----------------------
E10IDIV PROC
MOV AX,WORD1 ;Слово / байт
IDIV BYTE1 ;ост:частное в AH:AL
MOV AL,BYTE1 ;Байт / байт
CBW ;расшир. делимое в АН
IDIV BYTE2 ;сот:частное в AH:AL
MOV DX,WORD2 ;Двойное слово / слово
MOV AX,WORD3 ;Делимое в DX:AX
IDIV WORD1 ;ост:частное в DX:AX
MOV AX,WORD1 ;Слово / слово
CWD ;расшир. делимое в DX
IDIV WORD3 ;ост:частное в DX:AX
RET
E10IDIV ENDP
; Пример деления на степень
; -------------------------
F10SHR PROC
MOV AX,256
SHR AX,1 ;Деление на 2
MOV CL,3
SHR AX,CL ;Деление на 8
RET
F10SHR ENDP
CODESG ENDS
END BEGIN
В процедуре D10DIV дано четыре примера деления: слова на байт, байта на байт, двойного слова на слово и слова на слово. Первый пример команды DIV делит 2000Н (8092) на 80Н (128). В результате остаток 00 получается в регистре АН, а частное 40Н (64) - в регистре AL.
Во втором примере команды DIV выполняется прежде расширение байта BYTE1 до размеров слова. Так как здесь предполагается беззнаковая величина, то в примере левый бит регистра АН равен нулю. В результате деления остаток - 12Н получается в регистре АН, а частное 05Н - в регистре AL.
Третий пример команды DIV генерирует остаток 1000Н в регистре DX и частное 0080Н в регистре АХ.
В четвертом примере команды DIV сначала выполняется расширение слова WORD1 до двойного слова в регистровой паре DX:AX. После деления остаток 0000Н получится в регистре DX, а частное 0002Н – в регистре АХ.
В процедуре E10IDIV используются те же четыре примера деления, что и в процедуре D10DIV, но вместо команд DIV записаны команды IDIV. Первый пример команды IDIV делит 2000Н (положительное число) на 80Н (отрицательное число). Остаток деления 00Н получается в регистре АН, а частное - С0 (-64) - в регистре AL.
Шестнадцатиричные результаты трех остальных примеров деления следующие:
Пример команды IDIV Остаток Частное
2 ЕЕ (-18) FB (-5)
3 1000 (4096) 0080 (128)
4 0000 0002
Процедура F10SHR показывает пример деления на степень числа 2 (2,4 и т.д.).
7.2. Выполнить ассемблирование и компоновку программы. Записать листинг программы в отчет. Вызвать отладчик DEBUG на выполнение программы.
7.3. Выполнить трассировку программы внимательно отслеживая содержимое регистров AX и DX. Выводы о работе программы записать в отчет.