Запись результата не по тому адресу - 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