0

我正在尝试将一些相对简单的代码放在一起,这些代码使用两个函数,fact并且exp. 但是,每当我尝试分支到其中任何一个时,都会收到一条错误消息,内容为:undefined reference to 'fact'undefined reference to 'exp'. 我尝试将.global factand添加.global exp到文件的顶部,但这没有帮助。这是我的代码:

.text
.global main
.extern printf

main:
    ldr x2,=x // load 'x' -> x value
    ldr d2,[x2]
    ldr x2,=n  // load 'n' -> stopping point
    ldr x3,[x2]
    mov x2,#1 // set i/exp value to 1
    scvtf d1,x2  // default d1 (return value) to 1.0
loop:
    subs xzr, x3, x2
    ble done
    sub sp, sp, #16
    str x2,[sp] // save the value of x2 first
    sub x7, x2, #1

    bl fact

    ldr x2,[sp]   // get original x2 value back
    add sp, sp, #16
    mov x5, #0
    fmov d4, d2

.func fact
    mul x2, x2, x7
    sub x7, x7, #1
    cbnz x7,fact
    mov x4, x2
    br x30
.endfunc

.func exp
    fmul d4, d4, d4
    add x5, x5, #1
    cmp x5, x2

    bl exp

    br x30
.endfunc

done:
    // done

.data
    n:
    .quad 5
    x:
    .double 1.45
.end
4

1 回答 1

2

在 GNU 汇编器中,.func.endfunc用于发出调试信息。它们不能代替实际定义标签。(它们也不会发出任何序言或尾声代码,这可能是您的下一个猜测。)

因此,对于其他入口点,您应该简单地编写:

fact:
    mul x2, x2, x7
    // ...

除非您还要为其余代码生成正确的调试信息,否则您也可以省略.func/.endfunc,这对于手写汇编通常不值得。

于 2020-12-10T20:47:45.560 回答