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