Массив: вывести в файл наибольший элемент и количество нулевых элементов - 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 = результат!

Объяснение кода листинга программы

  1. Инициализация счётчика нулей и адреса строки: xor ax,ax; mov di,buff; mov cx,18; mov al,'0';
  2. Поиск первого нуля: @@1: repne scasb; or cx,cx; jz @@2; inc ah; jmp @@1;
  3. Завершение поиска: @@2: shr ax,8; Результат: В результате работы данного кода в переменной AX будет храниться наибольший элемент массива, а в переменной CX — количество нулевых элементов.

Оцени полезность:

15   голосов , оценка 3.667 из 5
Похожие ответы