我有两个汇编文件a.s和b.s 我想将两者结合起来并创建一个新的汇编文件c.s 文件c.s应该具有a.s的.text中的所有代码,然后具有b.s的.text中的所有代码。 我想对.data节做同样的事情
# File a.s
VSUB.F32 S4, S5, S6
.data
.word 0x10000000
# File b.s
VADD.F32 S4, S5, S6
.data
.word 0x20000000
# File c.s
.include "a.s"
.include "b.s"
我希望我的输出看起来像这样:
.text
VSUB.F32 S4, S5, S6
VADD.F32 S4, S5, S6
.data
.word 0x10000000
.word 0x20000000
但是,这是转储目标文件后看到的。
Disassembly of section .text:
00000000 <.text>:
0: ee322ac3 vsub.f32 s4, s5, s6
00000000 <.data>:
0: 10000000 .word 0x10000000
4: ee710a21 vadd.f32 s1, s2, s3
8: 20000000 .word 0x20000000
答案 0 :(得分:3)
这就是链接程序到底是什么问题?
a.s
add r0,r0,r0
.data
aaa: .word 0xAAAAAAAA
b.s
add r1,r1,r1
.data
bbbb: .word 0xBBBBBBBB
内部版本:
arm-none-eabi-as a.s -o a.o
arm-none-eabi-as b.s -o b.o
arm-none-eabi-ld -Ttext=0x1000 -Tdata=0x2000 a.o b.o -o ab.elf
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000001000
反汇编:
arm-none-eabi-objdump -D ab.elf
Disassembly of section .text:
00001000 <.text>:
1000: e0800000 add r0, r0, r0
1004: e0811001 add r1, r1, r1
Disassembly of section .data:
00002000 <__data_start>:
2000: aaaaaaaa bge feaacab0 <_stack+0xfea2cab0>
00002004 <bbbb>:
2004: bbbbbbbb bllt feef0ef8 <_stack+0xfee70ef8>
完全没用的代码,但是就这么简单。然后,您可以使用链接器脚本等使它更加复杂。
自然,代码需要有意义,它希望在本地或在其他对象中以合理的方式分支或调用函数。但是通过此示例很容易看出,链接器只是将.text节和.data节放在一起。
除非有链接描述脚本指示,否则我所看到的它们在输出中的顺序取决于链接器命令行上的顺序。
答案 1 :(得分:1)
在每个文件的开头添加.text
。
汇编器从将节设置为.text
开始。但是,当您使用.include
时,它是在包含文件(在您的情况下为 cs )的上下文中,该文件的节从上一个include设置为.data
。 / p>
从理论上讲,您只需要在 bs 源的顶部添加一个.text
,但始终始终在该位置始终使用.text
声明是一个好习惯。汇编程序文件的开始。您可能喜欢.unified
,.thumb
等
链接器确实可以解决此问题,但是一个常见的实际情况是将生成的汇编器与自定义代码混合。通常,您只需要 driver.s 即可包含 generated.s ,而无需第三个文件。生成的文件通常是另一个来源的表或数据结构,例如'C'结构偏移量,转换常量等。