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