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

Для вывода одного символа на экран используется функция 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.








Дата добавления: 2015-10-09; просмотров: 677;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.038 сек.