Массив: вывести в файл наибольший элемент и количество нулевых элементов - 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 — количество нулевых элементов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д