网站大量收购独家精品文档,联系QQ:2885784924

linux汇编语言-GUN AS-chapter4.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux汇编语言-GUN AS-chapter4

本章约定语 可确定的表达式:absolute expression见第6章[表达式], 33页 绝对地址段:absolute section//绝对地址段in chapeter5 4.1 概括 粗略地说,一个段是一个连续的地址范围;在这个地址范围内的所有数据都经过相同处理,以适应具体的用途。例如,可能存在一个‘只读’段。 连接器ld读取多个目标文件(局部过程),把他们的内容组合在一起,形成一个可运行的程序。当as生成一个目标文件时,总是假定这个局部过程的首地址为0。Ld会为局部过程分配最终地址,所以不同的局部程序不会重叠。这么说实际上过分的简化了,但足以解释as如何使用段。 ld负责把您的程序的所有字节块移动至运行地址。这些块可以作为固件移动到它们的运行位置。它们的长度不会改变,内部的字节顺序也不会改变。这样的一个固件被称为一个段。为段分配运行地址叫做重定位。它包括调整相关的目标文件的地址,以便将它们装入恰当的运行地址。针对H8/300 ,H8/500, Hitachi SH,如果需要确保段尾对齐word(16位)边界,as会填充这些段。 一个由as生成的目标文件至少具有3个段,某些可能是空段。这3个段分别叫正文段(text),数据段,bss段。 当它生成COFF格式的输出时,as也能够生成任意您指定名字的段,这些段名用.section命令指定(见7.66 [.section], 52页)。即使您不使用任何能够在正文段和数据段中产生输出命令,这些段仍然存在,但它们是空段。 当as为HPPA生成SOM或ELF格式的输出时,as也能够生成任意您指定名字的段,这些段名通过.space和.subspace命令指定。见在《HP9000 Series 800 Assembly Language Reference Manual》(HP 92432-90001)的.space和.subspace汇编命令中有详尽的描述。 另外,当生成SOM格式的输出文件时,as使用不同的名字来命名标准的正文段,数据段和bss段,程序的正文被放进‘$CODE$’段,数据被放进‘$DATA$’段,BSS被放进‘$BSS$’段。 在目标文件中,正文段(text)由地址0开始,数据段跟随正文段,BSS段跟随数据段。 当在HPPA上生成SOM或ELF输出文件时,正文段从地址0开始,数据段由地址0x4000000开始,BSS段跟随在数据段的后面。 为了让ld清楚在段重定位时那个数据有变化,怎样变化,as也把重定位需要的细节写入目标文件。为了完成重定位任务,ld必须清楚目标文件中每次使用的地址: ?寻址指令的首字节在目标文件中的何处? ?寻址指令的长度(单位字节)? ?寻址的目标是哪个段?(寻址地址)-(目标段首的地址)的数值是多少? ?本次寻址的地址是“程序-计数器相对地址吗?” 实际上,as使用的每个地址都表示为(段)+(段内偏移) 更进一步地说,大多数表达式一般都通过这种段-相对地址(section-relative)来计算。(某些目标格式,如HPPA上的SOM,部分表达式使用符号-相对地址) 在本手册中,我们使用符号{secname N}来表示“在secname段中的偏移量N” 除了正文段,数据段和 bss段之外,您还要了解绝对地址段(absolute section)。当ld连接各个局部过程时,在绝对地址段中的地址将保持不变。例如,地址{absolute 0}被ld重定位到运行地址0处。虽然连接器从来不把两个局部过程的数据段地址分配在重叠的地址中,但两个局部过程中经过定义的绝对地址段必须重叠。程序中某部分的地址{absolute 239}与此程序中任何其它部分的地址{absolute 239},在这个程序运行时总是一个相同的地址。 段的概念延伸到未定义段(undefined section)。段信息在汇编时不明确的地址都被定义为{undefined U}-U以后填入。因为数字总是被定义好的,唯一生成未定义地址的途径是使用一个未定义的符号。访问一个指定的通用块(common block)将生成这样的一个符号:在汇编时无法得知它的值,所以它属于一个未定义段。 如此类推,段在连接好的程序中也经常用来表示多个段组成的段群。在连接好的程序中,ld将所有局部过程的正文段都放在连续的地址中。这是一个习惯,访问一个程序的正文段,表示所有的局部过程的正文段的所有地址。对数据段和bss段来说,也是同样的道理。 有些段由ld来操作。有些段则是专门为as而设,除了汇编时有用,其他时间全无意义。 4.2 连接器段 Ld处理四个类型的段,下面总结一下: 段 名 正文段 数据段 这两种段保存您的程序。as和ld将他们分开处理,但是进行相同的处理。在这种段中成立的东西,在另外那种段中也成

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档