将两个程序集文件与文本和数据部分组合在一起

时间:2019-02-08 02:21:21

标签: gcc assembly arm

我有两个汇编文件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

2 个答案:

答案 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'结构偏移量,转换常量等。