作为一种业余爱好,几年前我在大学里短暂看过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)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句