RealView® 编译工具 3.1 版 汇编程序指南
目录
前言
关于本手册
适用对象
使用本手册
更多参考出版物
反馈
RealView 编译工具的反馈信息
关于本手册的反馈
简介
1.1 关于 RealView 编译工具汇编程序
1.1.1 ARM 汇编语言
1.1.2 无线 MMX 技术指令
1.1.3 NEON 技术
1.1.4 使用示例
编写 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.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 预处理程序
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 伪指令
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 指令和向量记号
无线 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.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