Прерывание int 21h ассемблер

Прерывание int 21h ассемблер

Вывод на экран

Для вывода одного символа на экран используется функция 02 прерывания 21h

Вывод на экран строки (последовательности символов) реализуется с помощью функции 09 прерывания 21h

Ds:dx:=начальный адрес строки

Ввод с клавиатурыcтроки символов осуществляется с помощью функции прерывания 0Аhпрерывания21h

Ds:dx:= адрес буфера для записи введенной строки

mov ah, 0Аh

Пример. Отсортировать по возрастанию массив целых чисел методом «пузырька».

Результат: отсортированный массив, выведенный на экран в 16-системе счисления.

Текст исходного модуля для решения данной задачи приведен ниже.

; Программа сортировки на ассемблере

data segment ; начало сегмента данных

A dw 15,2,8,4,5,13 ; описание массива A

n=6 ; количество элементов массива A

p db ? ; признак сортировки

wbuf db 2*n dup(‘ ‘),10,13,’$’ ; описание буфера вывода

tab db ‘0123456789ABCDEF’ ; таблица перевода в 16 c/c

data ends ; конец сегмента данных

sstack segment stack ; сегмент стека

code segment ; начало кодового сегмента

assume cs:code, ds:data, ss:sstack

Print proc near ; процедура вывода массива на экран

pusha ; сохраняем значения РОН

lea si,А ; адрес массива А -> si

lea di,wbuf ; адрес буфера вывода -> di

mov cx,n ; cx – счетчик цикла

trans: ; цикл перевода в 16 c/c

mov bx,[si] ; взяли текущее число из массива в bx

mov al,tab[bx] ; преобразовали его в 16-цифру

mov [di],al ; записали в буфер вывода

add si,2 ; продвинулись по массиву

add di,2 ; и буферу

loop trans ; замкнули цикл перевода

lea dx,wbuf ; вывод буфера на экран

popa ; восстановление значений РОН

ret ; возврат в точку вызова

Sort proc near ; процедура сортировки

MainP proc far ; головная процедура

push ds ; сохраняем

mov ax,0 ; адрес возврата ds:0

push ax ; в стеке

mov ax,data ; инициализация базового

mov ds,ax ; адреса сегмента в ds

call Print ; выводим на экран исходный массив

call Sort ; сортируем его

call Print ; выводим на экран отсорт. массив

ret ; возврат в ОС

MainP endp ; конец головной процедуры

code ends ; конец кодового сегмента

end MainP ; конец исходного модуля

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

Читайте также:  Как убрать эхо в микрофоне караоке

Эта директива сообщает ассемблеру о достижении конца исходного модуля и необходимости начать выпол­нение программы с команды, отмеченной меткой , которая обычно ассоциируется с именем головной процедуры программы.

Пример. Отсортировать по возрастанию массив из 20 целых чисел методом «пузырька».

Исходные данные: файл abc.dat с числами в диапазоне 0..15.

Результат: отсортированный массив, выведенный на экран в 16-системе счисления.

Текст исходного модуля для решения данной задачи приведен ниже.

;Программа сортировки на ассемблере

Data segment ; начало сегмента данных

n = 20 ; кол-во чисел в массиве

A dw n dup(?) ; буфер под массив чисел

path db ‘abc.dat’ ; путь к файлу

handle dw ? ; дескриптор файла 5..256

p db ? ; флаг сортировки

Wbuf db 2*n dup(‘ ‘),10,13,’$’ ; буфер вывода

tab db ‘0123456789ABCDEF’ ; таблица перевода в 16 c/c

Data ends ; конец сегмента данных

sStack segment stack ; сегмент стека

Code Segment ; начало кодового сегмента

Assume cs: Code, ds: Data, ss: sStack

WriteLn proc near ; процедура вывода массива на экран

рusha ; сохраняем регистры

lea si,A ;адр. массива -> si

lea di,Wbuf ;адр. буфера вывода -> di

mov cx,n ; cx – счетчик цикла

trans: ; цикл перевода в 16 c/c

mov bx,[si] ; взяли текущее число из массива в bx

mov al,tab[bx] ; преобразовали его в 16-цифру

mov [di],al ; записали в буфер вывода

add si, 2 ; продвинулись вдоль массива

add di,2 ; и буфера

loop trans ; замкнули цикл перевода

lea dx,Wbuf ; вывод буфера на экран

popa ; восстановление регистров

ret ; возврат в точку вызова

OpenF PROC near ; открытие файла

ReadF PROC near ; чтение из файла в массив А

mov bx,handle ; в bx – дескриптор файла

mov dx,offset A ; указать на буфер

mov cx,2*n ; число байтов для чтения

mov ah,3Fh ; функция чтения из файла

CloseF PROC near ; закрытие файла

Sort proc near ; процедура сортировки

pusha ; сохраняем регистры

rep1: ; внешний цикл сортировки

lea si,A ; адр. начала массива в si

mov cx,n-1 ; иниц-я сч-ка внутреннего цикла

mov p,0 ; признак сортировки в 0

for: ; цикл перебора пар

mov ax,[si] ; взяли первый элемент пары

Читайте также:  Что значит посещения в инстаграме

cmp ax,[si+2] ; сравнили со вторым элементом пары

jle m1 ; если первый больше второго,

xchg ax,[si+2] ; то обмен первого со

xchg ax,[si] ; вторым

mov p,1 ; фиксируем факт обмена

add si,2 ; продвинулись вдоль массива

loop for ; замкнули цикл

cmp p,0 ; проверили — был ли обмен?

jne rep1 ; если сортировка наступила, то

popa ; выход из цикла и восстановление регистров

ret ; возврат в точку вызова

Sort endp ; конец процедуры

MainP proc far ; головная процедура

push ds ; сохраняем

mov ax,0 ; адрес возврата ds:0

push ax ; в стеке

mov ax,Data ; иниц-я базового

mov ds,ax ; адреса сегмента в ds

CALL OpenF ; открываем файл с данными

CALL ReadF ; читаем в буфер из файла

CALL CloseF ; закрываем файл с данными

CALL WriteLn ; выводим на экран исходный массив

CALL Sort ; сортируем его

CALL WriteLn ; выводим на экран отсортированный массив

ret ; возврат в ОС

MainP endp ; конец головной процедуры

Code ends ; конец кодового сегмента

end MainP ; конец исходного модуля, MainP – точка входа в

Var i,x:integer; f :File Of Integer;

For i:=1 to n Do Begin x:=Random(16); write(f,x); End;

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Только сон приблежает студента к концу лекции. А чужой храп его отдаляет. 9304 — | 7872 — или читать все.

Это прерывание служит главным входом большинства функций DOS.

Программа, запрашивающая сервис DOS, должна подготовить всю необходимую информацию в регистрах и управляющих блоках, указать в регистре AH номер желаемой функции DOS и затем вызвать прерывание INT 21H.

Функции прерывания INT 21H работают со стандартным устройством ввода и стандартным устройством вывода, которыми по умолчанию являются клавиатура и монитор.

Некоторые функции данного прерывания приведены в табл.12.4.

Таблица 12.4. Функции прерывания INT 21H

Назначение и номер функции Значения остальных регистров при вызове Значения регистров при возврате
Чтение символа из стандартного устройства ввода с эхом Функция читает один символ из буфера стандартного устройства ввода. Если символа нет, то функция переходит в состояние ожидания. Отображает этот символ на стандартное устройство вывода (эхо). AH = 01H AL – ASCII код символа
Вывод символа на стандартное устройство вывода Функция посылает один символ на стандартное устройство вывода и перемещает курсор на одну позицию вперед. AH = 02H DL – символ
Прямой ввод-вывод символов Функция выполняет чтение одного символа из стандартного устройства ввода без эха и без перехода в режим ожидания. Если символ есть, то сбрасывается флаг ZF и считывается ASCII код символа. Если символа нет, то флаг ZF устанавливается и управление передается вызывающей программе. Функция выполняет вывод символа на стандартное устройство вывода. AH = 06H DL – код символа при выводе DL = FFH при вводе При выводе нет. При вводе: Есть символ в буфере: ZF = 0 AL – ASCII код символа Нет символа в буфере: ZF = 1
Читайте также:  Просмотр epub на компьютере

Окончание табл. 12.4

Вывод строки символов Функция выводит на стандартное устройство вывода строку символов, которая оканчивается знаком $. AH = 09H DS:DX – адрес строки
Проверка состояния ввода Функция определяет состояние буфера стандартного устройства ввода AH = 0BH Есть символ в буфере: AL = 0FFH Нет символа в буфере: AL=00H
Определить системную дату Функция определяет системную дату. AH = 2AH CX – Год DH – Месяц DL – День AL – день недели (0 – воскресенье: 1 – понедельник и т.д.)
Определить системное время Функция определяет системное время. AH = 2CH CH – часы (0…23) CL – минуты (0…59) DH – секунды (0…59) DL – сотые доли секунды (0…99)
Завершить программу Функция выполняет завершение текущей программы. AH = 4CH AL – код завершения (0 – успешное выполнение программы)

Рассмотрим пример COM-программы, которая

– выводит на экран приглашение к работе;

– принимает с клавиатуры символ;

– вывод на чистом экране строки принятого символа по типу:

ААААА ААААА ААААА

Текст программы на языке ассемблера приведен на рис.12.3.

Ссылка на основную публикацию
Почему телефон ночью быстро разряжается
Если телефон стал быстро разряжаться, это еще не значит, что виновата батарея. В 70% случаев пользователь сам настроил устройство таким...
Почему имя пользователя недоступно в инстаграме
Как быть, если такое имя пользователя Instagram уже занято, но соответствующий ему аккаунт кажется неактивным? Если имя пользователя, которое вы...
Почему индукционная плита щелкает
Если индукционная плита щелкает при работе, рекомендуется ознакомиться с особенностями работы техники. При уверенности, что устройство вышло из строя, не...
Почему телефон самостоятельно перезагружается
Постоянная и не запланированная перезагрузка смартфона на Android – раздражающая ошибка. Она порождает плохое настроение и желание расстаться с гаджетом....
Adblock detector