Запись результата не по тому адресу - Assembler
Формулировка задачи:
Здравствуйте! Имеется такая задача:
Написать подпрограмму для вычисления арифметической суммы элементов с заданным свойством в некотором массиве двойных слов со знаком. С помощью этой подпрограммы обработать два массива, вычисляя в первом сумму нечетных чисел, а во втором отрицательных чисел. Для передачи данных использовать стек
Использую Masm8086
Проблема в том, что когда я начинаю отлаживать при первом заходе в процедуру результат записывается не в переменной Resultat1 а на месте первого элемента Array1. Как это исправить?
Только что это исправил, но почему то вроде не правильно считает сумму отрицательных чисел
Листинг программы
- NAME task_1
- Data SEGMENT
- Array1 DD 80000001h;0FFFFFFFFh
- DD 0FFFFFFFFh
- DD 0FFFFFFFFh
- DD 0FFFFFFFFh
- DD 0FFFFFFFFh
- DD 7FFFFFFFh
- DD 0FFFFFFFEh
- Result1 DW 3 DUP(0)
- Array2 DD 16383
- DD 11207
- DD 10240
- DD 11265
- DD 4172057
- DD 2304683
- Result2 DW 3 DUP(0)
- Data ENDS
- Stack SEGMENT
- DW 16 DUP(?)
- StkTop LABEL WORD
- Stack ENDS
- Code SEGMENT
- ASSUME DS:Data, ES:Data, CS:Code, SS:Stack
- SUMM PROC
- PUSH BP
- MOV BP, SP
- MOV AX, [BP + 4] ; Загружаем свойство
- MOV CX, [BP + 6] ; Загружаем Количество элементов
- MOV DI, [BP + 8] ; Загружаем указатель на место хранения результата
- MOV SI, [BP + 10] ; Загружаем указатель на массив
- CMP AX,0 ; проверяем свойство
- JNE M3 ;
- M1:
- MOV AX, [SI]
- MOV DX, [SI + 2]
- TEST DX, 8000h ; проверяем знак, он у нас храниться в старшем слове
- JZ M2 ; положительное? Да. Тогда идем на М2
- ADD [DI], AX ; складываем
- MOV AX, [SI + 2] ; загружаем в ах старшее слово
- CWD ; копируем его знак в регистр DX
- ADC [DI + 2], AX ; складываем
- ADC [DI + 4], DX
- M2:
- ADD SI, 4
- DEC CX
- JNZ M1
- JMP M5
- M3:
- MOV AX, [SI]
- MOV DX, [SI + 2]
- TEST AX, 1h ; проверяем число на четность
- JZ M4 ; если четное то переходим к следующему число
- ADD [DI], AX ; складываем
- MOV AX, [SI + 2] ; загружаем в ах старшее слово
- CWD ; копируем его знак в регистр DX
- ADC [DI + 2], AX ; складываем
- ADC [DI + 4], DX
- M4:
- ADD SI, 4
- DEC CX
- JNZ M3
- M5:
- POP BP
- RET 8
- SUMM ENDP
- Start:
- MOV AX, Data
- MOV DS, AX
- MOV ES, AX
- MOV AX, Stack
- MOV SS, AX
- MOV SP, offset StkTop
- LEA AX, Array1
- PUSH AX
- LEA AX, Result1
- PUSH AX
- MOV AX, 7
- PUSH AX
- MOV AX, 0
- PUSH AX
- CALL SUMM
- LEA AX, Array2
- PUSH AX
- LEA AX, Result2
- PUSH AX
- MOV AX, 6
- PUSH AX
- MOV AX, 1
- PUSH AX
- CALL SUMM
- Code ENDS
- END Start
Решение задачи: «Запись результата не по тому адресу»
textual
Листинг программы
- MyProc proc c para:word, parb:wrod, parc:word
- mov ax,para
Объяснение кода листинга программы
MyProc
- название процедурыpara
- параметр процедуры, хранится в регистре AXparb
- параметр процедуры, хранится в регистре CXparc
- параметр процедуры, хранится в регистре DX
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д