Assembly 为什么ld会在另一个函数中找到一个未定义的引用,而不是具有该引用的函数
作为一种爱好,几年前在大学里短暂地看过手臂装配之后,我正试图学习它 我修改了一个小的伪Hello World程序(在一本书中找到),如下所示:Assembly 为什么ld会在另一个函数中找到一个未定义的引用,而不是具有该引用的函数,assembly,linker,arm,ld,Assembly,Linker,Arm,Ld,作为一种爱好,几年前在大学里短暂地看过手臂装配之后,我正试图学习它 我修改了一个小的伪Hello World程序(在一本书中找到),如下所示: .global _start _start: ldr R1,=msgtxt mov R2,#11 bl v_asc mov R0,#
.global _start
_start: ldr R1,=msgtxt
mov R2,#11
bl v_asc
mov R0,#0
mov R7,#1
svc 0
.text
v_asc: mov R0,#1
mov R7,#4
svc 0
bx LR
.end
.data
msgtxt: .ascii "Yeah Baby!\n"
LD抛出以下错误:
程序o:在函数v_asc':(.text+0x1c):未定义
参考
msgtxt'
只需将.data部分放在.text部分之上,它就会像一个符咒一样工作。但是,_start仍然在上面。数据:
但这让我感到困惑:
为什么LD在v_asc中假装引用在v_start中?为什么行“ldr R1,=msgtxt”不抛出未定义的引用
提前感谢。我在回答我的问题,因为Jester在评论中这样做了(谢谢!) 我犯了一个新手错误,不理解这个程序。整个程序都结束了
至于关于未定义引用的主要问题,这是因为“=”的语义将常量放在文本池中,而在对象文件中,该文本池位于v_asc之后(我在本页中发现了更多信息:)。不要将内容放在
之后。end
因为这将被忽略。你的街区顺序无关紧要。至于误导性的消息,那只是因为=
指示汇编程序将常量放入一个文本池,而该文本池恰好位于v_asc
之后。
.global _start
_start: ldr R1,=msgtxt
mov R2,#11
bl v_asc
mov R0,#0
mov R7,#1
svc 0
.data
msgtxt: .ascii "Yeah Baby!\n"
.text
v_asc: mov R0,#1
mov R7,#4
svc 0
bx LR
.end