微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AArch64程序集中未采用无条件分支

如何解决AArch64程序集中未采用无条件分支

我刚刚开始学习ARM汇编,并且我一直在尝试编写一个相对简单的程序。完成后,用户将能够输入一个数字(出现提示时)以指示他们想要打印的斐波那契数列的输入。当前,我要做的就是打印提示,然后打印一个硬编码的条目(在这种情况下,我选择了第4个)。稍后我会弄清楚用户的输入。

但是,我遇到了分支(BL)问题。我能够跳转到外部函数printf来打印提示,但是编译器似乎无法识别到fibo的第二个分支。我之所以这样假设,是因为无论我将 targ 设置为什么数字,它始终会打印出x3的初始值1-,但是情况下,无论进入循环之前x3的值是多少,它都会打印出1。函数“ fibo”用于将x3的当前值以及返回地址存储在内存中,检查计数器是否小于或等于目标#,然后返回到loop。然后循环修改x3和x4以便进行尾递归-因此x3肯定应该在更改。谁能说明我的问题?

  .text
  .global main
  .extern printf
main:
    mov x3,xzr  // set x3 and x4 -> (0,1)
    mov x4,#1

    ldr x1,=targ  // set x1 to target (currently manually set)

    ldr x0,=prompt // print prompt
    bl printf

loop:
    mov x9,x3      // this chunk: (1,1) -> (1,2) -> (3,5) ..
    mov x3,x4
    add x4,x9,x4

    bl fibo  // branch to fibo

    ldr x30,[sp,#8]  // load value and return address from stack
    ldr x3,#0]
    add x2,x3,x2   // x2 = x3 + x2
    add sp,sp,#16  

    mov x0,x2        // print out x2 by moving it to x0,then calling printf
    ldr x0,=stringpr
    bl printf 

    br x30

fibo:
    sub sp,#16
    str x30,#8]
    str x3,#0]   // store current value of x3 in stack
    add x5,x5,#1
    cmp x5,x1    // test x5 (counter) is greater than target; if it is,ignore branch
    ble loop
    mov x2,#0
    add sp,#16
    br x30
.data
    prompt:
        .asciz "Enter a number:\n"
    targ:
        .byte 4   // hard-coded value for 'targ'
    stringpr:
        .asciz "%d\n"
.end

编辑

注册用法

  • x0->在使用printf打印变量时使用
  • x1->存储'targ'变量,即目标斐波那契条目
  • x2->保存斐波那契条目的返回值
  • x3->保留斐波那契序列的尾递归的“尾”端。
  • x4->保持尾递归的“头”端(例如[1,2]中为'2',[5,8]中为'8')
  • x5->保留计数,并在每次调用fibo时递增

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。