Вычислить максимумы двух массивов - Assembler

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

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

не обращайте внимания на табуляцию в коде, это следующее задание, и на возможные неправильные комментарии, которые остались с предыдущего задания. сейчас нужно найти максимумы двух массивов, заданных по 5 элементов в начале. для каждого массива своя процедура. при запуске считает, что максимумы двух массивов равны по 2. не могу найти ошибку. помогите, пожалуйста
Листинг программы
  1. model small; модель памяти
  2. .stack 100h; сегмент стека
  3. .data; сегмент данных
  4. len equ 9; количество эл. в mas
  5. x db 2,3,4,5,6,7,8,9,10
  6. y db 9 dup(?)
  7. a db 0
  8. b db 0
  9. c db 0
  10. d db 0
  11. len1 equ 5; кол-во элементов
  12. mas db 1,8,4,0,2
  13. mas2 db 6,5,7,3,9
  14. .code; сегмент кода
  15. start:
  16. mov ax,@data; физ.адрес сегмента данных в регистр ax
  17. mov ds, ax
  18. mov cx, len; длину поля mas в cx
  19. call procmax; вызывем процедуру1
  20. mov c, al; хранение результата процедуры в с
  21. call procmax2; вызовем процедуру2
  22. mov d, al; хранение результата процеуры в d
  23. xor si, si; обнуление индекса массива
  24. jcxz exit;
  25. cycl:
  26. xor ax, ax
  27. cmp mas[si],10; сравнить очередной элемент с 10
  28. ja nxt; если больше 10, то на nxt
  29. cmp x[si],5
  30. jbe nxt1
  31. mov al, x[si];
  32. mul b
  33. add al, a
  34. ja nxt
  35. nxt1:
  36. mov al, x[si]
  37. mul a
  38. add al, b
  39. ja nxt
  40. nxt:
  41. inc si; перейти к след. элементу
  42. loop cycl; cx=cx-1, пока cx>1 переход на cycl
  43. exit:
  44. mov ax, 4c00h
  45. int 21h; возврат управления опреционной системе
  46. procmax proc
  47. mov cx,4; cx присваиваем значение 4
  48. xor si, si; обнуление индекса массива0
  49. jcxz exit;
  50. cycl1:
  51. xor ax, ax
  52. mov al, mas[si]
  53. mov a, al
  54. mov al, mas[si+1]
  55. cmp a, al
  56. ja nxt2
  57. mov al, mas[si+1]
  58. mov a, al
  59. nxt2:
  60. inc si; перейти к след. элементу
  61. loop cycl1; cx=cx-1, пока cx>1 переход на cycl
  62. ret
  63. endp
  64. procmax2 proc
  65. mov cx,4; cx присваиваем значение 4
  66. xor si, si; обнуление индекса массива
  67. jcxz exit;
  68. cycl3:
  69. xor ax, ax
  70. mov al, mas[si]
  71. mov b, al
  72. mov al, mas[si+1]
  73. cmp b, al
  74. ja nxt3
  75. mov al, mas[si+1]
  76. mov b, al
  77. nxt3:
  78. inc si; перейти к след. элементу
  79. loop cycl3; cx=cx-1, пока cx>1 переход на cycl
  80. ret
  81. endp
  82. end start

Решение задачи: «Вычислить максимумы двух массивов»

textual
Листинг программы
  1. ; fasm code...
  2. org  100h
  3. jmp  start
  4.  
  5. len    equ  5                ;кол-во элементов
  6. mas0   db   1,8,4,0,2        ;массивы
  7. mas1   db   6,5,7,3,9
  8. a      db   0                ;место под максимумы
  9. b      db   0                ;^^^
  10.  
  11. start:
  12.       mov   si,mas0          ;SI = адрес источника
  13.       call  findMax          ;зовём процедуру..
  14.       mov   [a],ah           ;запомним макс/массива(0)!
  15.  
  16.       mov   si,mas1          ;
  17.       call  findMax          ;
  18.       mov   [b],ah           ;запомним макс/массива(1)!
  19.  
  20. exit: xor  ax,ax             ;пауза..
  21.       int  16h
  22.       int  20h               ;выход!
  23.  
  24. ;чччччччччччччччччччччччччччччччччччччччччччччччччччччч
  25. findMax:
  26.       mov   cx,len-1         ;длина массива -1
  27.       lodsb                  ;берём первый элемент из SI в AL
  28.       mov   ah,al            ;запомним его в AH для сравнения
  29. @01:  lodsb                  ;читаем оставшиеся эл.массива
  30.       cmp   ah,al            ;сравниваем с текущим макс.
  31.       jae   @02              ;переход, если больше/равно
  32.       xchg  ah,al            ;иначе, обменять элементы
  33. @02:  loop  @01              ;повторить СХ-раз..
  34.       ret                    ;выход из процедуры

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

Код на языке Assembler вычисляет максимальные значения двух массивов. Список действий:

  1. Массивы mas0 и mas1 заполняются значениями.
  2. Переменные a и b инициализируются нулями. Они будут использоваться для хранения максимальных значений массивов.
  3. Запускается процедура findMax, которая находит максимальное значение в массиве.
  4. Максимальное значение массива mas0 сохраняется в переменной a.
  5. Запускается процедура findMax для массива mas1.
  6. Максимальное значение массива mas1 сохраняется в переменной b.
  7. Код выходит из программы. Процедура findMax работает следующим образом:
  8. Инициализируется переменная cx как (len-1), где len - это длина массива.
  9. Первый элемент массива загружается в регистр al.
  10. Максимальное значение из предыдущего цикла сохраняется в регистре ah.
  11. В цикле loop происходит сравнение значения al с максимальным значением ah. Если al больше или равно ah, то значения обновляются.
  12. Цикл повторяется до тех пор, пока не будет достигнут конец массива.
  13. Процедура возвращает управление в основную программу.

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


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

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

13   голосов , оценка 4.462 из 5

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

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

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