Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_Lektsii_2015.doc
Скачиваний:
104
Добавлен:
22.03.2016
Размер:
1.19 Mб
Скачать

Команда прерывания

В систему команд МП включена специальная команда – команда прерывания (interrupt):

INT номер

mov ah, <номер функции>

int <номер прерывания>

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

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

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

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

mov ah,2

int 21h

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

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

mov ah, 9

int 21h

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

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]