Найти номер максимального числа - Assembler

Узнай цену своей работы

Формулировка задачи:

Максимальное число находит, заношу в регистр BX, а номер пишет 5, хотя должен быть 7 , так как макс число 15 в массиве, в чем ошибка?, Потом нужно номер и максимально число перемножить и поместить в регистр BX
Листинг программы
  1. ;====================================================================
  2. ; Main.asm file generated by New Project wizard
  3. ;
  4. ; Created: Ср апр 19 2017
  5. ; Processor: 8086
  6. ; Compiler: MASM32
  7. ;
  8. ; Before starting simulation set Internal Memory Size
  9. ; in the 8086 model properties to 0x10000
  10. ;====================================================================
  11. CODE SEGMENT PUBLIC 'CODE'
  12. ASSUME CS:CODE,DS:DATA
  13. START:
  14. mov cx,0
  15. mov AX,DATA
  16. mov DS,AX
  17. lea SI,X
  18. mov dl,0
  19. mov bl,[si]
  20. h:
  21. inc cx
  22. cmp bl,[si+2]
  23. jg Max
  24. mov bl,[si+2]
  25. mov indexMax,dl
  26. mov dl,indexMax
  27. Max:
  28. add si,2
  29. inc dl
  30. cmp cx,len
  31. jne h
  32. ENDLESS:
  33. JMP ENDLESS
  34. CODE ENDS
  35. DATA SEGMENT PUBLIC PARA 'DATA'
  36. X DW 5,6,7,2,3,4,15,1,2,8
  37. indexMax DB ?
  38. len=$-X
  39. DATA ENDS
  40. END START

Решение задачи: «Найти номер максимального числа»

textual
Листинг программы
  1. ;====================================================================
  2. ; Main.asm file generated by New Project wizard
  3. ;
  4. ; Created:   Ср апр 19 2017
  5. ; Processor: 8086
  6. ; Compiler:  MASM32
  7. ;
  8. ; Before starting simulation set Internal Memory Size
  9. ; in the 8086 model properties to 0x10000
  10. ;====================================================================
  11.  
  12.     CODE    SEGMENT PUBLIC 'CODE'
  13.         ASSUME CS:CODE,DS:DATA
  14.  
  15. START:
  16.         mov AX,DATA
  17.         mov DS,AX
  18.  
  19.         lea     si,     X
  20.         push    si
  21.         mov     ax,     LenX
  22.         push    ax
  23.         call    MaxIndx
  24.         mov     IndxMaxX,       al
  25.  
  26.         lea     si,     Y
  27.         push    si
  28.         mov     ax,     LenY
  29.         push    ax
  30.         call    MaxIndx
  31.         mov     IndxMaxY,       al
  32.  
  33.         lea     si,     Z
  34.         push    si
  35.         mov     ax,     LenZ
  36.         push    ax
  37.         call    MaxIndx
  38.         mov     IndxMaxZ,       al
  39.  
  40. ENDLESS:
  41.         JMP     ENDLESS
  42.  
  43. MaxIndx proc    Len:word, Array:word
  44.         push    bp
  45.         mov     bp,     sp
  46.         push    bx
  47.         push    cx
  48.         push    dx
  49.         push    si
  50.         push    di
  51.  
  52.         mov     cx,     Len
  53.         mov     si,     Array
  54.         mov     bx,     [si]    ;bx - максимальный элемент
  55.         mov     ax,     0       ;индекс максимального элемента
  56.         mov     dl,     0       ;индекс текущего элемента
  57.         dec     cx              ;рассматривать будем со 2-го элемента
  58.         add     si,     2
  59.         inc     dl
  60. h:
  61.         cmp     bx,     [si]
  62.         jge     Max
  63.         mov     bx,     [si]
  64.         mov     al,     dl
  65. Max:
  66.         add     si,     2
  67.         inc     dl
  68.         loop    h
  69.  
  70.         pop     di
  71.         pop     si
  72.         pop     dx
  73.         pop     cx
  74.         pop     bx
  75.         pop     bp
  76.         ret     4
  77. MaxIndx endp
  78.  
  79. CODE    ENDS
  80.  
  81. DATA SEGMENT PUBLIC PARA 'DATA'
  82. X               DW      2,6,2,7,9,8,7,1,2,9
  83. LenX            equ     ($-X)/2
  84. IndxMaxX        db      ?
  85. Y               dw      9,4,5,6,2,1,5,7,2,0
  86. LenY            equ     ($-Y)/2
  87. IndxMaxY        db      ?
  88. Z               dw      3,2,5,6,2,1,5,7,2,0
  89. LenZ            equ     ($-Z)/2
  90. IndxMaxZ        db      ?
  91. DATA ENDS
  92.  
  93. STACKSEG SEGMENT PARA STACK 'STACK'
  94.         db 100h dup(?)
  95. STACKSEG ENDS
  96.         END START

Объяснение кода листинга программы

  1. Старт программы.
  2. Помещаем адрес X в si (source index).
  3. Сохраняем si на стеке.
  4. Помещаем длину X в ax.
  5. Сохраняем ax на стеке.
  6. Вызываем процедуру MaxIndx.
  7. Сохраняем результат в IndxMaxX.
  8. Повторяем шаги 2-7 для массивов Y и Z, сохраняя результаты в IndxMaxY и IndxMaxZ соответственно.
  9. Бесконечный цикл ENDLESS.
  10. Процедура MaxIndx выполняет поиск максимального элемента в массиве переданном через Array длиной Len.
  11. Возвращаем значение на стеке и завершаем процедуру.
  12. Определение массивов X, Y и Z и их длины.
  13. Объявление переменных IndxMaxX, IndxMaxY и IndxMaxZ.
  14. Конец программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы