Сумма положительных элементов массива - 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

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

  1. mov ecx, [n] ; ecx - счётчик цикла, n - количество элементов в массиве
  2. lea esi, [x] ; esi - указатель на массив
  3. mov ebx, 0 ; ebx - сумма элементов
  4. mov edx, 0 ; edx - вспомогательное значение
  5. lodsd ; загружаем из массива в eax следующий элемент
  6. or eax, eax ; проверяем на ноль
  7. cmovs eax, edx ; если eax не равен нулю, то присваиваем ему значение edx (0)
  8. add ebx, eax ; прибавляем к сумме текущий элемент
  9. loop @@For ; переходим к следующему элементу
  10. jnz @@For ; если счётчик не равен нулю, то продолжаем цикл
  11. mov eax, ebx ; выводим сумму на экран
  12. int 0x21 ; выход из программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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