linux汇编语言GUN ASchapter2.docx
《linux汇编语言GUN ASchapter2.docx》由会员分享,可在线阅读,更多相关《linux汇编语言GUN ASchapter2.docx(6页珍藏版)》请在冰豆网上搜索。
linux汇编语言GUNASchapter2
2命令行选项
这一章讲述所有版本的GNU汇编器中可用的命令行选项,如果想了解特定机器体系结构的相关选项,参见第8章[机器相关性],61页。
如果你是通过GNU编译器(版本2)调用as,你可以使用‘-Wa’选项,把参数传给汇编器,这些参数(包括选项-Wa)必须使用逗号分隔。
例如:
gcc-c-g-O-Wa,-alh,-Lfile.c
这个例子传递了两个参数给汇编器:
‘-alh’(以高级语言和汇编语言的形式生成清单到标准输出)‘-L’(在符号表中保留局部符号)。
通常你没必要使用‘-Wa‘选项,因为编译器把很多命令行选项自动传递给汇编器。
(你可以通过’-v‘选项使用GNU编译器,来确切了解有什么选项被传递给编译过程,包括传递给汇编器的选项)
2.1开启清单选项:
-a[cdhlns]
这些选项开启了汇编器的清单输出。
如果只有‘-a’选项,表示需要生成高级语言,汇编语言和符号清单。
你可以用其他字母去选择特定的清单选项:
‘-ah’需要生成一个高级语言清单,‘-al’需要生成一个输出程序的汇编语言清单,‘-as’需要生成符号表的清单。
生成高级语言清单需要使用一个‘-g‘之类的编译调试选项,汇编语言清单(’-al’)也需要上述调试选项。
使用‘-ac’选项删去清单中汇编条件为假(false)的语句。
下列语句行不进行汇编:
一个条件为false的.if语句块(或是.ifdef语句块,或是其他的条件汇编语句块),条件为true的.if后面的那个.else语句块,所有不会被汇编的行都会从清单中删去。
使用选项‘-ad’选项删除清单中的调试命令。
一旦使用了上述某个选项,你就可以使用.nolist,.psize,.title,和.sbttl命令进一步控制清单输出格式。
选项‘-an’关闭所有清单表格的处理。
如果你不需要输出清单,就不必使用一个‘-a’系列的选项,这时的清单控制命令不会生效。
选项‘-a’后的字母可以合成一个选项(例如‘-aln’)。
注意,如果汇编源码来自标准输入(例如源码是由gcc创建,并且使用了‘-pipe’命令行开关),则清单中不含有注释和预处理命令。
这是因为只有在源代码行被汇编器预处理后,清单代码缓冲区才从标准输入中读取源代码行。
这样减少了内存的使用,并且使生成的代码更有效率。
2.2-D
这个选项没什么作用,但as接受这个选项,使那些写给其他汇编器的脚本文件也能被as使用。
2.3快速汇编:
-f
只有在被汇编程序的源码是由可信任的编译器产生的情况下,才能使用‘-f’选项。
使用选项‘-f’时,如果汇编器在汇编输入文件前要对它们进行空格和注释的预处理,则会终止汇编器的汇编。
参见3.1[预处理],17页。
警告:
如果文件事实上需要预处理时(如果它们包含有注释),而你使用了‘-f’,as将不能正常工作。
2.4.include命令搜索路径:
-Ipath
使用这个选项给目录清单加一个路径path,这个目录清单是.Include命令在搜索指定文件使用的,(参见7.37[.include],44页)。
你可以视需要多次使用‘-I’来加入不同的路径。
第一个搜索的总是当前工作目录;然后,as安照命令行中的顺序(从左到右)搜索‘-I’选项指定的目录。
2.5不同的跳转表:
-K
在as中使用‘.wordsym1-sym2’形式的命令有时会改变生成的代码(参考7.92[.word],59页)。
如果在遇到上述情况时您希望as会发出一个警告您可以使用选项‘-K’。
2.6包含局部标签:
-L
以‘L’(必须大写)字母开头的标签叫做局部标签(参见5.3[符号名],29页)。
通常调试时你看不见它们,因为它们是供生成汇编源程序的程序(如编译器)使用的,而不是为了引起你的注意。
一般来讲as和ld丢弃这些标签,所以你不能用它们来调试。
这个选项让as在目标文件中保留那些‘L…’符号。
一般如果你这样做了,你也应该让连接器ld保留那些以符号名‘L’开头的符号。
默认情况下,以‘L’开始的标签是一个局部标签,不过每一个目标允许重新定义一个局部标签的前缀。
在HPPA上,局部标签以‘L$’开始。
2.7配置清单输出:
--listing
通过命令行开关‘-a‘可以开启汇编程序的清单功能(参见2.1[-a],11页)。
这个功能使输入源文件和输出目标文件的16进制映象组合起来,并且以清单文件的形式显示它们。
清单的格式可以通过汇编源代码中的伪操作来控制(参见7.48[List],47页;7.83[Title],57页;7.64[Sbttl],51页;7.59[Psize],50页;7.14[Eject],40页)也可以通过以下开关:
--listing-lhs-width=‘number’
设置16进制字节映象第一行的最大宽度,宽度单位为字(16位)。
这个映象显示在清单输出的左边。
--listing-lhs-width2=‘number’
由给定的源代码行生成的16进制字节映象,设置这个映象的除第1行外的所有行的最大宽度,宽度单位为字。
如果没有指定宽度值,那它默认等于‘--listing-lhs-width’的设定值。
如果两个开关都没指定,那么默认值是1。
--listing-rhs-width=‘number’
设置源代码行的最大宽度,宽度单位为字符,源代码显示在16进制映象旁边。
默认宽度值是100。
源代码行显示在输出清单的右边。
--listing-cont-lines=‘number’
对于给定的一行源代码输入,设置16进制映象连续行数的最大值。
默认值是4。
2.8以MRI兼容模式汇编:
-M
选项–M或–-mri选择MRI兼容模式。
它改变了as的语法和伪操作处理,使它兼容于MicrotecResearch的ASM68K或者ASM960(视配置目标而定)汇编器。
这里没有给出MRI语法具体形式,您可以查看MRI的手册。
需要特别注意的是宏和宏参数的处理有一些不同。
这个选项的目的是允许使用as汇编现存的MRI汇编器代码。
as并不完全与MRI兼容。
MRI汇编器的具体操作依赖于目标文件格式,使用其他目标文件格式不支持这些操作。
要想支持这些需要分别增强各种目标文件的格式。
它们是:
•公共段中的全局符号
M68K的MRI汇编器允许使用通用段(commonsections),而通用段将被连接器合并。
其它目标文件格式并不支持使用通用段。
as处理通用段时把整个通用段当作一个单独的通用符号。
它允许在通用段中定义局部符号,但是它不支持通用段中使用全局符号,因为没法描述它们。
•复杂重定向
MRI汇编器允许错误段址的重定向,重定向连接了两个或多个段的起始地址。
其它目标文件格式都不支持这些。
•END伪操作指定的启始地址
MRI中的END伪操作允许指定一个开始地址。
其它目标文件格式不允许这么做。
你也可以对连接程序使用选项‘-e’来指定起始地址,也可以在连接脚本中指定。
•IDNT,.ident和NAME伪操作
MRI中的IDNT,.ident和NAME伪操作给输出文件分配一个模块名。
其它目标文件格式不支持。
•ORG伪操作
m68k的MRI中ORG伪操作在一个给定的地址开辟一个具有独立地址的段。
这和通常的as的.ORG伪操作不同,它在当前的段中改变定位。
别的目标文件格式不支持独立段。
因为一个段的地址可能在连接脚本中分配。
还有一些MRI汇编器的功能as不支持,大体上,它们都难于实现,而且似乎无关紧要。
其中的一些特性可能在今后的版本中将会支持。
•EBCDICstrings
不支持EBCDIC字符串。
•压缩BCD码
不支持压缩BCD码。
这表示不支持DC.P和DCB.P伪操作。
•FEQU伪操作
不支持m68k的FEQU伪操作。
•NOOBJ伪操作
不支持m68k的NOOBJ伪操作。
•优化分支控制选项(OPTbranchcontroloptions)
忽略m68k的优化分支控制选项—B,BRS,BRB,BRL,还有BRW。
as自动的放松所有的分支(不管是向前还是向后)到一个合适的大小,所以这些选项不起作用。
•优化清单控制选项(OPTlistcontroloptions)
以下m68k的优化清单控制选项被忽略:
C,CEX,CL,CRE,E,G,I,M,MEX,MC,MD,X.
•其它优化选项
以下的m68k的OPT选项被忽略:
NEST,O,OLD,OP,P,PCO,PCR,PCS,R.
•优化D选项为默认值
不象MRI汇编程序,m68k优化D选项是默认的。
可以用选项NOD关闭它。
•XREF伪操作
忽略m68k的XREF。
•.debug伪操作
不支持i960的.debug伪操作。
•.extended伪操作
不支持i960的.extended伪操作。
•.list伪操作
不支持i960的.list伪操作的各种选项。
•.optimizepseudo-op
不支持i960的.optimize伪操作。
•.outputpseudo-op
不支持i960的.output伪操作。
•.setrealpseudo-op
不支持i960的.setreal伪操作。
2.9相关性跟踪:
--MD
as能为它创造的文件产生一个从属文件。
这个文件包括一个规则,用来为make描述主要源文件的依赖性。
规则写进文件,文件名规则的参数中指定。
自动更新makefiles使用了这个功能。
2.10命名目标文件:
-o
当你运行as时,总是产生一个目标文件。
在默认的情况下,它的名字是‘a.out’(或者是‘b.out’仅对Intel960)。
你用这个选项(选项后跟一个文件名)给目标文件指定一个不同的文件名。
不管目标文件叫什么,as覆盖现存的同名文件。
2.11合并数据段和正文段:
-R
选项-R让as输出目标文件,在目标文件中数据段中的数据保存在正文段。
这一步只在最后做:
你得到的二进制数据一样,可是数据段部分的重定向不同。
你的目标文件的数据段部分只有零字节长度,因为所有的字节都被追加到代码段后面(参见第4章[段和重定向],23页)
当你指定了选项–R,它可能会产生更短的地址移动(因为我们不必在数据段和代码段之间转移)。
为了兼容老版本的as我们应尽量避免使用这个选项。
以后,可以使用–R这样做。
as配置成输出COFF的文件格式,只有你使用名字为‘.text’和‘.data’的段时,这个选项才有用。
任何HPPA处理器的目标格式都不支持选项–R。
如果使用了,as会产生一个警告。
2.12显示汇编的统计资料:
--statistics
使用‘--statistics’来显示as使用资源的两个统计数据:
汇编时分配的最大空间(字节)和汇编过程的花费的时间(占用cpu的秒数)。
2.13兼容输出:
--traditional-format
对一些目标格式来讲,as的输出和一些现存的汇编器有点不同。
这个开关要求as使用传统的格式。
例如,它关闭了异常结构优化,而在默认情况下,as对gcc的输出都进行异常结构优化。
2.14显示版本:
-v
通过在命令行中加上选项‘-v’(也可写成‘-version’),你能找出当前运行as的版本号。
2.15警告控制:
-W,--warn,--no-warn,
--fatal-warnings
当as汇编编译器的输出时,从不发出警告或错误信息。
但人们写的程序经常引发as产生警告,警告指出已触发了一个特定的条件。
这些警告都被定向到标准的错误文件。
如果你使用了选项–W和--no-warn,就不会产生警告。
这只影响到警告的信息:
它不会影响到as如何汇编你的文件。
而错误,将会终止汇编过程,仍会被报告。
如果使用选项--fatal-warnings,as将认为那些产生警告的文件含有错误。
你可以通过指定选项–-warn来关掉这些选项,使那些警告正常输出。
2.16不故错误生成目标文件:
-Z
当出现了一个错误信息,as通常不产生输出。
如果as对你的程序给出错误信息后,你对目标文件感兴趣的话,可以使用选项‘-Z’。
即使发生任何错误,as会继续进行汇编,最后发出一条警告信息‘nerrors,mwarnings,generatingbadobjectfile.’,然后生成一个(坏的)目标文件。