2

我一直在为分配工作编写此代码,似乎无法正确输出。谁能帮帮我?

注意:程序在 MASM 中编译

  1. 我只被允许使用reg-memreg-reg架构命令。
  2. 仅使用MOVADDDECJMPJcc指令。
  3. 仅使用四个主要寄存器,即EAXEBXECXEDX,以及ESI寄存器及其子寄存器进行算术/逻辑运算。
  4. 除了字符串内存变量之外,不允许使用其他内存变量。

以下是代码:

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
4

3 回答 3

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
; ...
于 2013-04-14T16:08:56.740 回答
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, ...

于 2017-03-19T14:52:38.670 回答
0

哦,天哪,人们是根据欧文的东西来教学的吗?这解释了很多。

我认为您需要这样考虑:

你需要记住3个数字:

  • 当前号码

  • 以前的号码

  • 当前和以前的总和

然后将当前移动到上一个,汇总到当前并继续。

所以如果你设置为 ebx=current value, edx=previous value, ecx= number of values to output

然后您可以使用中央循环,例如:

fib_loop:
    mov eax, ebx
    add eax, edx
    mov edx, ebx
    mov ebx, eax
    call writeint
    dec ecx
jnz fib_loop

注意:我从您的评论中获取了 'writeint' proc 的行为,它仅在输出设备上显示 eax,并假设它不会与任何其他寄存器混淆。

于 2017-03-19T14:30:25.947 回答