gas 手册 chapter1.docx
《gas 手册 chapter1.docx》由会员分享,可在线阅读,更多相关《gas 手册 chapter1.docx(16页珍藏版)》请在冰豆网上搜索。
gas手册chapter1
Usingas
========================================
ThegnuAssembler
Version2.11.90
TheFreeSoftwareFoundationInc.thanksTheNiceComputerCompanyofAustraliaforloaningDeanElsnertowritethefirst(Vax)versionofasforProjectgnu.Theproprietors,managementandstaffofTNCCAthankFSFfordistractingthebosswhiletheygotsomeworkdone.
DeanElsner,JayFenlason&friends
Usingas
EditedbyCygnusSupport
Copyright©1991,92,93,94,95,96,97,98,99,2000,2001FreeSoftwareFoundation,Inc.Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFreeDocumentationLicense,Version1.1oranylaterversionpublishedbytheFreeSoftwareFoundation;withnoInvariantSections,withnoFront-CoverTexts,andwithnoBack-CoverTexts.Acopyofthelicenseisincludedinthesectionentitled"GNUFreeDocumentationLicense".
本章约定语
高地址结尾:
big-endian
低地址结尾:
little-endian
ARM过程调用标准:
APCS,ARM过程调用标准(ARMProcedureCallStandard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。
最显著的一点是对这些例程来自哪里没有明确的限制。
它们可以编译自C、Pascal、也可以是用汇编语言写成的。
有多个版本的APCS(实际上是16个)。
陷阱异常:
与故障异常不同,CPU不会重新执行引发异常的那条指令。
MIPS指令集架构:
MIPSInstructionSetArchitecture
1概述
本文档是GNU汇编器as的用户手册。
以下是调用as的命令概要,详细内容参见第2章[命令行选项],11页。
‘binutils’和‘ld’请查看gcc
(1),ld
(1)和Info相关条目
as[-a[cdhlns][=file]][-D][--defsymsym=val]
[-f][--gstabs][--gdwarf2][--help][-Idir]
[-J][-K][-L]
[--listing--lhs-width=NUM][--listing-lhs-width2=NUM]
[--listing-rhs-width=NUM][--listing-cont-lines=NUM]
[--keep-locals][-oobjfile][-R][--statistics][-v]
[-version][--version][-W][--warn][--fatal-warnings]
[-w][-x][-Z][--target-help]
[-marc[5|6|7|8]]
[-EB|-EL]
[-m[arm]1|-m[arm]2|-m[arm]250|-m[arm]3|
-m[arm]6|-m[arm]60|-m[arm]600|-m[arm]610|
-m[arm]620|-m[arm]7[t][[d]m[i]][fe]|-m[arm]70|
-m[arm]700|-m[arm]710[c]|-m[arm]7100|
-m[arm]7500|-m[arm]8|-m[arm]810|-m[arm]9|
-m[arm]920|-m[arm]920t|-m[arm]9tdmi|
-mstrongarm|-mstrongarm110|-mstrongarm1100]
[-m[arm]v2|-m[arm]v2a|-m[arm]v3|-m[arm]v3m|
-m[arm]v4|-m[arm]v4t|-m[arm]v5|-[arm]v5t|
-[arm]v5te]
[-mthumb|-mall]
[-mfpa10|-mfpa11|-mfpe-old|-mno-fpu]
[-EB|-EL]
[-mapcs-32|-mapcs-26|-mapcs-float|
-mapcs-reentrant]
[-mthumb-interwork][-moabi][-k]
[-O]
[-O|-n|-N]
[-mb|-me]
[-Av6|-Av7|-Av8|-Asparclet|-Asparclite
-Av8plus|-Av8plusa|-Av9|-Av9a]
[-xarch=v8plus|-xarch=v8plusa][-bump]
[-32|-64]
[-ACA|-ACA_A|-ACB|-ACC|-AKA|-AKB|
-AKC|-AMC]
[-b][-no-relax]
[--m32rx|--[no-]warn-explicit-parallel-conflicts|
--W[n]p]
[-l][-m68000|-m68010|-m68020|...]
[-jsri2bsr][-sifilter][-relax]
[-mcpu=[210|340]]
[-m68hc11|-m68hc12]
[--force-long-branchs][--short-branchs]
[--strict-direct-mode][--print-insn-syntax]
[--print-opcodes][--generate-example]
[-nocpp][-EL][-EB][-Gnum][-mcpu=CPU]
[-mips1][-mips2][-mips3][-mips4][-mips5]
[-mips32][-mips64]
[-m4650][-no-m4650]
[--trap][--break][-n]
[--emulation=name]
[--|files...]
-a[cdhlmns]
打开清单输出选项,可以任意使用以下各种方法:
-ac忽略假条件
-ad忽略调试指示
-ah包含高级(语言)源代码
-al包含汇编代码
-am包含宏扩展
-an忽略表格处理
-as包含符号表
=file设置清单文件名
你可以组合使用这些选项;例如,不经过表格处理的汇编代码清单使用‘-aln’,如果要使用‘=file’选项,它必须是最后一个选项。
选项‘-a’单独使用时,缺省含义是‘-ahls’。
-D忽略。
为了兼容使用其它汇编器的脚本而保留。
--defsymsym=value
汇编输入文件前,定义符号sym的值为value。
value必须是一个整型常量。
同在C语言中一样,前导字符‘0x’表示这是一个十六进制值,前导字符‘0’表示这是一个八进制值。
-f“加速处理”---对空白和注释不进行预处理(假定输入源是编译器的输出)。
--gstabs逐行生成stabs格式调试信息,如果调试器可以处理这些信息将有助于汇编代码调试。
--gdwarf2
逐行生成DWARF2格式调试信息,如果调试器可以处理这些信息将有助于汇编代码调试。
注意这个选项只能被某些目标格式支持,不是全部格式都能使用。
--help打印命令行选项概要后退出。
--target-help
打印全部目标格式相应的命令行选项概要后退出
-Idir在.include命令的搜索表中增加一个目录dir。
-J发生符号溢出时不发出警告信息。
-K长跳转使用不同的跳转表时发出警告。
-L
--keep-locals
保留(符号表中的)局部符号。
在传统的a.out系统中这些符号由字母‘L’开始,但是不同系统中的局部标签前缀不同。
--listing-lhs-width=number
设置汇编器清单的输出数据列最大宽度为number,单位为字。
--listing-lhs-width2=number
设置汇编器清单连续行的输出数据列最大宽度为number,单位为字。
--listing-rhs-width=number
设置在清单中的输入源文件每行最大宽度为number个字节。
--listing-cont-lines=number
设置一个输入行在清单中最多可以被分成number+1行打印。
-oobjfile
将as输出的目标文件命名为objfile。
-R将数据段并入代码段。
--statistics
打印汇编过程使用的最大空间(以字节为单位)和总时间(以秒为单位)。
--strip-local-absolute
从输出符号表中删除局部绝对符号。
-v
-version
打印as的版本。
--version
打印as的版本后退出。
-W
--no-warn
禁止产生警告信息。
--fatal-warnings
将警告作为错误处理。
--warn不要禁止产生警告信息或将警告信息作为错误处理。
-w忽略。
-x忽略。
-Z即使产生错误信息也生成目标文件。
--|files...
标准输入或要汇编源文件。
使用ARC处理器配置的as可以使用以下选项:
-marc[5|6|7|8]
这个选项从几种变形的处理器核心选定核心。
-EB|-EL
选择“高地址结尾”(-EB)或者是“低地址结尾”(-EL)的输出。
使用ARM处理器系列配置的as可以使用以下选项:
-m[arm][1|2|3|6|7|8|9][...]
指定目标(处理器)为哪种ARM处理器变体。
-m[arm]v[2|2a|3|3m|4|4t|5|5t]
指定目标(处理器)使用哪种ARM架构变体
-mthumb|-mall
激活或禁止只用Thumb指令集译码的功能。
-mfpa10|-mfpa11|-mfpe-old|-mno-fpu
选择目标(处理器)为哪种浮点架构。
-mapcs-32|-mapcs-26|-mapcs-float|-mapcs-reentrant|-moabi
选择使用哪种ARM过程调用标准。
-EB|-EL
选择“高地址结尾”(-EB)或者是“低地址结尾”(-EL)的输出。
-mthumb-interwork
专门指定生成的代码要交互使用Thumb和ARM指令集来编码。
-k指定要使用位置无关代码编码。
使用D10V处理器系列配置的as可以使用以下选项:
-O使用并行指令优化输出。
使用D30V处理器系列配置的as可以使用以下选项:
-O使用并行指令优化输出。
-n生成nops指令时发出警告信息。
-N当32-位乘法指令后有一个nop指令时发出警告。
使用80960处理器系列配置的as可以使用以下选项:
-ACA|-ACA_A|-ACB|-ACC|-AKA|-AKB|-AKC|-AMC
指出目标(处理器)是哪种960架构变体。
-b加入分支统计代码。
-no-relax
长跳转不改变比较和分支指令;如果必须改变就发出错误指示。
使用Motorola68000系列配置的as可以使用以下选项:
-l缩短对未定义符号的访问,用单字长访问替换双字节访问。
-m68000|-m68008|-m68010|-m68020|-m68030
|-m68040|-m68060|-m68302|-m68331|-m68332
|-m68333|-m68340|-mcpu32|-m5200
指定目标(处理器)是68000族架构中哪种处理器,缺省是普通的68020,可在配置时更改。
-m68881|-m68882|-mno-68881|-mno-68882
目标机器有(或没有)浮点协处理器。
缺省时假定68020,68030和cpu32有一个协处理器。
虽然单纯的68000不兼容68881,但是却可以同时指定这两个选项,因为可以使用主处理器执行模仿协处理器的指令。
-m68851|-mno-68851
目标机有(或没有)内存管理单元协处理器(MMU)。
缺省值假定有68020或以上使用的MMU。
如想了解PDP-11的机器相关性功能选项的细节,参见8.18.1[PDP-11-选项],122页。
-mpic|-mno-pic
生成位置-无关(或位置-相关)代码。
缺省值为-mpic.
-mall
-mall-extensions
使用所有指令集的扩展集。
这是缺省值。
-mno-extensions
禁止所有指令集的扩展集。
-mextension|-mno-extension
使用(或禁止)指定指令集的扩展集。
-mcpu使用指定CPU所支持的指令集扩展,禁止其它的指令集扩展。
-mmachine
使用指定机器型号所支持的指令集扩展,禁止其它的指令集扩展。
使用picoJava处理器配置的as可以使用以下选项:
-mb生成“高地址结尾”格式的输出。
-ml生成“低地址结尾”格式的输出。
使用Motorola68HC11或68HC12系列配置的as可以使用以下选项:
-m68hc11|-m68hc12
指定目标(处理器)为何种处理器。
缺省值在编译汇编器时由配置选项定义。
--force-long-branchs
相对分支被转换绝对分支。
这涉及到条件分支,无条件分支和分支的子分支。
-S|--short-branchs
当偏移量超出范围时不把相对分支转换为绝对分支。
--strict-direct-mode
当指令不支持直接寻址模式时不将直接寻址模式转换为扩展模式。
--print-insn-syntax
当发生错误时打印指令的语法
--print-opcodes
打印包含语法的指令清单之后退出。
--generate-example
打印各种可能存在的指令范例之后退出。
这个选项只是在测试as时有用。
使用SPARC架构配置的as可以使用以下选项:
-Av6|-Av7|-Av8|-Asparclet|-Asparclite
-Av8plus|-Av8plusa|-Av9|-Av9a
明确选择一种具体的SPARC架构。
‘-Av8plus’和‘-Av8plusa’选择32位环境。
‘-Av9’和‘-Av9a’选择64位环境。
‘-Av8plusa’和‘-Av9a’选用包含UltraSPARC扩展集的SPARCV9指令集。
-xarch=v8plus|-xarch=v8plusa
用以兼容SolarisV9汇编器。
这些选项分别等于-Av8plus和-Av8plusa。
-bump
当汇编器切换到其他架构时发出警告。
使用MIPS处理器配置的as可以使用以下选项:
-Gnum
本选项设置使用gp寄存器隐含访问对象的最大字长。
只有当目标代码格式为ECOFF时才可以使用本选项,例如运行Ultrix的DEC工作站。
缺省值是8。
-EB生成“高地址结尾”格式的输出。
-EL生成“低地址结尾”格式的输出。
-mips1
-mips2
-mips3
-mips4
-mips32生成特定MIPS指令集架构级别(ISAlevel)的代码。
'-mips1'相当于R2000和R3000处理器,'-mips2'相当于R6000处理器,'-mips3'相当于R4000处理器。
‘-mips5’,‘-mips32’,和‘-mips64’分别相当于MIPSV,MIPS32,和MIPS64指令集架构之类的处理器。
-m4650
-no-m4650
生成MIPSR4650芯片代码,这通知汇编器接受‘mad’和‘madu’指令,并在访问‘HI’和‘LO’寄存器的时候不插入‘nop’指令,‘-no-m4650’关闭这个选项。
-mcpu=CPU
生成特定MIPScpu的代码。
这完全等价于‘-mcpu’,但有更多可以使用的cpu值供选择。
--emulation=name
本选项使模拟as使用其他目标配置,包括各个方面的配置,如输出文件格式(只能选择ELF或ECOFF之一),产生调试信息的伪操作的处理,或是存储的符号表信息伪操作的处理,以及缺省的内存存取格式。
有效的配置名name有:
‘mipsecoff’,‘mipself’,‘mipslecoff’,‘mipsbecoff’,‘mipslelf’,‘mipsbelf’。
前两个不改变相应目标的缺省的内存存取格式。
其它的分别依据其配置名中包含的字符'b'或'l'改变缺省的内存存取格式为‘高地址结尾’或‘低地址结尾’。
在任何情况下使用‘-EB’或‘-EL’将会取代选取的内存存取格式。
这个选项当前只支持配置的基本目标是MIPSELF或ECOFF的情况。
另外,如果希望两个基本目标都可以使用,一种基本目标或配置时通过‘--enable-targets=...’指定的其他选项必须包含对另一种基本目标格式的支持。
例如Irix5的配置包含对二种基本目标的支持。
最终这个选项将会支持更多的配置,对汇编器行为进行更细微的控制,而且会支持更多的处理器。
-nocpp
as忽略这个选项。
为了兼容本地工具而接受这个选项。
--trap
--no-trap
--break
--no-break
控制如何处理乘法溢出和除零异常。
使用‘—trap’或‘--no-break’(二者意义相同)将使用陷阱异常(只能在指令集架构级别2或更高级别下工作)进行异常处理;‘-break’或‘--no-trap’(二者意义相同,并且是缺省选项)使用异常结束。
-n当使用本选项时,每次在宏体中产生nop指令时as都会发出一条警告。
使用MCore处理器配置的as可以使用以下选项:
-jsri2bsr
-nojsri2bsr
激活或禁止JSRI到BSR的转换。
缺省值为激活。
命令行选项用来禁止转换。
-sifilter
-nosifilter
激活或禁止硅过滤动作(//siliconfilter?
)。
缺省值为禁止。
可以使用‘-sifilter’命令行选项取代缺省值。
-relax改变长跳转指令。
-mcpu=[210|340]
选择目标硬件上的cpu类型。
这控制着哪些指令能够被汇编。
-EB进行高地址结尾目标的汇编。
-EL进行低地址结尾目标的汇编。
1.1本手册的结构
本手册的目的是介绍GNUas的使用知识。
包括源文件所要求的的语法,包括符号,常量和表达式的表示;as能够处理的命令;当然还有如何调用as。
手册也介绍本汇编器各种机器相关的特点。
但是,手册并不介绍汇编语言编程——至于普通的编程更不会涉及!
同样我们也不准备介绍特定机器的架构;不介绍某个特定架构指令集,标准的内存存取方式(standardmnemonics),寄存器或者寻址方式。
这方面信息您可以参考生产商的机器架构的手册。
1.2GNU汇编器
GNUas实际上是一个汇编器族。
如果你在一种架构上使用(或已经使用过)GNU汇编器,当您其它架构上再使用as时,会找到一个熟悉的环境。
每一个版本和其他版本有很多共同之处,包括目标文件格式,大部分的汇编命令(通常叫伪操作)和汇编语法。
as的主要用于汇编gcc(GNUC编译器)的输出,供连接器ld加工。
但是,只要可以在某种机型的其他汇编器上能够汇编,我们都尽量使as汇编同样能够汇编。
明确需要授权的情况例外(参见第8章[机器相关性],61页)。
但是这并不是意味着在某架构上as总是使用和其它汇编器相同的语法;例如,我们知道有几种不兼容的680x0汇编语言语法形式。
和其他老汇编器不同,as被设计成对源文件只进行一次性汇编。
这对使用.org命令产生一定的要求(参见7.53[.org],48页)。
1.3目标文件格式
GNU汇编器可以被配置成生成某种目标文件格式。
大部分情况下,并不影响你如何使用汇编语言编程;但是,调试符号的命令在不同文件格式中有明显区别。
参见5.5[符号属性],30页。
1.4命令行
在命令行中,程序名as之后可以包含选项和文件名。
选项可以以任何顺序使用,可以使用在文件名之前、后、甚至中间,但是文件名出现的先后顺序是有含义的。
当as有一个文件汇编时,‘—’(双链字符)明确代表标准输入文件。
除了‘—’以外,任何以链字符‘-’打头的命令行参数都是一个选项。
每个选项都会改变as的处理方式。
没有选项能够改变其他选项的效果。
每个选项都是以链字符‘-’开始,跟一个或多个字符;这些字符大小写的含义是有区别的。
所有选项都是可选的。
有些选项必须使用正确的文件名跟随。
文件名可能是紧跟在选项字符后(以兼容旧汇编器),也可能不紧跟着前面的选项而成为下一个命令参数(GNU标准)。
以下两个命令行是等价的:
as-omy-object-file.omumble.s
as-omy-object-file.omumble.s
1.5输入文件
我们使用短语源程序(sourceprogram)或使用更简洁的源(source)来代表输入as的程序。
程序可以放在一个或多个文件中,这并不改变源程序的内在含义。
源程序在这些有顺序的文件中是一个连续的文本。
您每次运行as时,它仅仅汇编一个源程序,这个源程序由一个或多个文件组成。
(标准输入也是一个文件。
)
你可以在as的命令行中不指定输入文件名或指定多个输入文件名。
输入文件名会被(从左到右)依次读取。
某个命令行参数(任何位置)如果没有特别的定义就被当作一个输入文件名。
如果你没有给出文件名,as就尝试从as的标准输入读取一个输入文件,通常这个标准输