RealView® 编译工具 《汇编器指南》

4.0 版


Table of Contents

前言
关于本手册
适用对象
使用本手册
印刷约定
更多参考出版物
反馈
对 RealView 编译工具的反馈
关于本手册的反馈
1. 简介
1.1. 关于 RealView 编译工具汇编器
1.1.1. ARM 汇编语言
1.1.2. 无线 MMX 技术指令
1.1.3. NEON 技术
1.1.4. 使用示例
2. 编写 ARM 汇编语言
2.1. 简介
2.1.1. 代码示例
2.2. ARM 体系结构概述
2.2.1. 体系机构的版本
2.2.2. ARM、Thumb、Thumb-2 和 Thumb-2EE 指令集
2.2.3. ARM、Thumb 和 ThumbEE 状态
2.2.4. 处理器模式
2.2.5. 寄存器
2.2.6. 指令集概述
2.2.7. 指令功能
2.3. 汇编语言模块的结构
2.3.1. 汇编语言源文件的编排
2.3.2. ARM 汇编语言模块示例
2.3.3. 调用子例程
2.4. 条件执行
2.4.1. ALU 状态标记
2.4.2. 条件执行
2.4.3. 使用条件执行
2.4.4. 使用条件执行的示例
2.4.5. Q 标记
2.5. 将常数加载到寄存器
2.5.1. 用 MOV 和 MVN 直接加载
2.5.2. 用 MOV32 加载
2.5.3. 用 LDR Rd, =const 加载
2.5.4. 加载浮点常数
2.6. 将地址加载到寄存器中
2.6.1. 用 ADR 和 ADRL 直接加载
2.6.2. 用 LDR Rd, =label 加载地址
2.7. 加载和存储多个寄存器指令
2.7.1. 加载和存储可在 ARM 和 Thumb 中使用的多个指令
2.7.2. 用 LDM 和 STM 执行堆栈
2.7.3. 用 LDM 和 STM 执行块复制
2.8. 使用宏
2.8.1. 测试并跳转宏示例
2.8.2. 无符号整数除法宏示例
2.9. 添加符号版本
2.10. 使用框架指令
2.11. 汇编语言变更
3. 汇编器参考
3.1. 命令语法
3.1.1. 获得可用选项列表
3.1.2. 使用环境变量指定命令行选项
3.1.3. AAPCS
3.1.4. 浮点模型
3.1.5. CPU 名称
3.1.6. FPU 名称
3.1.7. 内存访问属性
3.1.8. 预先执行 SET 指令
3.1.9. 分割长 LDM 和 STM
3.1.10. 列表输出到文件中
3.1.11. 项目模板选项
3.1.12. 控制诊断消息的输出
3.1.13. 控制异常表生成
3.2. 源语句行格式
3.3. 预定义的寄存器和协处理器名称
3.3.1. 预先声明的寄存器名称
3.3.2. 预先声明的扩展寄存器名称
3.3.3. 预先声明的 XScale 寄存器名称
3.3.4. 预先声明的协处理器名称
3.4. 内置变量和常数
3.4.1. 检测 armasm 的版本
3.5. 符号
3.5.1. 符号命名规则
3.5.2. 变量
3.5.3. 数字常数
3.5.4. 汇编时的变量替换
3.5.5. 标签
3.5.6. 局部标签
3.6. 表达式、文本和运算符
3.6.1. 字符串表达式
3.6.2. 字符串文本
3.6.3. 数字表达式
3.6.4. 数字文本
3.6.5. 浮点文本
3.6.6. 相对寄存器和程序相对的表达式
3.6.7. 逻辑表达式
3.6.8. 逻辑文本
3.6.9. 运算符优先级
3.6.10. 一元运算符
3.6.11. 二元运算符
3.7. 诊断消息
3.7.1. 互锁
3.7.2. IT 块生成
3.7.3. Thumb 跳转目标对齐
3.8. 使用 C 预处理程序
4. ARM 和 Thumb 指令
4.1. 指令汇总
4.2. 内存访问指令
4.2.1. 地址对齐
4.2.2. LDR 和 STR(直接偏移量)
4.2.3. LDR 和 STR(寄存器偏移)
4.2.4. LDR 和 STR(用户模式)
4.2.5. LDR(相对 pc)
4.2.6. ADR
4.2.7. PLD、PLDW 和 PLI
4.2.8. LDM 和 STM
4.2.9. PUSH 和 POP
4.2.10. RFE
4.2.11. SRS
4.2.12. LDREX 和 STREX
4.2.13. CLREX
4.2.14. SWP 和 SWPB
4.3. 通用数据处理指令
4.3.1. 灵活的第二操作数
4.3.2. ADD、SUB、RSB、ADC、SBC 和 RSC
4.3.3. SUBS pc, lr
4.3.4. AND、ORR、EOR、BIC 和 ORN
4.3.5. CLZ
4.3.6. CMP 和 CMN
4.3.7. MOV 和 MVN
4.3.8. MOVT
4.3.9. TST 和 TEQ
4.3.10. SEL
4.3.11. REV、REV16、REVSH 和 RBIT
4.3.12. ASR、LSL、LSR、ROR 和 RRX
4.3.13. SDIV 和 UDIV
4.4. 乘法指令
4.4.1. MUL、MLA 和 MLS
4.4.2. UMULL、UMLAL、SMULL 和 SMLAL
4.4.3. SMULxy 和 SMLAxy
4.4.4. SMULWy 和 SMLAWy
4.4.5. SMLALxy
4.4.6. SMUAD{X} 和 SMUSD{X}
4.4.7. SMMUL、SMMLA 和 SMMLS
4.4.8. SMLAD 和 SMLSD
4.4.9. SMLALD 和 SMLSLD
4.4.10. UMAAL
4.4.11. MIA、MIAPH 和 MIAxy
4.5. 饱和指令
4.5.1. 饱和算法
4.5.2. QADD、QSUB、QDADD 和 QDSUB
4.5.3. SSAT 和 USAT
4.6. 并行指令
4.6.1. 并行加法和减法
4.6.2. USAD8 和 USADA8
4.6.3. SSAT16 和 USAT16
4.7. 组合和分离指令
4.7.1. BFC 和 BFI
4.7.2. SBFX 和 UBFX
4.7.3. SXT、SXTA、UXT 和 UXTA
4.7.4. PKHBT 和 PKHTB
4.8. 跳转和控制指令
4.8.1. B、BL、BX、BLX 和 BXJ
4.8.2. IT
4.8.3. CBZ 和 CBNZ
4.8.4. TBB 和 TBH
4.9. 协处理器指令
4.9.1. CDP 和 CDP2
4.9.2. MCR、MCR2、MCRR 和 MCRR2
4.9.3. MRC、MRC2、MRRC 和 MRRC2
4.9.4. LDC、LDC2、STC 和 STC2
4.10. 其他指令
4.10.1. BKPT
4.10.2. SVC
4.10.3. MRS
4.10.4. MSR
4.10.5. CPS
4.10.6. SMC
4.10.7. SETEND
4.10.8. NOP、SEV、WFE、WFI 和 YIELD
4.10.9. DBG、DMB、DSB 和 ISB
4.10.10. MAR 和 MRA
4.11. Thumb 中的指令宽度选择
4.11.1. 指令宽度说明符:.W 和 .N
4.11.2. 相同指令的不同行为
4.11.3. 诊断警告
4.12. ThumbEE 指令
4.12.1. ENTERX 和 LEAVEX
4.12.2. CHKA
4.12.3. HB、HBL、HBLP 和 HBP
4.13. 伪指令
4.13.1. ADRL 伪指令
4.13.2. MOV32 伪指令
4.13.3. LDR 伪指令
4.13.4. UND 伪指令
5. NEON 和 VFP 编程
5.1. 指令汇总
5.1.1. NEON 指令
5.1.2. 共享的 NEON 和 VFP 指令
5.1.3. VFP 指令
5.2. 对 NEON 和 VFP 的体系结构支持
5.2.1. 半精度扩展
5.3. 扩展寄存器组
5.3.1. 寄存器组的 NEON 视图
5.3.2. 扩展寄存器组的 VFP 视图
5.4. 条件代码
5.5. 一般信息
5.5.1. 浮点异常
5.5.2. NEON 和 VFP 数据类型
5.5.3. NEON 中的正常指令、长指令、宽指令、窄指令和饱和指令
5.5.4. NEON 标量
5.5.5. 扩展记号
5.5.6. {0,1} 上的多项式算法
5.5.7. VFP 协处理器
5.6. NEON 和 VFP 共享的指令
5.6.1. VLDR 和 VSTR
5.6.2. VLDM、VSTM、VPOP 和 VPUSH
5.6.3. VMOV(在两个 ARM 寄存器和一个扩展寄存器之间)
5.6.4. VMOV(在一个 ARM 寄存器和一个 NEON 标量之间)
5.6.5. VMOV(在一个 ARM 寄存器和一个单精度 VFP 之间)
5.6.6. VMRS 和 VMSR
5.7. NEON 逻辑运算和比较运算
5.7.1. VAND、VBIC、VEOR、VORN 和 VORR(寄存器)
5.7.2. VBIC 和 VORR(立即数)
5.7.3. VBIF、VBIT 和 VBSL
5.7.4. VMOV、VMVN(寄存器)
5.7.5. VACGE 和 VACGT
5.7.6. VCEQ、VCGE、VCGT、VCLE 和 VCLT
5.7.7. VTST
5.8. NEON 通用数据处理指令
5.8.1. VCVT(在定点数或整数与浮点数之间)
5.8.2. VCVT(在半精度数和单精度浮点数之间转换)
5.8.3. VDUP
5.8.4. VEXT
5.8.5. VMOV、VMVN(立即数)
5.8.6. VMOVL、V{Q}MOVN、VQMOVUN
5.8.7. VREV
5.8.8. VSWP
5.8.9. VTBL、VTBX
5.8.10. VTRN
5.8.11. VUZP、VZIP
5.9. NEON 移位指令
5.9.1. VSHL、VQSHL、VQSHLU 和 VSHLL(按立即数)
5.9.2. V{Q}{R}SHL(按有符号变量)
5.9.3. V{R}SHR{N}、V{R}SRA(按立即数)
5.9.4. VQ{R}SHR{U}N(按立即数)
5.9.5. VSLI 和 VSRI
5.10. NEON 通用算术指令
5.10.1. VABA{L} 和 VABD{L}
5.10.2. V{Q}ABS 和 V{Q}NEG
5.10.3. V{Q}ADD、VADDL、VADDW、V{Q}SUB、VSUBL 和 VSUBW
5.10.4. V{R}ADDHN 和 V{R}SUBHN
5.10.5. V{R}HADD 和 VHSUB
5.10.6. VPADD{L}、VPADAL
5.10.7. VMAX、VMIN、VPMAX 和 VPMIN
5.10.8. VCLS、VCLZ 和 VCNT
5.10.9. VRECPE 和 VRSQRTE
5.10.10. VRECPS 和 VRSQRTS
5.11. NEON 乘法指令
5.11.1. VMUL{L}、VMLA{L} 和 VMLS{L}
5.11.2. VMUL{L}、VMLA{L} 和 VMLS{L}(按标量)
5.11.3. VQDMULL、VQDMLAL 和 VQDMLSL(按向量或标量)
5.11.4. VQ{R}DMULH(按向量或标量)
5.12. NEON 加载/存储元素和结构指令
5.12.1. 交叉存取
5.12.2. 加载和存储元素和结构指令中的对齐限制
5.12.3. VLDn 和 VSTn(单个 n 元素结构到一条向量线)
5.12.4. VLDn(单个 n 元素结构到所有向量线)
5.12.5. VLDn 和 VSTn(多个 n 元素结构)
5.13. NEON 和 VFP 伪指令
5.13.1. VLDR 伪指令
5.13.2. VLDR 和 VSTR(后增量和前增量)
5.13.3. VMOV2
5.13.4. VAND 和 VORN(立即数)
5.13.5. VACLE 和 VACLT
5.13.6. VCLE 和 VCLT
5.14. NEON 和 VFP 系统寄存器
5.14.1. FPSCR,浮点状态和控制寄存器
5.14.2. FPEXC,浮点异常寄存器
5.14.3. FPSID,浮点系统标识寄存器
5.14.4. 修改 NEON 和 VFP 系统寄存器的个别位
5.15. 清零模式
5.15.1. 何时使用清零模式
5.15.2. 使用清零模式的影响
5.15.3. 不受清零模式影响的运算。
5.16. VFP 指令
5.16.1. VABS、VNEG 和 VSQRT
5.16.2. VADD、VSUB 和 VDIV
5.16.3. VMUL、VMLA、VMLS、VNMUL、VNMLA 和 VNMLS
5.16.4. VCMP
5.16.5. VCVT(在单精度数和双精度数之间)
5.16.6. VCVT(在浮点数和整数之间)
5.16.7. VCVT(在浮点数和定点数之间)
5.16.8. VCVTB,VCVTT(半精度扩展)
5.16.9. VMOV
5.17. VFP 向量模式
5.17.1. 寄存器组
5.17.2. 向量
5.17.3. VFP 向量和标量运算
5.17.4. VFP 指令和向量记号
6. 无线 MMX 技术指令
6.1. 简介
6.2. ARM 对无线 MMX 技术的支持
6.2.1. 寄存器
6.2.2. WRN 和 WCN 指令
6.2.3. Frame 指令
6.2.4. 无线 MMX 加载和存储指令
6.2.5. 无线 MMX 技术和 XScale 指令
6.3. 无线 MMX 指令
6.3.1. 伪指令
7. 指令参考
7.1. 按字母顺序排列的指令表
7.2. 符号定义指令
7.2.1. GBLA、GBLL 和 GBLS
7.2.2. LCLA、LCLL 和 LCLS
7.2.3. SETA、SETL 和 SETS
7.2.4. RELOC
7.2.5. RN
7.2.6. RLIST
7.2.7. CN
7.2.8. CP
7.2.9. QN、DN 和 SN
7.3. 数据定义指令
7.3.1. LTORG
7.3.2. MAP
7.3.3. FIELD
7.3.4. SPACE 或 FILL
7.3.5. DCB
7.3.6. DCD 和 DCDU
7.3.7. DCDO
7.3.8. DCFD 和 DCFDU
7.3.9. DCFS 和 DCFSU
7.3.10. DCI
7.3.11. DCQ 和 DCQU
7.3.12. DCW 和 DCWU
7.3.13. COMMON
7.3.14. DATA
7.4. 汇编控制指令
7.4.1. 嵌套指令
7.4.2. MACRO 和 MEND
7.4.3. MEXIT
7.4.4. IF、ELSE、ENDIF 和 ELIF
7.4.5. WHILE 和 WEND
7.5. Frame 指令
7.5.1. FRAME ADDRESS
7.5.2. FRAME POP
7.5.3. FRAME PUSH
7.5.4. FRAME REGISTER
7.5.5. FRAME RESTORE
7.5.6. FRAME RETURN ADDRESS
7.5.7. FRAME SAVE
7.5.8. FRAME STATE REMEMBER
7.5.9. FRAME STATE RESTORE
7.5.10. FRAME UNWIND ON
7.5.11. FRAME UNWIND OFF
7.5.12. FUNCTION 或 PROC
7.5.13. ENDFUNC 或 ENDP
7.6. 报告指令
7.6.1. ASSERT
7.6.2. INFO
7.6.3. OPT
7.6.4. TTL 和 SUBT
7.7. 指令集和语法选择指令
7.7.1. ARM、THUMB、THUMBX、CODE16 和 CODE32
7.8. 其他指令
7.8.1. ALIGN
7.8.2. AREA
7.8.3. ATTR
7.8.4. END
7.8.5. ENTRY
7.8.6. EQU
7.8.7. EXPORT 或 GLOBAL
7.8.8. EXPORTAS
7.8.9. GET 或 INCLUDE
7.8.10. IMPORT 和 EXTERN
7.8.11. INCBIN
7.8.12. KEEP
7.8.13. NOFP
7.8.14. REQUIRE
7.8.15. REQUIRE8 和 PRESERVE8
7.8.16. ROUT

List of Tables

2.1. ARM 处理器模式
2.2. 条件代码后缀
2.3. 仅使用条件跳转
2.4. 所有指令都是条件指令
2.5. ARM 状态立即数(8 位)
2.6. MOV 指令中的 ARM 状态立即数
2.7. Thumb-2 立即数
2.8. MOV 指令中的 Thumb-2 立即数
2.9. 面向堆栈的后缀及其等效寻址模式后缀
2.10. 用于加载和存储多个指令的后缀
2.11. 自早期 ARM 汇编语言以来所发生的变更
2.12. 减少的要求限制
2.13. UAL 以前的 Thumb 语法与 UAL 语法之间的区别
3.1. 诊断消息的严重性
3.2. 内置变量
3.3. 内置布尔常数
3.4. armasm 中的运算符优先级
3.5. C 中的运算符优先级
3.6. 返回字符串的一元运算符
3.7. 返回数值或逻辑值的一元运算符
3.8. 乘法运算符
3.9. 字符串处理运算符
3.10. 移位运算符
3.11. 加法、减法和逻辑运算符
3.12. 关系运算符
3.13. 布尔运算符
3.14. 命令行选项
3.15. 等效的 armcc 命令行选项
4.1. 指令位置
4.2. 偏移量和体系结构、LDR/STR、字、半字和字节
4.3. 选项和体系结构,LDR/STR(寄存器偏移)
4.4. 偏移量和体系结构,LDR/STR(用户模式)
4.5. PC 相对的偏移量
4.6. 相对 PC 的偏移量
4.7. 跳转指令的可用性和范围
4.8. expr 的范围和编码
5.1. NEON 指令的位置
5.2. 共享的 NEON 和 VFP 指令的位置
5.3. VFP 指令的位置
5.4. 条件代码
5.5. NEON 数据类型
5.6. VFP 数据类型
5.7. NEON 饱和范围
5.8. 立即数的模式
5.9. 可用常数
5.10. 超出范围的输入的结果
5.11. 超出范围的输入的结果
5.12. 允许的参数组合
5.13. 允许的参数组合
5.14. 允许的参数组合
5.15. UAL VFP 预助记符
5.16. 浮点常数值
6.1. 状态和控制寄存器
6.2. 无线 MMX 技术指令
6.3. 无线 MMX 技术伪指令
7.1. 指令的位置
7.2. OPT 指令设置

所有权声明

除非本所有权声明在下面另有说明,否则带有 ®™ 标记的词语和徽标是 ARM Limited 在欧盟和其他国家/地区的注册商标或商标。 此处提及的其他品牌和名称可能是其各自所有者的商标。

除非事先得到版权所有人的书面许可,否则不得以任何形式修改或复制本文档包含的部分或全部信息以及产品说明。

本文档描述的产品还将不断发展和完善。 ARM Limited 将如实提供本文档所述产品的所有特性及其使用方法。 但是,所有暗示或明示的担保,包括但不限于对特定用途适销性或适用性的担保,均不包括在内。

本文档的目的仅在于帮助读者使用产品。 对于因使用本文档中的任何信息、文档信息出现任何错误或遗漏或者错误使用产品造成的任何损失或损害,ARM 公司概不负责。

使用 ARM 一词时,它表示ARM 或其任何相应的子公司。

保密状态

本文档的内容是非保密的。 根据 ARM 与 ARM 将本文档交予的参与方的协议条款,使用、复制和公开本文档内容的权利可能会受到许可限制的制约。

受限访问是一种 ARM 内部分类。

产品状态

本文档的信息是开发的产品的最新信息。

Revision History
Revision A2002 年 8 月1.2 版
Revision B2003 年 1 月2.0 版
Revision C2003 年 9 月RealView Development Suite v2.0 2.0.1 版
Revision D2004 年 1 月RealView Development Suite v2.1 2.1 版
Revision E2004 年 12 月RealView Development Suite v2.2 2.2 版
Revision F2005 年 5 月RealView Development Suite v2.2 SP1 2.2 版
Revision G2006 年 3 月RealView Development Suite v3.0 3.0 版
Revision H2007 年 3 月RealView Development Suite v3.1 3.1 版
Revision I2008 年 9 月RealView Development Suite v4.0 4.0 版
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IC
Non-Confidential