Вычислить максимумы двух массивов - 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 вычисляет максимальные значения двух массивов. Список действий:
- Массивы
mas0иmas1заполняются значениями. - Переменные
aиbинициализируются нулями. Они будут использоваться для хранения максимальных значений массивов. - Запускается процедура
findMax, которая находит максимальное значение в массиве. - Максимальное значение массива
mas0сохраняется в переменнойa. - Запускается процедура
findMaxдля массиваmas1. - Максимальное значение массива
mas1сохраняется в переменнойb. - Код выходит из программы.
Процедура
findMaxработает следующим образом: - Инициализируется переменная
cxкак (len-1), гдеlen- это длина массива. - Первый элемент массива загружается в регистр
al. - Максимальное значение из предыдущего цикла сохраняется в регистре
ah. - В цикле
loopпроисходит сравнение значенияalс максимальным значениемah. Еслиalбольше или равноah, то значения обновляются. - Цикл повторяется до тех пор, пока не будет достигнут конец массива.
- Процедура возвращает управление в основную программу.