RealView® 编译工具 汇编程序指南

3.1 版


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.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. Thumb 中的指令宽度选择
4.2.1. 指令宽度说明符:.W 和 .N
4.2.2. 同一指令的不同行为
4.2.3. 诊断警告
4.3. 内存访问指令
4.3.1. 地址对齐
4.3.2. LDR 和 STR(直接偏移量)
4.3.3. LDR 和 STR(寄存器偏移)
4.3.4. LDR 和 STR(用户模式)
4.3.5. LDR(相对 pc)
4.3.6. ADR
4.3.7. PLD 和 PLI
4.3.8. LDM 和 STM
4.3.9. PUSH 和 POP
4.3.10. RFE
4.3.11. SRS
4.3.12. LDREX 和 STREX
4.3.13. CLREX
4.3.14. SWP 和 SWPB
4.4. 通用数据处理指令
4.4.1. 灵活的第二操作数
4.4.2. ADD、SUB、RSB、ADC、SBC 和 RSC
4.4.3. SUBS pc, LR
4.4.4. AND、ORR、EOR、BIC 和 ORN
4.4.5. CLZ
4.4.6. CMP 和 CMN
4.4.7. MOV 和 MVN
4.4.8. MOVT
4.4.9. TST 和 TEQ
4.4.10. SEL
4.4.11. REV、REV16、REVSH 和 RBIT
4.4.12. ASR、LSL、LSR、ROR 和 RRX
4.4.13. IT
4.4.14. SDIV 和 UDIV
4.5. 乘法指令
4.5.1. MUL、MLA 和 MLS
4.5.2. UMULL、UMLAL、SMULL 和 SMLAL
4.5.3. SMULxy 和 SMLAxy
4.5.4. SMULWy 和 SMLAWy
4.5.5. SMLALxy
4.5.6. SMUAD{X} 和 SMUSD{X}
4.5.7. SMMUL、SMMLA 和 SMMLS
4.5.8. SMLAD 和 SMLSD
4.5.9. SMLALD 和 SMLSLD
4.5.10. UMAAL
4.5.11. MIA、MIAPH 和 MIAxy
4.6. 饱和指令
4.6.1. 饱和算法
4.6.2. QADD、QSUB、QDADD 和 QDSUB
4.6.3. SSAT 和 USAT
4.7. 并行指令
4.7.1. 并行加法和减法
4.7.2. USAD8 和 USADA8
4.7.3. SSAT16 和 USAT16
4.8. 组合和分离指令
4.8.1. BFC 和 BFI
4.8.2. SBFX 和 UBFX
4.8.3. SXT、SXTA、UXT 和 UXTA
4.8.4. PKHBT 和 PKHTB
4.9. 跳转指令
4.9.1. B、BL、BX、BLX 和 BXJ
4.9.2. CBZ 和 CBNZ
4.9.3. TBB 和 TBH
4.10. 协处理器指令
4.10.1. CDP 和 CDP2
4.10.2. MCR、MCR2、MCRR 和 MCRR2
4.10.3. MRC、MRC2、MRRC 和 MRRC2
4.10.4. LDC、LDC2、STC 和 STC2
4.11. 其他指令
4.11.1. BKPT
4.11.2. SVC
4.11.3. MRS
4.11.4. MSR
4.11.5. CPS
4.11.6. SMC
4.11.7. SETEND
4.11.8. NOP、SEV、WFE、WFI 和 YIELD
4.11.9. DBG、DMB、DSB 和 ISB
4.11.10. MAR 和 MRA
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. 扩展寄存器组的 VFPv3 视图
5.2. 条件代码
5.3. 一般信息
5.3.1. 浮点异常
5.3.2. 体系机构的版本
5.3.3. NEON 和 VFP 数据类型
5.3.4. NEON 中的正常指令、长指令、宽指令、窄指令和饱和指令
5.3.5. NEON 标量
5.3.6. 扩展记号
5.3.7. {0,1} 上的多项式算法
5.3.8. VFP 协处理器
5.3.9. VFP 寄存器
5.4. NEON 和 VFP 共享的指令
5.4.1. VLDR 和 VSTR
5.4.2. VLDM、VSTM、VPOP 和 VPUSH
5.4.3. VMOV(在两个 ARM 寄存器和一个扩展寄存器之间)
5.4.4. VMOV(在一个 ARM 寄存器和一个 NEON 标量之间)
5.4.5. VMOV(在一个 ARM 寄存器和一个单精度 VFP 之间)
5.4.6. VMRS 和 VMSR
5.5. NEON 逻辑运算和比较运算
5.5.1. VAND、VBIC、VEOR、VORN 和 VORR(寄存器)
5.5.2. VBIC 和 VORR(立即数)
5.5.3. VBIF、VBIT 和 VBSL
5.5.4. VMOV、VMVN(寄存器)
5.5.5. VACGE 和 VACGT
5.5.6. VCEQ、VCGE、VCGT、VCLE 和 VCLT
5.5.7. VTST
5.6. NEON 通用数据处理指令
5.6.1. VCVT
5.6.2. VDUP
5.6.3. VEXT
5.6.4. VMOV、VMVN(立即数)
5.6.5. VMOVL、V{Q}MOVN、VQMOVUN
5.6.6. VREV
5.6.7. VSWP
5.6.8. VTBL、VTBX
5.6.9. VTRN
5.6.10. VUZP、VZIP
5.7. NEON 移位指令
5.7.1. VSHL、VQSHL、VQSHLU 和 VSHLL(按立即数)
5.7.2. V{Q}{R}SHL(按有符号变量)
5.7.3. V{R}SHR{N}、V{R}SRA(按立即数)
5.7.4. VQ{R}SHR{U}N(按立即数)
5.7.5. VSLI 和 VSRI
5.8. NEON 通用算术指令
5.8.1. VABA{L} 和 VABD{L}
5.8.2. V{Q}ABS 和 V{Q}NEG
5.8.3. V{Q}ADD、VADDL、VADDW、V{Q}SUB、VSUBL 和 VSUBW
5.8.4. V{R}ADDHN 和 V{R}SUBHN
5.8.5. V{R}HADD 和 VHSUB
5.8.6. VPADD{L}、VPADAL
5.8.7. VMAX、VMIN、VPMAX 和 VPMIN
5.8.8. VCLS、VCLZ 和 VCNT
5.8.9. VRECPE 和 VRSQRTE
5.8.10. VRECPS 和 VRSQRTS
5.9. NEON 乘法指令
5.9.1. VMUL{L}、VMLA{L} 和 VMLS{L}
5.9.2. VMUL{L}、VMLA{L} 和 VMLS{L}(按标量)
5.9.3. VQDMULL、VQDMLAL 和 VQDMLSL(按向量或标量)
5.9.4. VQ{R}DMULH(按向量或标量)
5.10. NEON 加载/存储元素和结构指令
5.10.1. 交叉存取
5.10.2. 加载/存储元素和结构指令中的对齐限制
5.10.3. VLDn 和 VSTn(单个 n 元素结构到一条向量线)
5.10.4. VLDn(单个 n 元素结构到所有向量线)
5.10.5. VLDn 和 VSTn(多个 n 元素结构)
5.11. NEON 和 VFP 伪指令
5.11.1. VLDR 伪指令
5.11.2. VMOV2
5.11.3. VAND 和 VORN(立即数)
5.11.4. VACLE 和 VACLT
5.11.5. VCLE 和 VCLT
5.12. NEON 和 VFP 系统寄存器
5.12.1. FPSCR,浮点状态和控制寄存器
5.12.2. FPEXC,浮点异常寄存器
5.12.3. FPSID,浮点系统标识寄存器
5.12.4. 修改 NEON 和 VFP 系统寄存器的个别位
5.13. 清零模式
5.13.1. 何时使用清零模式
5.13.2. 使用清零模式的影响
5.13.3. 不受清零模式影响的运算。
5.14. VFP 指令
5.14.1. VABS、VNEG 和 VSQRT
5.14.2. VADD、VSUB 和 VDIV
5.14.3. VMUL、VMLA、VMLS、VNMUL、VNMLA 和 VNMLS
5.14.4. VCMP
5.14.5. VCVT(在单精度数和双精度数之间)
5.14.6. VCVT(在浮点数和整数之间)
5.14.7. VCVT(在浮点数和定点数之间)
5.14.8. VMOV
5.15. VFP 向量模式
5.15.1. 寄存器组
5.15.2. 向量
5.15.3. VFP 向量和标量运算
5.15.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
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. END
7.8.4. ENTRY
7.8.5. EQU
7.8.6. EXPORT 或 GLOBAL
7.8.7. EXPORTAS
7.8.8. GET 或 INCLUDE
7.8.9. IMPORT 和 EXTERN
7.8.10. INCBIN
7.8.11. KEEP
7.8.12. NOFP
7.8.13. REQUIRE
7.8.14. REQUIRE8 和 PRESERVE8
7.8.15. 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.8. MOV 指令中的 Thumb 状态立即数 
2.9. 用于加载和存储多个指令的后缀 
2.10. 自早期 ARM 汇编语言以来所发生的变更 
2.11. 减少的要求限制 
2.12. 旧 Thumb 语法与当前语言之间的区别 
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. 布尔运算符 
4.1. 指令位置 
4.2. 偏移量和体系结构、LDR/STR、字、半字和字节 
4.3. 选项和体系结构,LDR/STR(寄存器偏移) 
4.4. 偏移量和体系结构,LDR/STR(用户模式) 
4.5. PC 相对的偏移量 
4.6. PC 相对的偏移量 
4.7. 跳转指令的可用性和范围 
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. UAL VFP 预助记符 
5.15. 浮点常数值 
6.1. 状态和控制寄存器
6.2. 无线 MMX 技术指令
6.3. 无线 MMX 技术伪指令
7.1. 指令的位置 
7.2. OPT 指令设置 

所有权声明

带有 ®™ 标记的词语和徽标是 ARM 公司的注册商标或商标。 此处提及的其他品牌和名称可能是其各自所有者的商标。

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

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

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

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

保密状态

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

产品状态

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

Revision History
Revision A 2002 年 8 月 1.2 版
Revision B 2003 年 1 月 2.0 版
Revision C 2003 年 9 月 RVDS v2.0 的 2.0.1 版
Revision D 2004 年 1 月 RVDS v2.1 的 2.1 版
Revision E 2004 年 12 月 RVDS v2.2 的 2.2 版
Revision F 2005 年 5 月 RVDS v2.2 SP1 的 2.2 版
Revision G 2006 年 3 月 RVDS v3.0 的 3.0 版
Revision H 2007 年 3 月 RVDS v3.1 的 3.1 版。
Copyright © 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HC
Non-Confidential