没有合适的资源?快使用搜索试试~ 我知道了~
参考资料—GNU ARM汇编语法1
需积分: 0 1 下载量 142 浏览量
2022-08-03
19:59:37
上传
评论
收藏 1.79MB PDF 举报
温馨提示
试读
20页
//为代码行中间的注释符号,comment 为具体的注释语句,其它注释符号参见第 6 节“特殊字符”下面定义一个"add"函数的例子:.section .tex
资源详情
资源评论
资源推荐
GNU ARM 汇编语法
赵宏智 整理
北京交通大学计算机与信息技术学院
目录
GNU ARM 汇编语法 ......................................................................................................................... 1
1、GNU ARM 汇编语言语句格式 ........................................................................................... 3
2、标号(label) ..................................................................................................................... 4
3、伪操作(directive) ........................................................................................................... 5
3.1 段定义类伪操作 ........................................................................................................ 5
3.2 标号属性定义类伪操作 ............................................................................................ 6
3.3 数据定义类伪操作 .................................................................................................... 7
3.4 控制类伪操作 ............................................................................................................ 9
3.4 杂项伪操作 .............................................................................................................. 10
4、伪指令(pseudo-instruction) ................................................................................... 11
4.1 LDR 伪指令 .............................................................................................................. 11
4.2 ADR 伪指令 .............................................................................................................. 12
4.3 ADRL 伪指令 ............................................................................................................ 12
5、常数定义........................................................................................................................... 12
6、特殊字符........................................................................................................................... 13
7、程序入口函数定义 ........................................................................................................... 13
8、GNU 内嵌(inline)ARM 汇编代码 ...................................................................................... 14
8.1 内嵌汇编语句的格式 .............................................................................................. 14
8.2 输出操作数列表 ...................................................................................................... 14
8.3 输入操作数列表 ...................................................................................................... 15
8.4 Clobber 列表 ............................................................................................................. 16
8.5 汇编代码部分 .......................................................................................................... 18
8.6 例子.......................................................................................................................... 18
参考文献................................................................................................................................. 20
GNU ARM 汇编语法
不同的汇编器对汇编语言的语法要求不一样。目前常用的 ARM 汇编环境有以下两种:
1,ARM ASM:ARM 公司的汇编器,适合在 Windows 平台下使用,其汇编语法可以参考
文献 1.”
2,GNU ARM ASM:GNU 工具的 ARM 汇编器版本,适合于 Linux 开发平台,部分汇编语
法可以参考文献 2.
本文主要介绍 GNU ARM 语法,其很多语法特征与 Windows 平台下 ARM ASM 汇编语法
是不同的。本文所介绍的 GNU ARM 语法,借鉴了上述第二本参考书籍以及一些网络内容,
同时结合作者在华为泰山服务器上基于 ArmV8 Aarch64 的编码实践而成。本文所举的汇编语
法虽然适用于所有 GNU ARM 汇编编程,但是汇编代码例子都是针对 ArmV8 Aarch64 体系结
构展开的。
1、GNU ARM 汇编语言语句格式
任何 Linux 汇编行都是如下结构:
[<label>:][<instruction or directive or pseudo-instruction>} //comment
<label>: 为标号, GNU 汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要
在一行的开始。标号可以代表“标号处的代码”,也可以代表“标签处的数据的地址”;
instruction 为 ARM 指令
directive 为伪操作:伪操作均是以小数点开头,例如“.section”、“.text”等;
pseudo-instruction 为伪指令
//为代码行中间的注释符号,comment 为具体的注释语句,其它注释符号参见第 6 节“特殊字
符”
下面定义一个"add"函数的例子:
.section .text // 代码段开始,在一些 gnu arm 编译器中,此部分可选。
.global add // 声明 add 为全局标号,这样它就可以在其它文件中使用
add: // 标号名为 add,使用“:”与其后的指令隔开;
ADD w0, w0, w1 // add input arguments
ret // return from add
// end of program
注意:
1>ARM 指令,伪指令,伪操作,寄存器名可以全部为大写字母,也可全部为小写字母,但不可大小
写混用。
2>如果语句太长,可以将一条语句分几行来书写,在行末用“\”表示换行(即下一行与本行为同
一语句)。“\”后不能有任何字符,包含空格和制表符(Tab)。
2、标号(label)
标号只能由 a~z,A~Z,0~9,".",_等(由点、字母、数字、下划线等组成,除局部标号
外,不能以数字开头)字符组成,不能与系统预定义的符号、指令助记符和伪指令等同名。标号区分
大小写,并且所有的字符都是有意义的。注意:除局部标号外,其它的标号都不能以数字开头。
标号的本质为其所在的地址,该地址既可以当作变量的地址,也可以作为函数的地址来使用。
1>段内标号的地址值在汇编时确定;
2>段外标号的地址值在连接时确定。
局部标号是一种特殊的标号,主要在局部范围内使用,而且局部标号可以重复出现。它由两部
组成:开头是一个 0-99 直接的数字,后面紧接一个通常表示该局部变量作用范围的符号。局部变量
的作用范围通常为当前段,也可以用 ROUT 来定义局部变量的作用范围。
1>局部变量定义的语法格式:N{routname}
N:为 0~99 之间的数字。
routname:当前局部范围的名称(为符号),通常为该变量作用范围的名称(用 ROUT 伪
操作定义的)。
2>局部变量引用的语法格式:%{F|B}{A|T}N{routname}
N:为局部变量的数字号
routname:为当前作用范围的名称(用 ROUT 伪操作定义的)
F:指示编译器只向前搜索
B:指示编译器只向后搜索
A:指示编译器搜索宏的所有嵌套层次
T:指示编译器搜索宏的当前层次
例:下面的代码使用了两个局部符号 1,
1:
subs w0, w0, #1 //每次循环使 r0=r0-1
cmp w0,0
b.ne 1b //跳转到当前指令之前 1 标号处去执行,即执行指令 subs…
add w0,w0,1
cmp w0,0
b.ne 1f //跳转到当前指令之后的 1 标号处去执行,即执行指令 mov w1,1
1: mov w1,1
注意:
如果 F 和 B 都没有指定,编译器先向前搜索,再向后搜索
如果 A 和 T 都没有指定,编译器搜索所有从当前层次到宏的最高层次,比当前层次低的层次不再
搜索。
如果指定了 routname,编译器向前搜索最近的 ROUT 伪操作,若 routname 与该 ROUT 伪操作定义
的名称不匹配,编译器报告错误,汇编失败。
剩余19页未读,继续阅读
黄浦江畔的夏先生
- 粉丝: 11
- 资源: 299
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0