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

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

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

Здравствуйте! Имеется такая задача: Написать подпрограмму для вычисления арифметической суммы элементов с заданным свойством в некотором массиве двойных слов со знаком. С помощью этой подпрограммы обработать два массива, вычисляя в первом сумму нечетных чисел, а во втором отрицательных чисел. Для передачи данных использовать стек Использую Masm8086
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
Проблема в том, что когда я начинаю отлаживать при первом заходе в процедуру результат записывается не в переменной Resultat1 а на месте первого элемента Array1. Как это исправить? Только что это исправил, но почему то вроде не правильно считает сумму отрицательных чисел

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

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

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

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

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

7   голосов , оценка 4.429 из 5
Похожие ответы