gas汇编器命令.docx
- 文档编号:11177063
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:34
- 大小:45.02KB
gas汇编器命令.docx
《gas汇编器命令.docx》由会员分享,可在线阅读,更多相关《gas汇编器命令.docx(34页珍藏版)》请在冰豆网上搜索。
gas汇编器命令
7汇编器命令
所有的汇编器命令名都由句号('.')开头。
命令名的其余是字母,通常使用小写。
本章讨论可用命令,不理会gun汇编器针对目标机器配置。
某些机器的配置提供附加的命令。
7.1.abort
本命令立即终止汇编过程。
这是为了兼容其它的汇编器。
早期的想法是汇编语言的源码会被输送进汇编器。
如果发送源码的程序要退出,它可以使用本命令通知as退出。
将来可能不再支持使用.abort
7.2.ABORT
当生成COFF输出时,汇编器把这条命令作为.abort接受。
当产成b.out输出时,汇编器允许使用这条命令,但忽略它。
7.3.alignabs-expr,abs-expr,abs-expr
增加位置计数器(在当前的子段)使它指向规定的存储边界。
第一个表达式参数(结果必须是纯粹的数字)是必需参数:
边界基准,见后面的描述。
第二个表达式参数(结果必须是纯粹的数字)给出填充字节的值,用这个值填充位置计数器越过的地方。
这个参数(和逗点)可以省略,如果省略它,填充字节的值通常是0。
但在某些系统上,如果本段标识为包含代码,而填充值被省略,则使用no-op指令填充这个空间。
第3个参数表达式的结果也必须是纯粹的数字,这个参数是可选的。
如果存在第3个参数,它代表本对齐命令允许越过字节数的最大值。
如果完成这个对齐需要跳过的字节比指定的最大值还多,则根本无法完成对齐。
您可以在边界基准后简单地使用两个逗号,以省略填充值参数(第二参数);如果您想在适当的时候,对齐操作自动使用no-op指令填充,这个方法将非常奏效。
边界基准的定义因系统而有差异。
a29k,hppa,m68k,m88k,w65,sparc,HitachiSH,和使用ELF格式的i386,第一个表达式是边界基准,单位是字节。
例如‘.align8’向后移动位置计数器至8的倍数。
如果地址已经是8的倍数,则无需移动。
有些其它系统,包括使用a.out格式的i386,ARM和strongarm,这代表位置计数器移动后,计数器中连续为0的低序位数量。
例如‘.align3’向后移动位置计数器直至8的倍数(计数器的最低的3位为0)。
如果地址已经是8倍数,则无需移动。
之所以存在这样的区别,是因为GAS需要模仿各种汇编器的不同动作。
GAS还提供.balign和.p2align命令,在以后详细讲述,这两条命令在所有的机型上使用相同的动作(但需要向GAS明确说明机型)。
7.4.ascii"string"...
.ascii可不带参数或者带多个由逗点分开的字符串(见3.6.1.1节[Strings],第19页)。
它把汇编好的每个字符串(在字符串末不自动追加零字节)存入连续的地址。
7.5.asciz"string"...
.asciz类似与.ascii,但在每个字符串末自动追加一个零字节。
‘.asciz’中的‘z’代表“zero”。
7.6
.balign[wl]abs-expr,abs-expr,abs-expr
增加位置计数器(在当前子段)使它指向规定的存储边界。
第一个表达式参数(结果必须是纯粹的数字)是必需参数:
边界基准,单位为字节。
例如,‘.balign8’向后移动位置计数器直至计数器的值等于8的倍数。
如果位置计数器已经是8的倍数,则无需移动。
第2个表达式参数(结果必须是纯粹的数字)给出填充字节的值,用这个值填充位置计数器越过的地方。
第2个参数(和逗点)可以省略。
如果省略它,填充字节的值通常是0。
但在某些系统上,如果本段标识为包含代码,而填充值被省略,则使用no-op指令填充空白区。
第3个参数的结果也必须是纯粹的数字,这个参数是可选的。
如果存在第3个参数,它代表本对齐命令允许跳过字节数的最大值。
如果完成这个对齐需要跳过的字节数比规定的最大值还多,则根本无法完成对齐。
您可以在边界基准参数后简单地使用两个逗号,以省略填充值参数(第二参数);如果您在想在适当的时候,对齐操作自动使用no-op指令填充,本方法将非常奏效。
.balignw和.balignl是.balign命令的变化形式。
.balignw使用2个字节来填充空白区。
.balignl使用4字节来填充。
例如,.balignw4,0x368d将地址对齐到4的倍数,如果它跳过2个字节,GAS将使用0x368d填充这2个字节(字节的确切存放位置视处理器的存储方式而定)。
如果它跳过1或3个字节,则填充值不明确。
7.7.byteexpressions
.byte可不带参数或者带多个表达式参数,表达式之间由逗点分隔。
每个表达式参数都被汇编成下一个字节。
7.8.commsymbol,length
.comm声明一个符号名为symbol的通用符号(commonsymbol)。
当连接时,目标文件中的通用符号可能被并入其它目标文件中已定义的符号,或者被并入其他目标文件中同名通用符号。
如果ld无法找到该符号的定义——只有一个或多个通用符号——则分配length个字节的未初始化内存。
Length必须是一个纯粹的表达式。
如果ld发现多个同名的通用符号,并且它们的长度不同,ld将按照它们之中最大的length值为符号分配内存。
当使用ELF格式时,.comm可以使用第3个参数。
它代表符号需要对齐的边界基准(例如,边界基准为16时意味着符号存放地址的最低4位应该是零)。
第3个参数表达式结果必须是纯粹的数字,而且一定是2的幂。
当ld为通用符号分配未初始化内存时,在存放符号时要使用到这个参数。
如果没有规定边界基准,as将把边界基准设置成以2为底的该符号长度的对数,并向下取整。
最大值为16。
.comm的语法在HPPA上稍微有些不同。
语法是‘symbol.comm,length’;其中参数symbol是可选的。
7.9.datasubsection
.data通知as汇编后续语句,将它们追加在编号为subsection(subsection必须是纯粹的表达式)数据段末。
如果参数subsection省略,则默认是0。
7.10.defname
开始定义符号'name'的调试信息;定义区延伸至遇到.endef命令。
本命令只在as被配置成COFF格式输出时才使用;当输出为b.out格式时,可以使用‘.def’命令,但被忽略。
7.11.descsymbol,abs-expression
本命令用一个纯粹表达式的低16位的值设置符号symbol的描述符(见5.5[符号属性],第30页)。
当as被配置成COFF输出时,‘.desc’命令无效;它只适用于a.out或b.out目标格式。
为兼容起见,当配置为COFF时,as接受此命令,但不产生输出。
7.12.dim
这条命令由编译器生成的,以便在符号表中加入辅助调试信息。
只可以在.def/.endef对之间使用此命令。
'.dim'仅仅在生成COFF格式输出时是有意义的;当生成b.out时,as接受这条命令,但忽略它
7.13.doubleflonums
.double后跟着零个或由逗点分开多个的浮点数。
本指令汇编出浮点数字。
生成的浮点数的确切类型视as的配置而定。
7.14.eject
当生成汇编清单时,强制清单页在此点中断。
7.15.else
.else是支持as进行的条件汇编指令之一;见7.35[.if],第43页。
如果前面.if命令的条件不成立,则表示需要汇编.else后的一段代码。
7.16.elseif
.elseif是支持as进行的条件汇编指令之一。
见7.35节[.if],第43页。
它可以在.esle段中快速产生一个新的.if块。
7.17.end
.end标记着汇编文件的结束。
as不处理.end命令后的任何语句。
7.18.endef
这条命令标志着从.def开始的符号定义结束。
‘.endef’命令仅仅在生成COFF格式的输出有意义;如果as被配置为生成b.out输出,虽然as接受这条命令,但忽略它。
7.19.endfunc
.endfunc标志着一个由.func命令定义的函数的结束。
7.20.endif
.endif是支持as进行的条件汇编的指令之一.它标志着条件汇编代码块的结束。
见7.35节[.if],第43页。
7.21.equsymbol,expression
本命令把符号symbol值设置为expression。
它等同与'.set'命令。
见7.68[.set],第53页。
在HPPA上的equ语法是‘symbol.equexpression’。
7.22.equivsymbol,expression
.equiv类似与.equ&.set命令,不同之处在于,如果符号已经定义过,as会发出错误信号。
除了错误信息的内容之外,它大体上等价与:
.ifdefSYM
.err
.endif
.equSYM,VAL
7.23.err
如果as汇编一条.err命令,将打印一条错误信息,除非使用了-Z选项,as不会生成目标文件。
可以在条件编译代码中使用它来发出错误信息。
7.24.exitm
从当前宏定义体中提前退出。
见7.50[Macro],第47页。
7.25.extern
.extern可以在源程序中使用--以便兼容其他的汇编器—但会被忽略。
as将所有未定义的符号都当作外部符号处理。
7.26.failexpression
生成一个错误(error)或警告(warning)。
如果expression的值大于或等于500,as会打印一条“警告”消息。
如果expression的值小于500,as会打印一条“错误”消息。
消息中包含了expression的值。
这在复杂的宏嵌套或条件汇编时偶尔用到。
7.27.filestring
.file通告as我们准备开启一个新的逻辑文件。
string是新文件名。
总的来说,文件名是否使用引号‘"’都可以;但如果您希望规定一个空文件名时,必须使用引号-""。
本语句将来可能不再使用—允许使用它只是为了与旧版本的as程序兼容。
在as的一些配置中,已经删除了.file以避免与其它的汇编器冲突。
见第8章[MachineDependencies],第61页。
7.28.fillrepeat,size,value
repeat,size和value都必须是纯粹的表达式。
本命令生成size个字节的repeat个副本。
Repeat可以是0或更大的值。
Size可以是0或更大的值,但即使size大于8,也被视作8,以兼容其它的汇编器。
各个副本中的内容取自一个8字节长的数。
最高4个字节为零,最低的4个字节是value,它以as正在汇编的目标计算机的整数字节顺序排列。
每个副本中的size个字节都取值于这个数最低的size个字节。
再次说明,这个古怪的动作只是为了兼容其他的汇编器。
size参数和value参数是可选的。
如果不存在第2个逗号和value参数,则假定value为零。
如果不存在第1个逗号和其后的参数,则假定size为1。
7.29.floatflonums
本命令汇编0个或多个浮点数,浮点数之间由逗号分隔。
它和.single的汇编效果相同。
生成的浮点数的确切类型视as的配置而定。
见第8章[MachineDependencies],61页。
7.30.funcname[,label]
.func发出一个调试信息用以指示函数name,这个信息将被忽略,除非文件使用debuggingenabled方式的汇编。
目前只支持‘--gstabs’。
label是函数的入口点,如果name被省略则使用预定的‘引导符’。
‘引导符’通常可以是_或者什么也没有,视目标机型而定。
所有函数现时被定义为void返回类型,函数体必须使用.endfunc来结束
7.31.globalsymbol,.globlsymbol
.global使符号symbol对连接器ld可见。
如果您在局部过程中定义符号symbol,其它和此的局部过程都可以访问它的值。
另外,symbol从连接到本过程的另一个文件中的同名符号获取自己的属性。
两种写法都可以(‘.globl’和‘.global’),以便兼容多种汇编器。
7.32.hiddennames
这是一条关于ELF可见度的命令。
其它两条是.internal(见7.39[.internal],44页)和.protected(见7.58[.protected],50页)。
本命令取消指定符号的缺省可见度(可见度由其他命令捆绑设定:
local,global,weak)。
本命令把可见度设置为hidden,这意味着本符号对其他部分不可见。
这最好是一些需要长期保护的符号。
7.33.hwordexpressions
本命令后可以不带或带多个expressions,并且为每个参数生成一个16位数。
本命令等同与'.short'命令。
在某些架构上,也可能等同与'.word'。
7.34.ident
本命令被某些汇编器用来在目标文件中加入标饰。
为了使汇编源码文件兼容上述的汇编器,as简单地接受本命令,但实际上不产生东西。
7.35.ifabsoluteexpression
.if标志着一段代码的开始,这段代码只有在参数absoluteexperession(必须是一个独立的表达式)不为0时才进行汇编。
这段条件汇编代码必须使用.endif标志结束。
(见7.20[.endif],40页);另外,可以使用.esle来标记一个代码块(见7.15[.else],40页),这个代码块与前面那段代码只有一个会进行汇编。
如果您需要检查数个汇编条件,可以在使用.elseif命令,以避免在.else代码块中进行if/else语句块的嵌套。
同样可以使用下面.if的变体:
.ifdefsymbol
如果指定的符号symbol已经定义过,汇编下面那段代码。
.ifcstring1,string2
如果两个字符串相同的话,汇编下面那段代码。
字符串可以可选地使用单引号。
如果不使用引号则第1个字符串在逗号处结束。
第2个字符串在本行末结束。
包含空白的字符串应该使用引号标注。
字符串比较时是区分大小写的。
.ifeqabsoluteexpression
如果参数的值为0,汇编下面那段代码。
.ifeqsstring1,string2
这是.ifc的另一种形式,字符串必须使用双引号标注。
.ifgeabsoluteexpression
如果参数的值大于等于0,汇编下面那段代码。
.ifgtabsoluteexpression
如果参数的值大于0,汇编下面那段代码。
.ifleabsoluteexpression
如果参数的值小于等于0,汇编下面那段代码。
.ifltabsoluteexpression
如果参数的值小于0,汇编下面那段代码。
.ifncstring1,string2.
类似与.ifc,不过使用反向的测试:
如果两个字符串不相等的话,汇编下面那段代码。
.ifndefsymbol
.ifnotdefsymbol
如果指定的符号symbol不曾被定义过,汇编下面那段代码。
上面两种写法是等效的。
.ifneabsoluteexpression
如果参数的值为不等于0,汇编下面那段代码。
(换句话说,这是.if的另一种写法).
.ifnesstring1,string2
类似与.ifeqs,不过使用反向的测试:
如果两个字符串不相等的话,汇编下面那段代码。
7.36.incbin"file"[,skip[,count]]
这条incbin命令在当前位置逐字地引入file文件的内容。
您可以使用命令行选项参数“-I”来控制搜索路径。
(见第2章[Command-LineOptions],11页)。
文件名必须使用引号。
参数skip表示需要从文件头跳过的字节数目。
参数count表示读入的最大字节数目。
注意,数据没有进行任何方式的对齐操作,所以用户需要在.incbin命令的前后进行必要的边界对齐。
7.37.include"file"
本命令提供在源程序中指定点引入支撑文件的手段。
file中的代码如同紧跟.include后一样被汇编。
当引入文件汇编结束,继续汇编原来的文件。
您可以使用命令行选项参数“-I”来控制搜索路径(见第2章[Command-LineOptions],11页)。
文件名必须使用引号来标注。
7.38.intexpressions
可以不带参数或带多个expressions,参数之间由逗号分隔。
每个expressions都生成一个数字,这个数字等于表达式在目标机器运行时的值。
字节顺序和数字的位数视汇编的目标机器而定。
7.39.internalnames
这是一条与ELF可见度相关的命令。
另外的两条是.hidden(见7.32[.hidden],42页)和.protected(见7.58[.protected],50页)。
本命令取消指定符号的缺省可见度(可见度由其他命令捆绑设定:
local,global,weak)。
本命令把指定符号可见度设置为internal,这意味着此符号需要被隐藏(即对其他部分不可见),另外,符号还必须经过处理器的特别的处理。
7.40.irpsymbol,values...
加工一个需要用values替代symbol的语句序列。
语句序列从.irp命令开始,在.endr命令前结束。
对于每个value都进行如下加工:
用value替代Symbol,并对此语句序列进行汇编。
如果没有给出value,则用空字符串(nullsting)替代symbol,并将此语句序列汇编一次。
使用\symbol,把参数symbol提交给语句序列。
例如下列代码
.irpparam,1,2,3
moved\param,sp@-
.endr
等同与
moved1,sp@-
moved2,sp@-
moved3,sp@-
7.41.irpcsymbol,values...
加工一个需要用values替代symbol的语句序列。
语句序列从.irpc命令开始,在.endr命令前结束。
对于value中的每个字符,都进行如下加工;用此字符替代symbol,并对此语句序列进行汇编。
如果没有给出value参数,则用空字符串(nullsting)替代symbol,并将此语句序列汇编一次。
使用\symbol,把参数symbol提交给语句序列。
例如下列代码
.irpcparam,123
moved\param,sp@-
.endr
等同与
moved1,sp@-
moved2,sp@-
moved3,sp@-
7.42.lcommsymbol,length
为一个本地通用符号symbol预留length个字节的内存。
symbol的段(属性)和值(属性)被设置为一个新的本地通用符号应有的属性:
内存是在bss段中分配的,所以在运行时,这些字节开始都是零。
因为symbol没有被声明为全局性的符号,所以symbol对ld通常不可见。
某些目标格式允许在.lcomm命令中使用第3个参数。
这个参数指出这个bss段中的符号对齐操作所需要的边界基准。
.lcomm的语法在HPPA上稍有不同。
表示为‘symbol.lcomm,length’;symbol是可选的。
7.43.lflags
as接受本命令,以兼容其他的汇编器,但忽略之。
7.44.lineline-number
更改逻辑行号,参数line-number必须是个纯粹的表达式。
本命令后的下一行将被赋予此逻辑行号。
因此在当前行之前任何其他的语句(在语句分隔符后)的逻辑行号将被视作line-number-1。
以后as将不在支持这条命令:
只是为了兼容现存的汇编器而接受本命令。
Warning:
在为AMD29K目标机器配置的as中,不能使用本指令。
在这种场合可以使用.ln命令。
尽管这是与a.out或b.out目标代码格式相关的命令,在生成COFF输出时as仍然接受它,并且如果‘.line’出现在.def/endef之外的话,就把它视为‘.ln’命令。
如果‘.line’在.def语句块中的话,.line命令则是一条编译器使用的命令,用来为调式生成辅助符号信息。
7.45.linkonce[type]
给当前段做一个标志,以便连接器只包含它的一个拷贝。
这个命令可以用于几个不同的目标文件中包含同样的段,但需要连接器在最终的输出文件中只包含一个这样的段。
.linkouce伪操作必须在每个段的实例都中使用。
对重复段的探测基于段名来进行,因此这个段将是唯一的。
本命令只在少数目标格式文件中有效,到写本文为止,只有基于WindowsNT的PE(PortableExecutable)格式的目标文件支持本命令,
参数type是可选的,如果指定了此参数,它必须是下列字符串之一。
例如
.Linkoncesame_size
不是在所有的格式目标文件都可以使用所有类型的参数。
discard静静地舍弃重复的段,这也是默认值。
one_only如果存在重复的段则发出警告,但只保存一个拷贝。
same_size如果重复的段有不同的大小则发出警告。
same_contents如果重复段的内容不是精确的相符则发出警告。
7.46.lnline-number
‘.ln’命令等同与‘.line’.
7.47.mrival
如果参数val是非零值,这将通知as进入MRI模式。
如果参数val的值是零,这通知as退出MRI模式。
这个变化会影响汇编的结果,直到下个.mri命令,或者直到文件尾。
见2.8[MRImode],13页。
7.48.list
控制(和.nolist命令配合)是否生成汇编清单。
这两个命令维护一个内部的计数器(计数器初始值为0).list命令增加计数器的值,.nolist减少计数器的值。
当计数器的值大与0时将汇编列表。
缺省状态汇编列表的生成是关闭的。
当您打开它的时候(使用带-a选项的命令行)第2章[Command-LineOptions],11页),内部计数器的初始值为1。
7.49.longexpressions
.long是.int的等价命令,见7.38[.int],44页.
7.50.macro
本命令.macro和.endm命令允许您定义宏来生成汇编输出。
例如,下面的语句定义了一个宏sum,这个宏把一个数字序列放入内存。
.macrosumfrom=0,to=5
.long\from
.if\to-\from
sum"(\from+1)",\to
.endif
.endm
使用上述定义,'SUM0,5'语句就等于输入下面的汇编语句:
.long0
.long1
.long2
.long3
.long4
.long5
.macromacname
.macroma
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- gas 汇编 命令
![提示](https://static.bdocx.com/images/bang_tan.gif)