【问题标题】:ARM loop cmp issueARM循环cmp问题
【发布时间】: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 conditionMore,它只是 bgt,因为您希望等于返回不同的值(a==b 或 R0==R1)。您可以使用递归或 inline foo 的其余部分而不使用递归。我会检查一下a compiler does
  • 谢谢你。我将其更改为 bgt 并且能够更准确地指出我做错了什么。最后我把它改成了ble L2,在L2中做了bne。让它为我需要的结果工作。再次感谢您

标签: assembly arm


【解决方案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 将被损坏。而如果需要修改其他寄存器,则需要将它们压入堆栈并在返回之前恢复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2014-05-23
    • 2022-12-20
    • 2018-11-05
    • 2011-09-13
    相关资源
    最近更新 更多