Найти номер максимального числа - Assembler
Формулировка задачи:
Максимальное число находит, заношу в регистр BX, а номер пишет 5, хотя должен быть 7 , так как макс число 15 в массиве, в чем ошибка?, Потом нужно номер и максимально число перемножить и поместить в регистр BX
;====================================================================
; Main.asm file generated by New Project wizard
;
; Created: Ср апр 19 2017
; Processor: 8086
; Compiler: MASM32
;
; Before starting simulation set Internal Memory Size
; in the 8086 model properties to 0x10000
;====================================================================
CODE SEGMENT PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA
START:
mov cx,0
mov AX,DATA
mov DS,AX
lea SI,X
mov dl,0
mov bl,[si]
h:
inc cx
cmp bl,[si+2]
jg Max
mov bl,[si+2]
mov indexMax,dl
mov dl,indexMax
Max:
add si,2
inc dl
cmp cx,len
jne h
ENDLESS:
JMP ENDLESS
CODE ENDS
DATA SEGMENT PUBLIC PARA 'DATA'
X DW 5,6,7,2,3,4,15,1,2,8
indexMax DB ?
len=$-X
DATA ENDS
END STARTРешение задачи: «Найти номер максимального числа»
textual
Листинг программы
;==================================================================== ; Main.asm file generated by New Project wizard ; ; Created: Ср апр 19 2017 ; Processor: 8086 ; Compiler: MASM32 ; ; Before starting simulation set Internal Memory Size ; in the 8086 model properties to 0x10000 ;==================================================================== CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA START: mov AX,DATA mov DS,AX lea si, X push si mov ax, LenX push ax call MaxIndx mov IndxMaxX, al lea si, Y push si mov ax, LenY push ax call MaxIndx mov IndxMaxY, al lea si, Z push si mov ax, LenZ push ax call MaxIndx mov IndxMaxZ, al ENDLESS: JMP ENDLESS MaxIndx proc Len:word, Array:word push bp mov bp, sp push bx push cx push dx push si push di mov cx, Len mov si, Array mov bx, [si] ;bx - максимальный элемент mov ax, 0 ;индекс максимального элемента mov dl, 0 ;индекс текущего элемента dec cx ;рассматривать будем со 2-го элемента add si, 2 inc dl h: cmp bx, [si] jge Max mov bx, [si] mov al, dl Max: add si, 2 inc dl loop h pop di pop si pop dx pop cx pop bx pop bp ret 4 MaxIndx endp CODE ENDS DATA SEGMENT PUBLIC PARA 'DATA' X DW 2,6,2,7,9,8,7,1,2,9 LenX equ ($-X)/2 IndxMaxX db ? Y dw 9,4,5,6,2,1,5,7,2,0 LenY equ ($-Y)/2 IndxMaxY db ? Z dw 3,2,5,6,2,1,5,7,2,0 LenZ equ ($-Z)/2 IndxMaxZ db ? DATA ENDS STACKSEG SEGMENT PARA STACK 'STACK' db 100h dup(?) STACKSEG ENDS END START
Объяснение кода листинга программы
- Старт программы.
- Помещаем адрес
Xвsi(source index). - Сохраняем
siна стеке. - Помещаем длину
Xвax. - Сохраняем
axна стеке. - Вызываем процедуру
MaxIndx. - Сохраняем результат в
IndxMaxX. - Повторяем шаги 2-7 для массивов
YиZ, сохраняя результаты вIndxMaxYиIndxMaxZсоответственно. - Бесконечный цикл
ENDLESS. - Процедура
MaxIndxвыполняет поиск максимального элемента в массиве переданном черезArrayдлинойLen. - Возвращаем значение на стеке и завершаем процедуру.
- Определение массивов
X,YиZи их длины. - Объявление переменных
IndxMaxX,IndxMaxYиIndxMaxZ. - Конец программы.