首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM循环cmp问题

ARM循环cmp问题
EN

Stack Overflow用户
提问于 2016-03-28 03:37:28
回答 1查看 752关注 0票数 0

这是作业。很长一段时间以来,我一直在努力弄清楚自己做错了什么。任务是:

考虑C中的以下代码:

代码语言:javascript
复制
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 结束

到目前为止我的代码是:

代码语言:javascript
复制
@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的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-28 13:22:43

您所缺少的是如何传递参数并返回值。在ABI臂上,相当于:

代码语言:javascript
复制
int less(int a, int b)

将是:

  • a (第一个参数)在r0中传递
  • b (第二个参数)在r1中传递
  • 返回值必须写入r0
  • Mov lrpc从函数返回

因此,要调用less函数,需要:-将a移动到r0 --将b移动到r1 --调用函数(bllt) --确保调用bl (分支和链接),而不是简单的b (分支)。分支和链接表单在bl之后复制指令的地址,以允许返回-从r0获得结果。

当您调用一个函数时,r0-r3将被破坏,这一点您也需要认真考虑。如果您需要修改其他寄存器,则需要在返回之前将它们推到堆栈上并进行还原。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36255587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档