我一直在研究这个代码的分配,似乎无法让输出正确。有人可以帮帮我吗?
注意:该程序是在MASM中编译的
以下是代码:
INCLUDE Irvine32.inc
.data
string1 byte "Enter number to generate Fibonacci series: ",0
string2 byte "Fibonacci is ",0
.code
main PROC
call DumpRegs;
mov edx,offset string1;
call writestring;
call ReadInt;
mov ecx,eax;
mov eax,1;
call DumpRegs;
dec ecx;
mov esi,eax;
JMP Jumpzero;
mov edx, offset string2;
call writeint ; Display the contents of eax register on the output device
Jumpzero:
add eax,esi;
call DumpRegs;
inc esi;
dec ecx
jnz Jumpzero
exit
MAIN ENDP
END main
答案 0 :(得分:0)
; ...
call ReadInt
mov ecx,eax
mov eax,1
mov edx,eax
call writeint ; Assuming EDX is incremented by writeint
_generate:
call writeint
add eax,edx
mov edx,eax
loop _generate
; ...
答案 1 :(得分:0)
我认为你需要像这样思考:
你需要记住3个数字:
当前号码
以前的号码
当前和之前的总和
然后将电流移至上一个,总和为当前并继续。
因此,如果您设置为ebx =当前值,edx =先前值,ecx =要输出的值的数量
然后你可以使用像:
这样的中央循环fib_loop:
mov eax, ebx
add eax, edx
mov edx, ebx
mov ebx, eax
call writeint
dec ecx
jnz fib_loop
注意:我正在采取' writeint'的行为。从你的评论中得出它只在输出设备上显示eax,并假设它不会混淆任何其他寄存器。
答案 2 :(得分:0)
斐波那契只需要跟踪两个数字。如果允许XCHG,逻辑将是:
swap(A, B)
A += B
如果没有,那么交换需要一个临时变量:
D = B
B = A
A = D
A += B
A和B的初始值取决于您想要的第一个输出。例如,从A = 1(fib(-1))开始,B = -1(fib(-2)),然后将产生序列0,1,1,2,3,5 .......或者从A = 0(fib(0)),B = 1(fib(-1))开始,产生序列1,1,2,3,5 ......