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