2014-02-05 50 views
0

我是裝配程序設計(x86)的新手,無法弄清楚我的程序出錯了。在我重新顯示移入數組的值後,我想要顯示當前的'SUM'。我認爲通過使用'ebx'寄存器,除了在Loop2之外,它在程序中沒有其他地方使用,所以值不會被覆蓋,因此每個'add'語句都會將新的數組位置值添加到我的'SUM' 。爲什麼程序不能精確計算整數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 

回答

1

在調用WriteInt之前,您需要將ebx移至eax。在求和循環之前將ebx初始化爲0也是一個好主意。

+0

我試着按你的建議去做(如果我理解正確的話)。現在所有的行都以數組的輸出形式讀取,後面跟着'「Sum現在是:+0」'。我上面編輯了我的代碼以反映更改。還有什麼想法? –

+0

你已經把'mov eax,ebx'放在了錯誤的地方。把它放在'call WriteInt'之前# – ooga

+0

我把'mov eax,ebx'移到'add ebx,[esi]'和'call WriteInt'之上。現在的輸出是: '+1總和現在:+1 +2總和現在:+2 +3總和現在:+ 3' 我還遺失了什麼? –

1

也許你要 「MOV EAX,EBX」 調用最後WriteInt之前。

+0

我按照你和ooga的建議編輯了我的代碼。輸出現在讀取爲數組值,後面跟着'「Sum,現在是:+0」',帶有我修改過的代碼。還有什麼想法? –