循环执行多次

时间:2013-07-14 17:33:08

标签: assembly x86 masm irvine32

从这个循环中获得一个奇怪的结果。它正在执行的次数超过应有的次数。它应该在重新计算时继续显示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

编辑:在其余代码中添加

1 个答案:

答案 0 :(得分:2)

问题似乎是你在开始循环之前没有将count的值放在ecx中。您对ReadString的来电显然会将值存储在fibCount中。您从中减去2并将其存储在count中,但您永远不会更改ecxecx中设置的唯一值是32

我想你会用以下方法解决你的问题:

    call CrLf
    mov ecx, count ; <== add this line
L1:
    mov count, ecx