Массив: вывести в файл наибольший элемент и количество нулевых элементов - Assembler
Формулировка задачи:
Есть программа, сортирует, записывает в файл массив, выводит наименьший элемент (работает), сделать вывод наибольшего элемента, и количество нулевых элементов
;== FASM code =======================
org 100h
jmp start
mes0 db 13,10,'ARRAY.....: $'
mes1 db 13,10,'SORTED....: $'
mes2 db 13,10,'MIN.EL: $'
mes3 db 13,10,'MAX.EL: $'
buff db 18 dup(0)
fName db 'array.txt',0
start:
;------ Заполняем буфер данными -------------------------------------
mov dx,mes0 ;
call message ;
mov cx,18 ; всего элементов
mov di,buff ;
mov ah,1 ;
@1: int 21h ;
stosb ; запись в ES:DI
loop @1 ;
;------ Сортировка массива ------------------------------------------
mov dx,mes1 ;
call message ;
sort: mov si,buff ; источник,
mov di,si ; ..он-же приёмник
mov cx,18 ;
xor bx,bx ; флаг перестановок
next: lodsw ; берём 2-соседнии элемента
cmp ah,al ; сравниваем их
jae miss ;
xchg ah,al ; перестановка если меньше
inc bx ; флаг +1
miss: stosw ; перезапись элементов
dec si ; шаг назад
dec di ;
loop next ; мотаем 16 раз..
or bx,bx ; перестановки были?
jnz sort ; да - начинаем всё сначала
;------ Выводим отсортированный массив на экран ---------------------
mov cx,18 ; всего
mov si,buff ; адрес
print: lodsb ; читаем из SI
int 29h ; выводим на консоль
loop print ; на повтор..
;------ Выводим на экран наименьший элемент ----------------
mov dx,mes2 ;
call message ;
mov cx,18 ;
mov si,buff ;
lodsb ; читаем байт
stopmin: int 29h ; выводим найденый эл.на экран
;------ Выводим на экран наибольший элемент ----------------
mov dx,mes3 ;
call message ;
mov cx,18 ;
mov si,buff ;
lodsb ; читаем байт
stopmax: int 29h ; выводим найденый эл.на экран
;------ Запись массива в файл ---------------------------------------
mov ah,3Ch ; создать файл!
mov cx,20h ; атрибут
mov dx,fName ;
int 21h ;
xchg bx,ax ; отправляем дескриптор в BX
mov ah,40h ; запись в файл!
mov cx,18 ; кол-во байт для записи
mov dx,buff ; буфер с данными
int 21h ;
mov ah,3Eh ; закрыть файл!
int 21h ;
exit: xor ax,ax ; выход..
int 16h ;
int 20h ;
;ннннннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннн
;------------------------------------------------------------------------
message: ;
mov ah,9 ; вывод строки на экран
int 21h ;
retРешение задачи: «Массив: вывести в файл наибольший элемент и количество нулевых элементов»
textual
Листинг программы
xor ax,ax ; mov di,buff ; адрес строки mov cx,18 ; её длина mov al,'0' ; символ для поиска @@1: repne scasb ; поиск! or cx,cx ; всю строку проверили? jz @@2 ; inc ah ; счётчик нулей +1 jmp @@1 ; продолжить поиск.. @@2: shr ax,8 ; AX = результат!
Объяснение кода листинга программы
- Инициализация счётчика нулей и адреса строки: xor ax,ax; mov di,buff; mov cx,18; mov al,'0';
- Поиск первого нуля: @@1: repne scasb; or cx,cx; jz @@2; inc ah; jmp @@1;
- Завершение поиска: @@2: shr ax,8; Результат: В результате работы данного кода в переменной AX будет храниться наибольший элемент массива, а в переменной CX — количество нулевых элементов.