Лаб4. Команды пересылки. Ввод/вывод строки функциями 3Fh и 40h прерывания 21h.
Цель работы: ознакомление с возможностями буферизированного ввода/вывода, различными командами пересылки данных и закрепление навыков выполнения и отладки программ на ЭВМ с использованием интерактивных отладчиков.
Теоретическая часть
Команды пересылки данных
Команды пересылки данных осуществляют обмен информацией между регистрами и ячейками памяти.
Команды пересылки данных делятся на следующие группы:
- команды общего назначения;
- команды пересылки адреса;
- команды пересылки флажков.
Рассмотрим некоторые из них.
Команды общего назначения
Команда MOV
Это основная команда общего назначения. Она позволяет переслать:
- байт или слово между регистрами или между регистром и ячейкой памяти;
- непосредственно адресуемое значение в регистр или ячейку памяти.
Формат команды:
MOV <приемник>, <источник>
Примеры:
mov AX, TABLE ;переслать из памяти с адресом TABLE в регистр AX
mov TABLE, AX ;переслать из регистра AX в память с адресом TABLE
mov CL, 25 ;переслать в регистр СLчисло 25
mov CX, BX ;переслать в регистр CX содержимое BX
Запрещается:
- непосредственно пересылать данные из одной ячейки памяти в другую. Для этого надо использовать промежуточный регистр;
- загружать непосредственно адресуемый операнд напрямую в регистр сегмента. Для этого используют промежуточный регистр общего назначения;
- непосредственно пересылать значение одного сегментного регистра в другой сегментный регистр;
- использовать сегментный регистр CS в качестве приемника.
Команда пересылки адреса LEA
LEA – команда загрузки исполнительного адреса, пересылающая относительный адрес (смещение) ячейки памяти в 16–битовый регистр общего назначения, регистр указателя или индексный регистр.
Формат команды:
LEA <регистр>, <память>
Пример: lea BX, TABLE[DI] ;если регистр DI содержит 5, то в
;регистре BX будет смещение ячейки
;TABLE+5 в сегменте, адресуемом
;текущим значением регистра DS
Команды PUSHиPOP
Команда PUSH помещает содержимое регистра или ячейки памяти размером в слово в вершину стека. Формат команды:
PUSH <источник>
Примеры:
push SI
push CS
push TABLE[BX][DI]
Команда POP извлекает слово с вершины стека и помещает его в ячейку памяти или регистр. Формат команды:
POP <приемник>
Пример: POP AX
Под вершиной стека понимается ячейка памяти в сегменте стека, смещение которой содержится в указателе SP. SP всегда указывает на слово, помещенное в стек последним. Команда PUSH уменьшает значение SP на 2, а команда POP – увеличивает на 2.
Команды пересылки флажков PUSHF и POPF
Команда PUSHF помещает содержимое регистра флажков в вершину стека. Формат команды:
PUSHF
Команда POPF извлекает слово с вершины стека и помещает его в регистр флагов. Формат команды:
POPF
Ввод/вывод строки функциями 3Fh и 40h
При вводе строки с помощью функции 3Fh необходимо описать буфер для вводимых символов. Надо только помнить, что, в отличие от функции 0Ah, функция 3Fh сохраняет в конце введенной строки не один, а два символа:0Ah – код новой строки и 0Dh – код клавиши Enter, поэтому буфер должен быть на два байта вместительней.
Кроме того, при вводе с помощью этой функции процессор не выдает звукового сигнала при заполнении буфера и клавиатура не блокируется. Все вводимые символы сначала попадают в системный буфер ввода-вывода, а затем процессор перемещает нужное число символов в заданную в программе область памяти. Лишние символы остаются в системном буфере.
Они будут считаны из него при повторном вызове функции ввода, что может привести к неверному функционированию программы, поэтому пользователь должен сам отслеживать количество введенных символов.
Например, если буфер для ввода объявлен как
Stroka DB 12 DUP(?) ,
то вызов функции 3Fhвыглядит следующим образом:
mov AH, 3Fh ;номер функции помещаем в регистр AH
lea DX, Stroka ;адрес буфера ввода – в регистр DX.
;эту строчку кода можно
;заменить на MOV DX, OFFSET Stroka
mov BX, 0 ;в BX хранится дескриптор стандартного входного потока
mov CX, 12 ;в CX – количество вводимых символов
int21h ;вызов прерывания
После выполнения этой функции в регистре AL хранится количество введенных символов с учетом двух дополнительных символов, в регистр AH помещается возможный код ошибки.
Функция 40h выводит строку на экран. Вызов функции осуществляется следующим образом:
mov AH, 40h ;номер функции помещаем в регистр AH
lea DX, Stroka ;адрес буфера вывода – в регистр DX.
mov BX, 1 ;в BX хранится дескриптор стандартного
;выходного потока
mov CX, 10 ;в CX – количество выводимых символов
int 21h ;вызов прерывания
Выходной параметр – регистр AL содержит количество выведенных символов.
Задания
- Написать программу, соответствующую вашему варианту из третьей лабораторной работы, с использованием функций 3Fh и 40h для ввода и вывода строк на экран. Символы копировать через стек с помощью команд PUSH и POP.
- Выполнить программу под управлением отладчика TD. Провести пошаговую трассировку программы, отслеживая на каждом шаге содержимое сегмента данных. Изучить изменение указателя стека SP, указателя команд IP и сегмента данных от шага к шагу выполнения программы.
Оставить комментарий