Сумма положительных элементов массива - Assembler/MASM
Формулировка задачи:
Подскажите, пожалуйста, что исправить в этой программе, чтобы она считала сумму положительных элементов массива? В данный момент считает сумму всех элементов
; ########################### .486 ;.686P .model flat, stdcall option casemap :none ; case sensitive ; ############################# include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 ; ##################ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ .data szDlgTitle db "Массив",0 szMsg db "Сумма всех элементов массива",0 msg_title1 db "Массив:", 2 A DB 1h x dd 0,1,-2,3,4,5,6,-7,8,-9 n dd 10 buffer db 128 dup(?) format db "%d",0 ; ##################### КОД ПРОГРАММЫ .code start: push MB_OK push offset szDlgTitle push offset szMsg push 0 call MessageBox push 0 MOV EAX,0 ;обнуление регистра EAX c целью очистки от мусора MOV ECX,n MOV EBX,0 L: ADD eax, x[ebx] ADD ebx, TYPE x dec ecx ;уменьшение операнда на 1 cmp ecx,0 ;сравнение jne L ;########################## ВЫЗОВ ФОРМЫ invoke wsprintf,addr buffer,addr format,eax invoke MessageBox, 0,addr buffer,addr msg_title1, MB_OK invoke ExitProcess, 0 end start
Решение задачи: «Сумма положительных элементов массива»
textual
Листинг программы
mov ecx, [n] lea esi, [x] mov ebx, 0 ;сумма mov edx, 0 ;вспомогательное значение @@For: lodsd or eax, eax cmovs eax, edx ; eax>=0? eax : 0 add ebx, eax loop @@For
Объяснение кода листинга программы
- mov ecx, [n] ; ecx - счётчик цикла, n - количество элементов в массиве
- lea esi, [x] ; esi - указатель на массив
- mov ebx, 0 ; ebx - сумма элементов
- mov edx, 0 ; edx - вспомогательное значение
- lodsd ; загружаем из массива в eax следующий элемент
- or eax, eax ; проверяем на ноль
- cmovs eax, edx ; если eax не равен нулю, то присваиваем ему значение edx (0)
- add ebx, eax ; прибавляем к сумме текущий элемент
- loop @@For ; переходим к следующему элементу
- jnz @@For ; если счётчик не равен нулю, то продолжаем цикл
- mov eax, ebx ; выводим сумму на экран
- int 0x21 ; выход из программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д