0

从这个循环中得到一个奇怪的结果。它执行的次数超出了应有的次数。它应该在重新计算时继续显示 fib_2。到底是怎么回事?

INCLUDE Irvine32.inc

UPPERBOUND = 47
LOWERBOUND = 0

.data
userName        BYTE    33 DUP(0)   ;string to be entered by user
intro_1     BYTE    "Fibonacci Numbers", 0
intro_2     BYTE "Programmed by Marshall Todt", 0
prompt_1        BYTE    "What's your name? ", 0
intro_3     BYTE    "Hello, ", 0
intro_4     BYTE "Enter the number of Fibonacci terms to be displayed", 0
prompt_2        BYTE    "How many Fibonacci terms do you want? ", 0
intro_5     BYTE "Give the number as an integer in the range [1...46].", 0
error_1     BYTE    "Number of Fibonacci terms must be in the range [1-46].", 0
fibCount        DWORD ?
fib_1       DWORD 1
fib_2       DWORD 1
fib_3       DWORD ?
goodBye_1       BYTE "Answers certified by Marshall Todt.", 0
goodBye_2       BYTE    "Good-bye, ", 0
count       DWORD ?

.code
main PROC

;Introduction
mov     edx, OFFSET intro_1
call    WriteString
call    CrLf
mov     edx, OFFSET intro_2
call    WriteString
call    CrLf
call CrLf

;getUserData
mov     edx, OFFSET prompt_1
call    WriteString
mov     edx, OFFSET userName
mov     ecx, 32
call    ReadString


;userInstructions
mov     edx, OFFSET intro_3
call    WriteString
mov     edx, OFFSET userName
call    WriteString
call    CrLf
    mov     edx, OFFSET intro_4
call    WriteString
call    CrLf
mov     edx, OFFSET intro_5
call    WriteString
call    CrLf
reEnter:
call CrLf
mov     edx, OFFSET prompt_2
call    WriteString
mov     edx, OFFSET fibCount
mov     ecx, 32
call    ReadString

;mov      eax, fibCount
;cmp    eax, LOWERBOUND
;jg    reEnter         ;jumps to reEnter if the number of fibonacci terms is not higher than the LOWERBOUND
;mov      eax, fibCount
;cmp    eax, UPPERBOUND
;jl    reEnter          ;jumps to reEnter if the number of fibonacci terms is not lower than the UPPERBOUND

mov eax, fibCount
sub eax, 2
mov count, eax

;displayFibs
mov eax, fib_1
Call WriteDec
Call CrLf
L1: 
mov count, ecx
mov eax, fib_2
Call WriteDec
Call CrLf

;calculate Fibs
mov eax, fib_1
add eax, fib_2
mov fib_3, eax
mov eax, fib_2
mov fib_1, eax
mov eax, fib_3
mov fib_2, eax
mov ecx, count
loop L1

;farewell
 mov  edx, OFFSET goodBye_1
call WriteString
call CrLf
mov     edx, OFFSET goodBye_2
call    WriteString
mov     edx, OFFSET userName
call    WriteString
call    CrLf

exit    ; exit to operating system
main ENDP

END main

编辑:在其余代码中添加

4

1 回答 1

2

问题似乎是您count在开始循环之前没有将 ecx 的值放入。您的调用ReadString显然将值存储在fibCount. 您从中减去 2 并将其存储在 中count,但您永远不会改变ecx。唯一设置的值ecx32.

我想你会解决你的问题:

    call CrLf
    mov ecx, count ; <== add this line
L1:
    mov count, ecx
于 2013-07-14T18:05:41.800 回答