Вычислить максимумы двух массивов - 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
, то значения обновляются. - Цикл повторяется до тех пор, пока не будет достигнут конец массива.
- Процедура возвращает управление в основную программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д