爱技术 & 爱分享
爱蛋蛋 & 爱生活

汇编程序组成

汇编语言程序由定义好的段构成,最常用的三个段:

  • 数据段
  • BSS段(Block Started by Symbol Segment)
  • 文本段

所有汇编语言程序中都必须有文本段,这里是在可执行程序声明指令码的地方。数据段和BSS段是可选的,数据段声明带有初始值的数据元素,BSS段使用零或null初始化数据元素。

GNU汇编器使用.section命令语句声明段。一般来讲BSS段总应该在文本段之前,数据段可以在文本段之后(不标准)。

GNU汇编器声明一个默认(_start)标签来指明程序入口,用于表明程序应该从这条指令开始运行,如果没有这个标签链接器(ld)就会打印错误信息,并且它就会试图查找程序的起始点,但是对于复杂的程序,不能保证连接器能正确地作出猜测。

也可以使用_start之外的其他标签作为起始点。可以使用链接器的 -e参数定义新的起始点的名称。

GCC默认使用main标签。

除了在应用程序中声明起始标签之外,还需要为外部应用程序提供人口点。这是使用globl命令完成的。

globl命令声明外部程序可以访问的程序标签。如果编写被外部汇编语言或者C语言程序使用的一组工具,就应该使用globl命令声明每个函数段标签。

汇编: as -o xxx.o xxx.s
链接: ld -o xxx xxx.o

使用ld来进行动态链接C库,ld -lc -o xxx xxx.o

-lc 代表链接 libc.so

但是这样链接出来的程序无法正确执行,因为执行时仍然会无法解析对应的C库函数,因为并没有指定动态加载器来加载动态库。-dynamic-linker参数可以指定运行时的动态库加载程序。

ld -dynamic-linker /lib/ld-linux.so.2 -lc -o xxx xxx.o

赞(0)
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。墨影 » 汇编程序组成