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