ARM 程序集中对 'function_name' 的未定义引用
Undefined reference to 'function_name' in ARM assembly
我正在尝试将一些使用两个函数 fact
和 exp
的相对简单的代码放在一起。但是,每当我尝试分支到它们中的任何一个时,我都会收到一条错误消息:undefined reference to 'fact'
和 undefined reference to 'exp'
。我尝试将 .global fact
和 .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
在 GNU 汇编程序中,.func
and .endfunc
only serve to emit debugging info。它们不会代替实际定义标签。 (他们也不会发出任何序言或结尾代码,这可能是您的下一个猜测。)
所以你应该简单地写,至于你的其他切入点:
fact:
mul x2, x2, x7
// ...
您最好省略 .func/.endfunc
,除非您还要为其余代码生成正确的调试信息,这通常不值得手写汇编的麻烦。
我正在尝试将一些使用两个函数 fact
和 exp
的相对简单的代码放在一起。但是,每当我尝试分支到它们中的任何一个时,我都会收到一条错误消息:undefined reference to 'fact'
和 undefined reference to 'exp'
。我尝试将 .global fact
和 .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
在 GNU 汇编程序中,.func
and .endfunc
only serve to emit debugging info。它们不会代替实际定义标签。 (他们也不会发出任何序言或结尾代码,这可能是您的下一个猜测。)
所以你应该简单地写,至于你的其他切入点:
fact:
mul x2, x2, x7
// ...
您最好省略 .func/.endfunc
,除非您还要为其余代码生成正确的调试信息,这通常不值得手写汇编的麻烦。