这是作业。很长一段时间以来,我一直在努力弄清楚自己做错了什么。任务是:
考虑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的输出。
发布于 2016-03-28 13:22:43
您所缺少的是如何传递参数并返回值。在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将被破坏,这一点您也需要认真考虑。如果您需要修改其他寄存器,则需要在返回之前将它们推到堆栈上并进行还原。
https://stackoverflow.com/questions/36255587
复制相似问题