我写了一些代码来解决这个提示:
创建一个提示用户输入数字的 HLA 汇编语言程序。创建并调用计算斐波那契数列中的值的函数。在数学中,斐波那契数列以意大利数学家比萨的莱昂纳多命名,他生前被称为斐波那契。斐波那契数列从 1 和 1 开始。数列中的后一项是前两个值的总和。所以系列将是:1,1,2,3,5,8,13 等等。为了获得完整的信用,您必须使用递归来解决这个问题,构建一个签名为:
程序 fibRec(值:int8);@无显示;@无框; 以下是一些示例程序对话来指导您的工作:
提供一个数字:3 fib(3) = 2
提供一个字母:5 fib(5) = 5
为了帮助您专注于构建汇编程序,我想为您提供以下符合上述程序规范的 C 语句。如果您愿意,可以将它们用作构建您的汇编程序的基础。
SAMPLE C CODE:
------------------------
int main( )
{
int value;
printf( "Provide a value: " );
scanf( "%d", &value );
int f = fibRec( value );
printf( "fib( %d ) = %d\n", value, f );
return( 0 );
}
int fibRec( int value )
{
int result = 1;
if (value == 1 || value == 2) // base case
result = 1;
else
result = fibRec( value-1 ) + fibRec( value-2 );
return( result );
}
我的方法是尝试使用C实现并将其转换为HLA。当我运行程序时,我得到一个无限循环(cmd 崩溃),这可能是因为我使用递归的方式。我不确定如何实施
否则结果 = fibRec(value-1) + fibRec(value-2);
C 实现的一部分。
这是我所拥有的:
program fib;
#include("stdlib.hhf");
static
value : int8;
//returnAddress : dword;
//temp: int16;
procedure fibRec( value : int8 ); @nodisplay; @noframe;
begin fibRec;
mov(CL, value);
mov(1, DL);
cmp(CL, 1);
je Res1;
cmp(CL, 2);
je Res1;
jmp Else1;
//else result = fibRec( value-1 ) + fibRec( value-2 );
Else1:
//mov(1, DL);
dec(CL);
call fibRec;
sub(2, CL);
call fibRec;
add(CL, DL);
jmp ProgExit;
Res1:
mov(1, DL);
jmp ProgExit;
ProgExit:
end fibRec;
/////////////////////////////////////////////////////////////////////////////////////////////////////
begin fib;
stdout.put( "Provide a value: " );
stdin.get(value); //CHANGED TO IVALUE
mov(CL, value); //SAVES THE INPUT TO A REGISTER
call fibRec; // MUST CALL THE PROCEDURE
stdout.put("fib(");
stdout.puti8(value);
stdout.put(") = ");
stdout.put(DL);
end fib;