Запись результата не по тому адресу - Assembler

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

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

Здравствуйте! Имеется такая задача: Написать подпрограмму для вычисления арифметической суммы элементов с заданным свойством в некотором массиве двойных слов со знаком. С помощью этой подпрограммы обработать два массива, вычисляя в первом сумму нечетных чисел, а во втором отрицательных чисел. Для передачи данных использовать стек Использую Masm8086
Листинг программы
  1. NAME task_1
  2. Data SEGMENT
  3. Array1 DD 80000001h;0FFFFFFFFh
  4. DD 0FFFFFFFFh
  5. DD 0FFFFFFFFh
  6. DD 0FFFFFFFFh
  7. DD 0FFFFFFFFh
  8. DD 7FFFFFFFh
  9. DD 0FFFFFFFEh
  10. Result1 DW 3 DUP(0)
  11. Array2 DD 16383
  12. DD 11207
  13. DD 10240
  14. DD 11265
  15. DD 4172057
  16. DD 2304683
  17. Result2 DW 3 DUP(0)
  18. Data ENDS
  19. Stack SEGMENT
  20. DW 16 DUP(?)
  21. StkTop LABEL WORD
  22. Stack ENDS
  23. Code SEGMENT
  24. ASSUME DS:Data, ES:Data, CS:Code, SS:Stack
  25. SUMM PROC
  26. PUSH BP
  27. MOV BP, SP
  28. MOV AX, [BP + 4] ; Загружаем свойство
  29. MOV CX, [BP + 6] ; Загружаем Количество элементов
  30. MOV DI, [BP + 8] ; Загружаем указатель на место хранения результата
  31. MOV SI, [BP + 10] ; Загружаем указатель на массив
  32. CMP AX,0 ; проверяем свойство
  33. JNE M3 ;
  34. M1:
  35. MOV AX, [SI]
  36. MOV DX, [SI + 2]
  37. TEST DX, 8000h ; проверяем знак, он у нас храниться в старшем слове
  38. JZ M2 ; положительное? Да. Тогда идем на М2
  39. ADD [DI], AX ; складываем
  40. MOV AX, [SI + 2] ; загружаем в ах старшее слово
  41. CWD ; копируем его знак в регистр DX
  42. ADC [DI + 2], AX ; складываем
  43. ADC [DI + 4], DX
  44. M2:
  45. ADD SI, 4
  46. DEC CX
  47. JNZ M1
  48. JMP M5
  49. M3:
  50. MOV AX, [SI]
  51. MOV DX, [SI + 2]
  52. TEST AX, 1h ; проверяем число на четность
  53. JZ M4 ; если четное то переходим к следующему число
  54. ADD [DI], AX ; складываем
  55. MOV AX, [SI + 2] ; загружаем в ах старшее слово
  56. CWD ; копируем его знак в регистр DX
  57. ADC [DI + 2], AX ; складываем
  58. ADC [DI + 4], DX
  59. M4:
  60. ADD SI, 4
  61. DEC CX
  62. JNZ M3
  63. M5:
  64. POP BP
  65. RET 8
  66. SUMM ENDP
  67. Start:
  68. MOV AX, Data
  69. MOV DS, AX
  70. MOV ES, AX
  71. MOV AX, Stack
  72. MOV SS, AX
  73. MOV SP, offset StkTop
  74. LEA AX, Array1
  75. PUSH AX
  76. LEA AX, Result1
  77. PUSH AX
  78. MOV AX, 7
  79. PUSH AX
  80. MOV AX, 0
  81. PUSH AX
  82. CALL SUMM
  83. LEA AX, Array2
  84. PUSH AX
  85. LEA AX, Result2
  86. PUSH AX
  87. MOV AX, 6
  88. PUSH AX
  89. MOV AX, 1
  90. PUSH AX
  91. CALL SUMM
  92. Code ENDS
  93. END Start
Проблема в том, что когда я начинаю отлаживать при первом заходе в процедуру результат записывается не в переменной Resultat1 а на месте первого элемента Array1. Как это исправить? Только что это исправил, но почему то вроде не правильно считает сумму отрицательных чисел

Решение задачи: «Запись результата не по тому адресу»

textual
Листинг программы
  1. MyProc proc c para:word, parb:wrod, parc:word
  2.   mov ax,para

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

  1. MyProc - название процедуры
  2. para - параметр процедуры, хранится в регистре AX
  3. parb - параметр процедуры, хранится в регистре CX
  4. parc - параметр процедуры, хранится в регистре DX

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


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

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

7   голосов , оценка 4.429 из 5

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

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

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