- •1.Знакомство с программой-отладчиком Turbo Debugger. Выполнение простейших команд микропроцессора в среде Turbo Debugger.
- •1.1.Понятие отладки. Назначение программ-отладчиков
- •1.2.Запуск программы
- •1.3.Структура экрана программы Turbo Debugger
- •1.4.Регистры микропроцессора
- •1.5.Сложение беззнаковых величин
- •1.6.Вычитание беззнаковых величин
- •1.7.Операции с байтами
- •1.7.1.Умножение беззнаковых величин
- •1.7.2.Деление беззнаковых величин
- •1.7.3.Пересылка (копирование) данных
- •1.7.4.Понятие переполнения
- •1.7.5.Регистр флагов.
- •1.7.6.Флаг переноса
- •1.7.7.Использование флага переноса
- •1.7.7.1I. Сложение с использованием флага переноса.
- •2.Начальные сведения о языке Ассемблер
- •2.1.Аппаратная поддержка языка
- •2.1.1.Структура памяти
- •2.1.2.Сегментация памяти
- •2.2.Структура программы на языке Ассемблер
- •2.2.1.Директивы ассемблера
- •2.2.2.Режимы адресации
- •2.3.Инструкции пересылки данных и двоичной арифметики
- •2.4.Запись программ на языке ассемблера
- •2.5.Обработка программ в ms-dos
- •2.6.Пример выполнения работы
- •2.6.1.1Текст программы:
- •2.7.Варианты заданий
- •2.8.Вопросы по теме
- •3.Циклические и разветвляющиеся программы
- •3.1.Безусловные переходы
- •3.2. Условный переход
- •3.3.Циклы
- •3.4.Пример выполнения работы
- •3.5.Варианты заданий
- •3.6.Вопросы по теме
- •4.Применение логических инструкций
- •4.1.Логические инструкции
- •4.2.Примеры использования логических команд
- •4.3.Пример выполнения работы
- •4.4.Варианты заданий
- •4.5.Вопросы по теме
- •5.Обработка символьной информации с помощью функций dos
- •5.1.Программные прерывания и системные вызовы
- •Функция оан
- •Функция 0Bh
- •5.3. Пример выполнения работы
- •5.4. Варианты заданий
- •5.5. Вопросы по теме
- •6.Подпрограммы
- •6.1. Структура подпрограммы
- •6.2.Вызов подпрограммы
- •6.3.Передача параметров
- •Сохранение регистров
- •6.4. Пример выполнения работы
- •6.5. Варианты заданий
- •6.6. Вопросы по теме
- •7.Обработка прерываний
- •7.1.Обработка прерывания
- •7.2.Изменение вектора прерывания
- •Функция 35h
- •7.3.Дополнительные сведения о структуре dos и bios
- •7.3.1.Прямое обращение к видеопамяти
- •7.3.2. Буфер клавиатуры
- •7.4. Пример выполнения работы
- •7.5. Варианты заданий
- •7.6. Вопросы по теме
Функция оан
Выполняет ввод с клавиатуры в буфер строки символов.
Вызов:
аh= 0аh
ds: dx = адрес буфера ввода
Возвращаемое значение:
Строка символов по указанному адресу
Примечание. Читается со стандартного ввода. dx содержит смещение буфер вывода, DS - сегментный адрес. Буфер вывода имеет следующую структуру: 0-й байт содержит максимальное количество символов в буфере; 1-й байт содержит количество реально введенных символов; начиная со 2-го размещён буфер для ввода размером не менее указанного в в 1-м байте. Выполняется эхо-отображение. Комбинация клавиш Ctrl/C (или Ctrl/Break) прекращает выполнение программы пользователя. Символы вводятся один за другим, до тех пор, пока не будет введен код ODh (код клавиш “Enter”), завершающий строку. В ходе ввода строки пользователь может редактировать строку, и, в частности, использовать “забой”.
Пример.
Пусть требуется ввести строку длиной не более 10 символов. При этом в сегменте данных можно описать буфер, например, таким образом:
buffer db 11 ; Нулевой байт буфера
entered db (?) ; Число введенных символов
string db 11 dup (?) ; Введенные символы
Сам ввод выполняется командами:
lea dx, buffer ; Адрес буфера в dx
mov ah, 0ah ; Номер функции в аh
int 21h ; Вызов функции
Функция 0Bh
Выполняет опрос состояния буфера клавиатуры.
Вызов:
ah = 0Bh
Возвращаемое значение:
аl = 00h, если нет символа в буфере клавпиатуры;
al = ffh, если есть символ в буфере клавиатуры.
Примечание. Устанавливает значение AL в зависимости от наличия символов в буфере клавиатуры. Часто используются в задачах, действующих при нажатии определенных клавиш. Комбинация клавиш Ctrl/ (или Ctrl/Break) прекращает выполнение программы пользователя.
5.3. Пример выполнения работы
Ввести строку с клавиатуры, посчитать, сколько и каких десятичных цифр имеется во введенной строке, посчитанные значения вывести на терминал.
Текст программы:
data segment
COUNT db 10 dup (0) ; счетчик количества цифр
CIFR db ‘0123456789ABCDEF’ ; таблица преобразования цифр
IN_STR db 80, ?, 82 dup (?) ; буфер ввода
OUT_STR db 0Dh, 0Ah, ?,’-‘,?, ?,’$’ ; буфер вывода
data ends
code segment
assume cs:code, ds:data
START: mov ax, data
mov ds, ax ; Загрузить сегментный адрес данных
; Ввод строки
lea dx, IN_STR
mov ah, 0ah
int 21h
; Обработка
xor ah, ah ; обнуление старшего байта AX
lea bx, IN_STR+2 ; адрес начала введённой строки
xor cx, cx
mov cl, IN_STR+1 ; количество введенных символов
ВВ: mov al, [BX] ; очередной символ строки
cmp al,’0’ ; код символа меньше чем код нуля?
jb NC ; да, не цифра
cmp al, ‘9’ ; код символа больше чем код девяти
ja NC ; да, не цифра
; символ - десятичная цифра
sub al, ‘0’ ; преобразуем ASCII код в число
mov si, ax ; индекс в массиве счетчиков COUNT
inc COUNT[si] ; увеличиваем счетчик цифр
NC: inc bx ; получить очередной символ строки
loop BB
; Вывод результатов
mov cx, 10
lea bx, CIFR ; адрес таблицы преобразования цифр в ASCII
xor si, si ; номер выводимой цифры
OUT: mov al, ‘0’
add ax, si ; ASCII код очередной цифры с номером в si
mov OUT_STR+2, al ; в буфер вывода
mov dl, COUNT[si] ; читать количество цифр с номером в si
mov al, dl
push cx ;временное сохранение cx
mov cl, 4 ; сдвиг на четыре
shr al, cl ; выделить старшую цифру
xlat ; ASCII старшей цифры в al
pop cx ; восстановление cx
mov OUT_STR+4, al ; в буфер вывода
mov al, dl ; восстановить количество цифр в al
and al,00001111b ; выделить младшую цифру
xlat ; ASCII младшей цифры в al
mov OUT_STR+5, al ; в буфер вывода
lea dx, OUT_STR ; подготовка к выводу строки
mov ah, 09h ; номер функции
int 21h ; вывод строки
inc si ; Счетчик очередной цифры
loop OUT
QUIT: mov ax, 4C00h ; Код завершения 0
int 21h ; Выход в DOS
code ends
end START