这是ARM架构,Raspberry Pi 3B。当我尝试使用与C相同的方法从汇编语言源生成lib * .so时,发生了一个奇怪的错误。我的 Makefile 如下所示:
a.s: a.S
cpp -o $@ $<
a.o: a.s
as -o $@ $<
liba.so: a.o
gcc -shared $^ -o $@
main: main.c liba.so
gcc -L. $< -la -o $@
a_debug.o: a.s
as -gstabs+ -o $@ $<
main_debug: main.c a_debug
gcc $^ -o $@
main_debug 可以毫无问题地制作;但在制作 main 时,链接器报告错误:
libfxp.so:对“r2”的未定义引用
为什么将寄存器助记符作为标签?
答案 0 :(得分:0)
这一切都是因为我误用了GNU汇编程序的宏机制。
我定义了一个宏:
.macro neg64 reg0, reg1, insset
mvn \reg0, \reg0
mvn \reg1, \reg1
.if \insset == 32
adds \reg0, \reg0, #1
adc \reg1, #0
.else
mov \insset, #1
cmn \reg0, \insset
adc \reg1, \reg1, \insset
sub \reg1, \reg1, #1
add \reg0, \reg0, #1
.endif
.endm
并称之为:
neg64 r0, r1, r2
然后发生了这个错误。在我的想象中,这将在致电&#39; neg64 32&#39;在ARM模式和&#39; neg64&#39;在Thumb模式下,但事实并非如此。很明显,汇编宏扩展以与C预处理器不同的方式工作,它只是文字替换。我的解决方案是抛弃这个奇怪的定义并编写一个“neg64_arm”#39;和&#39; neg64_thumb&#39;。确切的答案需要更多地参考GNU汇编程序手册。