- •Машинное исполнение
- •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. Программа: сортировка элементов таблицы.
6.1. Записать в текстовом редакторе NORTON следующую программу в ЕХЕ-формате:
.286
TITLE NMSORT (EXE) Ввод и сортировка имен
;----------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
;-----------------------------------------------
DATASG SEGMENT PARA 'Data'
NAMEPAR LABEL BYTE ;Имя списка парам.
MAXNLEN DB 21 ;Макс. длина
NAMELEN DB ? ;Число введ. символов
NAMEFLD DB 21 DUP(' ') ;Имя
CRLF DB 13,10,'$'
ENDADDR DW ?
MESSG1 DB 'Name?','$'
NAMECTR DB 00
NAMETAB DB 30 DUP(20 DUP(' ')) ;Таблица имен
NAMESAV DB 20 DUP(?),13,10,'$'
SWAPPED DB 00
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
CLD
LEA DI,NAMETAB
CALL Q10CLR ;Очистить экран
CALL Q20CURS ;Установить курсор А20
A20: CALL B10READ ;Ввести имя с клавиатуры
CMP NAMELEN,00 ;Есть еще имена?
JZ A30 ;Нет - идти на сортировку
CMP NAMECTR,30 ;Введено 30 имен?
JE A30 ;Да - идти на сортировку
CALL D10STOR ;Записать имя в таблицу
JMP A20
A30: CALL Q10CLR ;Конец ввода имен, очистить экран
CALL Q20CURS ;Установить курсор
CMP NAMECTR,01 ;Менее 2 имен?
JBE A40 ;Да - выйти
CALL G10SORT ;Сортировать имена
CALL K10DISP ;Вывести результат
A40: RET ;Завершить программу
BEGIN ENDP
; Ввод имен с клавиатуры
; ----------------------
B10READ PROC
MOV AH,09
LEA DX,MESSG1 ;Вывести текст запроса
INT 21H
MOV AH,0AH
LEA DX,NAMEPAR ;Ввести имя
INT 21H
MOV AH,09
LEA DX,CRLF ;Вывести CLRF
INT 21H
MOV BH,00 ;Очистить поле после имени
MOV BL,NAMELEN ;Получить счетный символ
MOV CX,21
SUB CX,BX ;Вычислить оставшуюся длину
B20: MOV NAMEFLD[BX],20H ;Пробел
INC BX
LOOP B20
RET
B10READ ENDP
; Запись имени в таблицу
; ----------------------
D10STOR PROC
INC NAMECTR ;Число имен в таблице
CLD
LEA SI,NAMEFLD
MOV CX,10
REP MOVSW ;Переслать имя в таблицу
RET
D10STOR ENDP
; Сортировка имен в таблице
; -------------------------
G10SORT PROC
SUB DI,40 ;Установить адрес останова
MOV ENDADDR,DI
G20: MOV SWAPPED,00 ;Установить начало таблицы
LEA SI,NAMETAB
G30: MOV CX,20 ;Длина сравнения
MOV DI,SI
ADD DI,20 ;Следующее имя
MOV AX,DI
MOV BX,SI
REPE CMPSB ;Сравнить имя со следующим
JBE G40 ;Нет перестановки
CALL H10XCHG ;Перестановка
G40: MOV SI,AX
CMP SI,ENDADDR ;Конец таблицы?
JBE G30 ;Нет - продолжить
CMP SWAPPED,00 ;Есть перестан.?
JNZ G20 ;Да - продолжить
RET ;Нет - конец
G10SORT ENDP
; Перестановка элементов таблицы
; ------------------------------
H10XCHG PROC
MOV CX,10
LEA DI,NAMESAV
MOV SI,BX
REP MOVSW ;Сохранить меньший элемент
MOV CX,10
MOV DI,BX
REP MOVSW ;Переслать больший элемент на место меньшего
MOV CX,10
LEA SI,NAMESAV
REP MOVSW; Переслать сохраненный элемент на место большего
MOV SWAPPED,01 ;Признак перестановки
RET
H10XCHG ENDP
; Вывод на экран отсорт. имена
; ----------------------------
K10DISP PROC
LEA SI,NAMETAB
K20: LEA DI,NAMESAV ;Начальный адрес таблицы
MOV CX,10
REP MOVSW
MOV AH,09
LEA DX,NAMESAV
INT 21H ;Вывести на экран
DEC NAMECTR ;Это последний элемент?
JNZ K20 ;Нет - повторить цикл
RET ;Да - выйти
K10DISP ENDP
; Очистка экрана
; --------------
Q10CLR PROC
MOV AX,0600H
MOV BH,61H ;Цвет (07 для ч/б)
SUB CX,CX
MOV DX,184FH
INT 10H
RET
Q10CLR ENDP
; Установка курсора
; -----------------
Q20CURS PROC
MOV AH,02
SUB BH,BH
SUB DX,DX ;Установить курсор в 0
INT 10H
RET
Q20CURS ENDP
CODESG ENDS
END BEGIN
Программа обеспечивает ввод с клавиатуры до 30 имен, сортировку введенных имен в алфавитном порядке и вывод на экран отсортированного списка имен.
6.2. Выполнить ассемблирование и компоновку программы. Листинг программы записать в отчет.
6.3. Запустить программу из панели NORTON. Выводы о работе программы записать в отчет.
СОДЕРЖАНИЕ ОТЧЕТА:
1. Листинги программ.
2. Выводы о работе программ.
КОНТРОЛЬНЫЕ ВОПРОСЫ:
1. Определите таблицу, содержащую 3 символьных значения - JANV,FEVR,MART.
Составьте команды для получения адреса второго элемента таблицы символьных значений FEVR в регистре SI по правилу прямого табличного доступа.
2. Определите таблицу, содержащую 3 числовых значения - 51,81,91.
Составьте команды для получения адреса элемента таблицы, имеющего значение 81 в регистре SI по правилу табличного поиска.
3. Определите таблицу, содержащую 3 символьных значения - JANV,FEVR,MART.
Составьте команды для получения адреса второго элемента таблицы FEVR в регистре SI по правилу табличного поиска с использованием сравнения строк.
4. Составить программу перекодировки десятичной цифры (от 0 до 9) в ASCII-код с использованием команды XLAT и таблицы перекодировки.
ОТВЕТЫ:
1. MONTAB DB 'JANV','FEVR','MART'
LEA SI,MONTAB
MOV AL,32H
XOR AL,30H
DEC AL
MUL 04
ADD SI,AL
2. COSTAB DB 51,81,91
MOV CX,03
A20: MOV AX,81
LEA SI,COSTAB
CMP AX,[SI]
JE A30
ADD SI,02
LOOP A20
A30: RET
3. MONTAB DB 'JANV','FEVR','MART'
STOKIN DB 'FEVR'
LEA SI,MONTAB
A20: MOV CX,04
LEA DI,STOKIN
REPE CMPSB
JE A30
ADD SI,CX
JMP A20
A30: RET
4. ASCNO DB 8
EBCNO DB DUP(' ')
XLTAB DB 30H,31H,32H,33H,34H
DB 35H,36H,37H,38H,39H
LEA SI,ASCNO
LEA DI,EBCNO
MOV CX,01
LEA BX,XLTAB
MOV AL,[SI]
XLAT
MOV [DI],AL
Л а б о р а т о р н а я р а б о т а N 10