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