ARM循环cmp问题

时间:2016-03-28 03:37:29

标签: assembly arm

这是作业。我一直试图找出我做错了很长一段时间。作业是:

  

请考虑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的输出。

1 个答案:

答案 0 :(得分:1)

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

int less(int a, int b)

将是:

  • a(第一个参数)在r0
  • 中传递
  • b(第二个参数)在r1
  • 中传递
  • 必须将返回值写入r0
  • lr移至pc以从功能
  • 返回

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

获取结果

您还需要保持警觉,当您调用某个函数时,r0-r3将被破坏。如果你需要修改其他寄存器,你需要将它们推入堆栈并在返回之前恢复。