Функции прерывания 21h

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

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

mov dl, <код выводимого символа>

mov ah,2

int 21h

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

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

mov ah, 9

int 21h

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

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

mov ah, 0А h

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

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

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

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

.286; модель МП

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; сегмент стека

dw 64 dup (?)

sstack ends

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; вывод буфера на экран

mov ah,9h

int 21h

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

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

Print endp

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

pusha

met1: lea si,А

mov cx,n-1

mov p,0

met2: mov ax,[si]

cmp ax,[si+2]

jle met3

mov dx,[si+2]

mov [si],dx

mov [si+2],ax

mov p,1

met3: add si,2

loop met2

cmp p,0

jne met1

popa

ret

Sort endp

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; конец исходного модуля

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

END <точка входа>

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

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

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

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

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

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

.286; модель МП

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; сегмент стека

dw 64 dup(?)

sStack ends

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; вывод буфера на экран

mov ah,9h

int 21h

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

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

WriteLn endp

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

mov ah,3Dh

mov al,0

lea dx,path

int 21h

mov handle,ax

ret

OpenF ENDP

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

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

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

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

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

int 21h

ret

ReadF ENDP

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

mov bx,handle

mov ah,3Eh

int 21h

ret

CloseF ENDP

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; фиксируем факт обмена

m1:

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 – точка входа в

; программу

Const n=20;

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

Begin

Randomize;

Assign(f,'abc.dat'); ReWrite(f);

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

Close(f);

End.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: