- •Машинное исполнение
- •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 следующую программу в ЕХЕ-формате(string.asm):
286 TITLE STRING (EXE) Строковые операции
;----------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
;-----------------------------------------------
DATASG SEGMENT PARA 'Data'
NAME1 DB 'Assemblers' ;Элементы данных
NAME2 DB 10 DUP(' ')
NAME3 DB 10 DUP(' ')
DATASG ENDS
;------------------------------------------------
CODESG SEGMENT PARA 'Code'
BEGIN PROC FAR ;Основная процедура
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATASG
MOV DS,AX
MOV ES,AX
CALL C10MVSB
CALL D10MVSW ;Подпрограмма MVSB
CALL E10LODS ;Подпрограмма MVSW
CALL F10STOS ;Подпрограмма LODS
CALL G10CMPS ;Подпрограмма CMPS
CALL H10SCAS ;Подпрограмма SCAS
RET
BEGIN ENDP
; Использование MOVS
; ------------------
C10MVSB PROC NEAR
CLD
LEA SI,NAME1
LEA DI,NAME2
MOV CX,10 ;Переслать 10 байтов
REP MOVSB ;из NAME1 в NAME2
RET
C10MVSB ENDP
; Использование MOVSW
; -------------------
D10MVSW PROC NEAR
CLD
LEA SI,NAME2
LEA DI,NAME3
MOV CX,05 ;Переслать 5 слов
REP MOVSW ;из NAME2 в NAME3
RET
D10MVSW ENDP
; Использование LODSW
; -------------------
E10LODS PROC NEAR
CLD
LEA SI,NAME1 ;Загрузить 1 4-е 0 слово
LODSW ; из NAME1 в АХ
RET
E10LODS ENDP
; Использование STOSW
; -------------------
F10STOS PROC NEAR
CLD
LEA DI,NAME3
MOV CX,05
MOV AX,2020H ;Переслать пробелы
REP STOSW ;в NAME3
RET
F10STOS ENDP
; Использование CMPSB
; -------------------
G10CMPS PROC NEAR
CLD
MOV CX,10
LEA SI,NAME1
LEA DI,NAME2
REPE CMPSB ;Сравн. NAME1 и NAME2
JNE G20 ;Не равны?
MOV BH,01
G20: MOV CX,10
LEA SI,NAME2
LEA DI,NAME3
REPE CMPSB ;Сравн. NAME2 и NAME3
JE G30 ;Если равны, то выйти
MOV BL,02
G30: RET
G10CMPS ENDP
; Использование SCASB
; -------------------
H10SCAS PROC NEAR
CLD
MOV CX,10
LEA DI,NAME1
MOV AL,'m' ;Поиск символа 'm'
REPNE SCASB ; в NAME1
JNE H20 ;Если нет - выйти
MOV AH,03
H20: RET
H10SCAS ENDP
CODESG ENDS
END BEGIN
Процедура C10MVSB использует команду MOVSB для пересылки содержимого десятибайтового поля NAME1 в поле NAME2. Первая команда CLD сбрасывает флаг направления в 0 для обеспечения процесса пересылки слева направо. Две команды LEA загружают регистры SI и DI относительными адресами NAME1 и NAME2 соответственно. Команда MOV заносит в регистр СХ значение 10 - длину полей NAME1 и NAME2. Команда REP MOVS выполняет следующее: а) пересылает самый левый
байт поля NAME1 в самый левый байт NAME2, б) увеличивает на 1 адреса в регистрах DI и SI для следующего байта, в) уменьшает СХ на 1, г) повторяет перечисленные действия (в данном случае 10 раз), пока содержимое регистра СХ не станет равным нулю.
В процедуре D10MVSW используется команда MOVSW, пересылающая одно слово за одно выполнение. Так как команда MOVSW увеличивает адреса в регистрах DI и SI на 2, операция требует только пять
циклов.
Процедура E10LODS демонстрирует использование команды LODS. По этой команде обрабатывается только одно слово: первый байт из области NAME1 заносится в регистр AL, а второй байт - в регистр АН.
Процедура F10STOS демонстрирует использование команды STOSW. Операция осуществляет запись пробелов (2020) пять раз в область NAME3.
В процедуре G10CMPS команда CMPS сравнивает содержимое одной области памяти с содержимым другой области. В зависимости от флага DF команда CMPS также увеличивает или уменьшает адреса в регистрах SI и DI на 1 для байта или на 2 для слова. Команда CMPS устанавливает флаг ZF (ZR - 1 если равно, NZ - 0 если не равно). При использовании префикса REP в регистре СХ должно находиться
значение длины сравниваемых полей. Команда CMPS может сравнивать любое число байтов или слов. Использование префикса REPE (REPZ) означает прекращение выполнения команды CMPS сразу же после первого сравнения с результатом "не равно".
В процедуре H10SCAS команда SCAS сканирует (просматривает) строку на определенное значение байта или слова. Команда SCAS сравнивает содержимое области памяти NAME1 с содержимым регистра AL. В зависимости от значения флага DF команда SCAS также увеличивает или уменьшает адрес в регистре DI на 1 для байта или на 2 для слова. Команда SCAS устанавливает флаг ZF (ZR - 1 если прове-
ряемый символ соответствует символу в области памяти). Префикс REPNE(REPNZ) обеспечивает повторение команды SCAS до тех пор пока результатом сканирования будет "не равно". Как только будет получен результат "равно", флаг ZF будет установлен в 1 (ZR). При использовании префикса REP и значения длины в регистре СХ команда SCAS может сканировать строки любой длины.
2.2. Выполнить ассемблирование и компоновку программы. Листинг программы записать в отчет.
2.3. Вызвать отладчик DEBUG для выполнения программы string.exe. Выполнить трассировку до команды CALL C10MVSB. Просмотреть сегмент данных введя команду D DS:00 и продолжить трассировку, выполнив команду REP MOVSB пять раз. Снова просмотреть сегмент данных, и продолжить трассировку до следующей процедуры D10MVSW. Выводы записать в отчет.
2.4. Продолжить трассировку, выполнив команду REP MOVSW три раза. Снова просмотреть сегмент данных, и продолжить трассировку до следующей процедуры E10LODS. Выводы записать в отчет.
2.5. Продолжить трассировку до следующей процедуры F10STOS. Определить какие изменения произошли в регистре АХ. Выводы записать в отчет.
2.6. Продолжить трассировку до следующей процедуры G10CMPS. Просмотреть сегмент данных. Выводы записать в отчет.
2.7. Продолжить трассировку до следующей процедуры H10SCAS. Объяснить, как выполняются команды: CMPSB, JNE и JE. Объяснить изменения, происходящие в регистре ВХ и изменение флага ZF. Выводы записать в отчет.
2.8. Продолжить трассировку до конца программы. Объяснить изменения в регистрах АХ и СХ, а также изменения флага ZF. Выводы записать в отчет. Выйти из отладчика.