作为一个爱好,我几年前在大学里简单地看到它后,我正在努力学习ARM装配。
我用这种方式修改了一个伪的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抛出以下错误:
prog.o:在函数
v_asc': (.text+0x1c): undefined reference to
msgtxt'
简单地将.data部分放在.text上面就可以使它像魅力一样工作。但是,_start仍然高于.data:
.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
但这让我感到困惑:
为什么LD在_start中假装引用是在v_asc中?为什么行“ldr R1,= msgtxt”不会抛出未定义的引用?
谢谢你提前。
我正在回答我的问题,因为Jester在评论中做了这件事(谢谢!)。
我犯了一个菜鸟错误,不理解.end是整个节目。
至于关于未定义引用的主要问题,它是由于'='的语义将常量放在文本池中,在文件池中,在目标文件中,在v_asc之后(我在这个页面中发现了更多:http://benno.id.au/blog/2009/01/02/literal-pools)。