Лаб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

Под вершиной стека понимается ячейка памяти в сегменте стека, смещение которой содержится в указателе SPSP всегда указывает на слово, помещенное в стек последним. Команда 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 содержит количество выведенных символов.

Задания

  1. Написать программу, соответствующую вашему варианту из третьей лабораторной работы, с использованием функций 3Fh и 40h для ввода и вывода строк на экран. Символы копировать через стек с помощью команд PUSH и POP.
  2. Выполнить программу под управлением отладчика TD. Провести пошаговую трассировку программы, отслеживая на каждом шаге содержимое сегмента данных. Изучить изменение указателя стека SP, указателя команд IP и сегмента данных от шага к шагу выполнения программы.

 

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов