Почему программа не точно вычисляет целочисленную сумму?

Я новичок в программировании на ассемблере (x86) и не могу понять, где я ошибаюсь в своей программе. После того, как я повторно отобразил значение, которое было перемещено в массив, я хочу отобразить текущую «СУММУ». Я думал, что с помощью регистра «ebx», поскольку он больше нигде в программе не используется, кроме как в Loop2, значение не будет перезаписано, и, таким образом, каждый оператор «добавить» будет добавлять новое значение позиции массива к моему «SUM». .

Может ли кто-нибудь определить, что я делаю неправильно?

ConsoleWindow

INCLUDE Irvine32.inc
COUNT = 3

.data
inputMsg BYTE "Input an integer: ", 0
outputMsg BYTE "Redisplaying the integers: ", 0dh, 0ah, 0
sumMsg BYTE " Sum is now: ", 0
strArray SDWORD COUNT DUP(?)

.code
main PROC
    ; Read Integers from User
    mov ebx, 0
    mov ecx, COUNT
    mov edx, OFFSET inputMsg
    mov esi, OFFSET strArray

L1: call WriteString            ; Display Prompt
    call ReadInt                ; Read input from user
    mov [esi], eax              ; Store value into array
    add esi, TYPE strArray      ; Move to next array position
    loop L1

    call Crlf

    ; Redisplay the integers
    mov edx, OFFSET outputMsg   ; Display 'outputMsg'
    call WriteString
    mov ecx, COUNT
    mov esi, OFFSET strArray

L2: mov ebx, 0                  ; Initialize ebx to 0
    mov eax, [esi]              ; Get integer from array
    call WriteInt               ; Display integer
    mov edx, OFFSET sumMsg      ; Display value of 'sumMsg'
    call WriteString
    ; mov eax, ebx
    add ebx, [esi]

    mov eax, ebx   ; <---- MOVED from above add ebx, [esi]

    call WriteInt
    call Crlf                   
    add esi, TYPE strArray      ; Move to next array position
    loop L2

    exit
main ENDP

END main

person Analytic Lunatic    schedule 05.02.2014    source источник


Ответы (2)


Вам нужно переместить ebx в eax перед вызовом WriteInt. Инициализация ebx в 0 перед циклом суммирования также была бы хорошей идеей.

person ooga    schedule 05.02.2014
comment
Попробовал сделать как вы предложили (если я правильно понял). Теперь все строки, прочитанные как вывод, образуют массив, за которым следует "Sum is now: +0". Я отредактировал свой код выше, чтобы отразить изменения. Есть еще идеи? - person Analytic Lunatic; 06.02.2014
comment
Вы поставили mov eax, ebx не в том месте. Поместите это непосредственно перед call WriteInt - person ooga; 06.02.2014
comment
Я переместил mov eax, ebx под add ebx, [esi] и выше call WriteInt. теперь вывод: +1 Sum is now: +1 +2 Sum is now: +2 +3 Sum is now: +3 Что мне еще не хватает? - person Analytic Lunatic; 06.02.2014
comment
mov ebx, 0 должно быть перед L2, иначе вы сбрасываете свою сумму до 0 на каждой итерации. - person ooga; 06.02.2014
comment
Так и было, СПАСИБО! :) - person Analytic Lunatic; 06.02.2014

Вероятно, вам нужно «переместить eax, ebx» перед вызовом последнего WriteInt.

person Rémi    schedule 05.02.2014
comment
Я отредактировал свой код, как предложили вы и ooga. Вывод теперь читается как значение массива, за которым следует "Sum is now: +0" с моим измененным кодом. Любые дальнейшие идеи? - person Analytic Lunatic; 06.02.2014