Assembly 为什么ld会在另一个函数中找到一个未定义的引用,而不是具有该引用的函数

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,#

作为一种爱好,几年前在大学里短暂地看过手臂装配之后,我正试图学习它

我修改了一个小的伪Hello World程序(在一本书中找到),如下所示:

 .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