Вычислить максимумы двух массивов - Assembler

Узнай цену своей работы

Формулировка задачи:

не обращайте внимания на табуляцию в коде, это следующее задание, и на возможные неправильные комментарии, которые остались с предыдущего задания. сейчас нужно найти максимумы двух массивов, заданных по 5 элементов в начале. для каждого массива своя процедура. при запуске считает, что максимумы двух массивов равны по 2. не могу найти ошибку. помогите, пожалуйста
model small; модель памяти
.stack 100h; сегмент стека
.data; сегмент данных
len equ 9; количество эл. в mas
x db 2,3,4,5,6,7,8,9,10
y db 9 dup(?)
a db 0
b db 0
c db 0
d db 0
len1 equ 5; кол-во элементов
mas db 1,8,4,0,2
mas2 db 6,5,7,3,9
.code; сегмент кода
start:
      mov ax,@data; физ.адрес сегмента данных в регистр ax
      mov ds, ax
      mov cx, len; длину поля mas в cx
      call procmax; вызывем процедуру1
      mov c, al; хранение результата процедуры в с
      call procmax2; вызовем процедуру2
      mov d, al; хранение результата процеуры в d
      xor si, si; обнуление индекса массива
      jcxz exit; 
cycl:
      xor ax, ax
      cmp mas[si],10; сравнить очередной элемент с 10
      ja nxt; если больше 10, то на nxt
      cmp x[si],5
      jbe nxt1
      mov al, x[si];
      mul b
      add al, a
      ja nxt
nxt1:
      mov al, x[si]
      mul a
      add al, b
      ja nxt 
nxt:
      inc si; перейти к след. элементу
      loop cycl; cx=cx-1, пока cx>1 переход на cycl
exit:
      mov ax, 4c00h
      int 21h; возврат управления опреционной системе
 
procmax proc
      mov cx,4; cx присваиваем значение 4
      xor si, si; обнуление индекса массива0
      jcxz exit; 
cycl1:
      xor ax, ax
      mov al, mas[si]
      mov a, al
      mov al, mas[si+1]
      cmp a, al
      ja nxt2
      mov al, mas[si+1]
      mov a, al
nxt2:
      inc si; перейти к след. элементу
      loop cycl1; cx=cx-1, пока cx>1 переход на cycl
ret
endp  
 
procmax2 proc
      mov cx,4; cx присваиваем значение 4
      xor si, si; обнуление индекса массива
      jcxz exit; 
cycl3:
      xor ax, ax
      mov al, mas[si]
      mov b, al
      mov al, mas[si+1]
      cmp b, al
      ja nxt3
      mov al, mas[si+1]
      mov b, al
nxt3:
      inc si; перейти к след. элементу
      loop cycl3; cx=cx-1, пока cx>1 переход на cycl
ret
endp       
end start

Решение задачи: «Вычислить максимумы двух массивов»

textual
Листинг программы
; fasm code...
org  100h
jmp  start
 
len    equ  5                ;кол-во элементов
mas0   db   1,8,4,0,2        ;массивы
mas1   db   6,5,7,3,9
a      db   0                ;место под максимумы
b      db   0                ;^^^
 
start:
      mov   si,mas0          ;SI = адрес источника
      call  findMax          ;зовём процедуру..
      mov   [a],ah           ;запомним макс/массива(0)!
 
      mov   si,mas1          ;
      call  findMax          ;
      mov   [b],ah           ;запомним макс/массива(1)!
 
exit: xor  ax,ax             ;пауза..
      int  16h
      int  20h               ;выход!
 
;чччччччччччччччччччччччччччччччччччччччччччччччччччччч
findMax:
      mov   cx,len-1         ;длина массива -1
      lodsb                  ;берём первый элемент из SI в AL
      mov   ah,al            ;запомним его в AH для сравнения
@01:  lodsb                  ;читаем оставшиеся эл.массива
      cmp   ah,al            ;сравниваем с текущим макс.
      jae   @02              ;переход, если больше/равно
      xchg  ah,al            ;иначе, обменять элементы
@02:  loop  @01              ;повторить СХ-раз..
      ret                    ;выход из процедуры

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

Код на языке Assembler вычисляет максимальные значения двух массивов. Список действий:

  1. Массивы mas0 и mas1 заполняются значениями.
  2. Переменные a и b инициализируются нулями. Они будут использоваться для хранения максимальных значений массивов.
  3. Запускается процедура findMax, которая находит максимальное значение в массиве.
  4. Максимальное значение массива mas0 сохраняется в переменной a.
  5. Запускается процедура findMax для массива mas1.
  6. Максимальное значение массива mas1 сохраняется в переменной b.
  7. Код выходит из программы. Процедура findMax работает следующим образом:
  8. Инициализируется переменная cx как (len-1), где len - это длина массива.
  9. Первый элемент массива загружается в регистр al.
  10. Максимальное значение из предыдущего цикла сохраняется в регистре ah.
  11. В цикле loop происходит сравнение значения al с максимальным значением ah. Если al больше или равно ah, то значения обновляются.
  12. Цикл повторяется до тех пор, пока не будет достигнут конец массива.
  13. Процедура возвращает управление в основную программу.

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

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