Запись результата не по тому адресу - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д