这是作业。我一直试图找出我做错了很长一段时间。作业是:
请考虑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
END
如果用户输入10然后输入4:
10 4 0
END
到目前为止我的代码是:
@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的输出。
答案 0 :(得分:1)
您缺少的是如何传递参数并返回值。在ARM ABI上,相当于:
int less(int a, int b)
将是:
a
(第一个参数)在r0 b
(第二个参数)在r1 lr
移至pc
以从功能因此,要调用less
函数,您需要:
- 将a
移至r0
- 将b
移至r1
- 调用函数(bllt
) - 确保调用bl
(分支和链接)而不是简单的b
(分支)。分支和链接表单在bl
之后复制指令的地址以允许返回
- 从r0
您还需要保持警觉,当您调用某个函数时,r0-r3
将被破坏。如果你需要修改其他寄存器,你需要将它们推入堆栈并在返回之前恢复。