Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Полный текст учебника.docx
Скачиваний:
26
Добавлен:
17.04.2019
Размер:
10.83 Mб
Скачать

Директивы определения сегментов и процедур

Сегмент определяется псевдооператорами:

имя_сег segment

...

имя_сег ends

В программе можно использовать 4 сегмента (по числу сегментных регистров) и для каждого указать соответствующий регистр сегмента псевдооператором ASSUME (assume — присвоить), например:

codeseg sedment

assume CS:codeseg, DS:dataseg, SS:stackseg

..

codeseg ends

В директиве ASSUME регистр_сег:имя_сег [,..], в частности, ASSUME cs:codeseg, указывается, что для сегмента имя_сег (codeseg) выбран регистр регистр_сег (CS).

После директивы ASSUME следует явным образом загрузить адрес начала сегмента данных в регистр DS:

mov AX, dataseg

mov DS, AX

Процедура определяется псевдооператорами:

имя_процедуры proc [far] ...

...

ret

имя_процедуры endp

При определении процедуры после ключевого слова proc должен быть указан атрибут дистанции near или far; если этого атрибута нет, то по умолчанию подразумевается near. Обычно процедура должна заканчиваться командой ret (return). Если процедура объявлена как near, то обращение к ней (call) должно производиться из того же сегмента; если proc far, то из любого сегмента (в этом случае командой ret из стека при возврате будет извлечено два слова: для IP и для CS).

Директивы управления трансляцией

Их несколько, наиболее часто используется END. Директива END отмечает конец программы и указывает ассемблеру, где завершить трансляцию. Формат: END [имя_программы].

Программирование процедур работы с устройствами ввода-вывода

Процедуры ввода-вывода в ПК выполняются, как правило, по прерываниям. Состав и использование основных видов прерываний и служебных функций DOS прерывания 21H рассмотрены в работах [8, 27]. Ниже мы кратко остановимся на вопросах программирования ввода-вывода лишь прерываний для отображения информации на дисплее и ввода с клавиатуры. Вопросы вывода информации на принтер и работы с файлами рассмотрены в работах [8,15].

Программирование работы с дисплеем

Задание режимов работы и обмен данными с дисплеем можно выполнять при прерываниях BIOS типа 10H, а вывод данных на дисплей и при прерываниях DOS типа 21H.

Видеооперации с прерыванием 21h dos

  • Вывод символа на экран дисплея: AH = 2 или AH = 6 и DL <> 0FFh. В регистре DL должен быть ASCII-код символа. Пример фрагмента программы (вывод символа «C»):

mov AH, 6

mov DL, 43H ; 43H — это ASCII-код символа C

int 21H

  • Вывод строки символов: AH = 9 (чаще всего используемая функция). В регистрах DS:DX должен находиться начальный адрес строки символов, которая обязана заканчиваться символом $. Пример фрагмента программы (отображение текста 'вывод строки символов$'):

Text db 'вывод строки символов$'

mov AH, 9

mov DX, offset text ; это адрес выводимой строки

int 21H

  • Ввод/вывод из файла через логический номер. Стандартные файловые логические номера определяют тип и устройство ввода-вывода:

  • 0 — ввод с клавиатуры;

  • 1 — вывод на экран дисплея;

  • 2— вывод на экран сообщения об ошибке;

  • 3— ввод-вывод на внешнее устройство;

  • 4— вывод на печать.

Для ввода предназначена функция AH = 3Fh прерывания 21H, для вывода служит функция AH = 40h прерывания 21H. В регистр CX предварительно заносится число вводимых-выводимых байтов, а в регистр DX записывается начальный адрес поля памяти для ввода-вывода. В случае успешного завершения процедуры ввода-вывода обнуляется флаг переноса CF, а в регистре AX возвращается количество фактически переданных байтов. При неудачной операции флаг CF устанавливается в 1, а в регистр AX заносится код ошибки.

Приведенный ниже пример содержит фрагмент программы для вывода на экран текстового файла Text, содержащего 50 байтов.

text db 50 dup(' ')

mov AH, 40H

mov BX, 1 ; указание устройства вывода

mov CX, 50 ;указание числа выводимых байт

mov DX, offset text ; указание начального адреса

; поля памяти, содержащего текст

int 21H