曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4706|回复: 0
打印 上一主题 下一主题

基本汇编程序框架

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2009-11-26 20:20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个汇编程序由定义好的段构成,每个段都有不同的目的。三个最常用的段为:
      数据段 (.data)
      bss 段  (.bss )
      文本段 (.text )
文本段是每个程序必须有的,因为这里是放置可执行程序指令码的地方。
数据段和 bss 段是可选的,但在程序中经常使用。数据段声明带有初始值的数据元素,这些数据元素用作汇编语言程序中的变量。bss 段声明使用零 (或者 null) 值初始化的数据元素,这些元素最常用做程序里的缓冲区。三个段,一般的合理布局如下图所示:


定义段:

GNU 汇编器用 .section 命令语句声明段。.section 语句只使用一个参数 --- 它声明的段的类型。上图是汇编程序的一个基本布局,也是对段安排的一般方式。bss 段总是应该安排在文本段之前,但是数据段可以移动到文本段之后。尽管这不是标准,但这样会使得代码更容易阅读,而且别人也更容易接手你的工作。

定义起始点:
当汇编语言编译成可执行文件时,连接器必须知道指令码中的起始点在哪里。对于只有单一路径的简单程序,找到起点通常不是问题,但如果对于函数分散在源代码中各个位置的复杂程序,发现程序从哪里开始可能是个问题。
为了解决这个问题,GNU 汇编器声明一个默认标签,或者说是标识符,将其作为程序的入口点 --- _start 标签就是用来告诉程序应该从这条指令开始运行。如果连接器找不到这个标签,就会生成错误信息,比如我在一个汇编程序里,将 _start 改成 s_start: ,那么在用 ld 连接时,会因为连接器找不到 _start 而发出如下警告:
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074
beyes@beyes-groad:~/programming/assembly/cpuid$ cat cpuid.s
如上面输出,如果连接器找不到 _start 标签,它就会试图查找程序的起始点,但是对于复杂的程序,不能保证连接器能正确地做出猜测。

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

除了在应用程序中声明起始标签外,还需要为外部应用程序提供入口点,这通过使用 .global 命令完成。

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

一个汇编语言程序模板
.section .data
       < 在这里对数据初始化 >

.section .bss
        < 未初始化数据 >

.section .text
.global _start
_start:
         < 程序代码在此 >
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-16 01:41 , Processed in 0.065278 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表