【发布时间】:2016-03-28 03:37:28
【问题描述】:
这是作业。很长一段时间以来,我一直试图弄清楚我做错了什么。作业是:
考虑下面的 C 代码:
int foo(int a, int b)
{
if (a > b) return 0;
if (a == b) return b;
return a + foo(a+1, b);
}
在汇编中实现这个函数。从你的分支回来后 函数,输出应该如下。如果用户输入 4 然后 10: 4 10 49
结束
如果用户输入 10 那么 4:
10 4 0
结束
到目前为止我的代码是:
@main program
_start:
mov sp,#0x100000 @ set up stack
ldr r4,=0x101f1000
@ ASCII codes stored
@ at [r4] get printed
@ get input
bl get_int
mov r5, r0
bl get_int
mov r6, r0
@ mov a to r0 b to r1
mov r0, r5
mov r1, r6
@ branch to the function you write
bl foo
@ print the number in r0 after branching back from your function
bl print10
@ branch to exit
b my_exit
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Your code starts here @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
foo:
cmp r0,r1
blt Less
bge More
mov r0,r1
b Exit
Less:
mov r3,r0
add r0,r0,#1
add r3,r3,r0
cmp r0,r1
blt More
mov r0,r3
More:
mov r0,#0
Exit:
bx lr
我遇到的问题是当我运行它时,无论我输入什么数字,我总是得到 0 的输出。
【问题讨论】:
-
我不确定您在
Less:上要做什么,但这是不对的。您应该在那里做的是调用foo并带有参数a+1, b并返回结果加上a的当前值。 -
bge不是 the right condition 的More,它只是bgt,因为您希望等于返回不同的值(a==b 或 R0==R1)。您可以使用递归或 inlinefoo的其余部分而不使用递归。我会检查一下a compiler does。 -
谢谢你。我将其更改为 bgt 并且能够更准确地指出我做错了什么。最后我把它改成了ble L2,在L2中做了bne。让它为我需要的结果工作。再次感谢您