ARM 常用 指令表 嵌入式 考试必备
- 格式:pdf
- 大小:103.65 KB
- 文档页数:3
Arm常用指令一览表V1.1作者:李志勇指令功能实例注释Mov 给一个寄存器赋值Mov r0, #10Mov r0, r1R0 = 10R0 = r1Movt 给一个寄存器的高16位赋值Movt r0, #10Movt r0, r1把一个16位的op2放到r0的[31-16],r0的[15-0]不变注意:op2不能大于16位,但可以不符合立即数规则,如op2可以是0x1234,op1必须是可读可写的Mvn 把一个数值按位取反后赋值给一个寄存器Mvn r0,#0xffMvn r0, r1R0 = ~0xffR0 = ~r1Add 计算两个数值的加法Add r0,r0,#10Add r0,r0,r1R0 = r0 + 10R0 = r0 + r1Adc 带进位的加法Adc r0,r0,#10Adc r0,r0,r1R0 = r0 + 10 + CR0 = r0 + r1 + CSub 计算两个数值的减法Sub r0,r0, #10Sub r0, r0, r1R0 = r0 – 10R0 = r0 - r1Sbc 带借位的减法Sbc r0, r0, #10Sbc r0, r0, r1R0 = r0 – 10 - !CR0 = r0 – r1 - !CRsb 反转减法Rsb r0, r0, r1Rsb r0, r0, #10R0 = r1 – r0R0 = 10 - r0Rsc 带借位的反转减法Rsc r0, r0, r1Rsc r0, r0, #10R0 = r1 – r0 - !CR0 = 10 – r0 - !CMul 乘法Mul r0, r1, r2 R0 = r1 * r2Mla 乘加Mul r0, r1, r2, r3 R0 = r1 * r2 + r3Mls 乘减Mls r0, r1, r2, r3 R0 = r3 – r1 * r2Orr 按位或Orr r0, r0, r1Orr r0, r0, #10R0 = r0 | r1R0 = r0 | 10Eor 按位异或Eor r0, r0, #10Eor r0, r0, r1R0 = r0 ^ 10R0 = r0 ^ r1And 按位与And r0, r0, r1And r0, r0, #10R0 = r0 & r1R0 = r0 & 10Bic 位取反 Bic r0, r0, r1 Bic r0, r0, #10 R0 = r0 & (~r1) R0 = r0 & (~10) Lsr 逻辑右移 R0, lsr r1 R0, lsr #10 R0 >>> r1 R0 >>> 1 Lsl 逻辑左移 R0, lsl r1 R0, lsl #1 R0 <<< r1 R0 <<< 1 Asr 算术右移 R0, asr r1 R0, asr #1 R0 >> r1 R0 >> 1Ror 循环右移 R0, ror r1 R0, ror #1 (R0 >>> r1) | (R0 <<< (32 – r1)) (R0 >>> 1) | (R0 <<< (32 – 1)) Cmp 比较Cmp r0, r1 Cmp r0, #10 R0 – r1 影响cpsr 标志位 R0 – 10 影响cpsr 标志位 Teq 比较(按位异或) Teq r0, r1 Teq r0, #10 R0 ^ r1 影响cpsr 标志位 R0 ^ 10 影响cpsr 标志位 Tst 比较(按位与)Tst r0, r1 Tst r0, #10 R0 & r1 影响cpsr 标志位 R0 & 10 影响cpsr 标志位 Mrs 读cpsr Mrs r0, cpsr R0 = cpsr Msr 写cpsr Msr cpsr, r0 Cpsr = r0Swi 软中断 Swi 10 产生软中断异常 Svc 等同于swiSvc 10产生软中断异常 Ldr把数据从内存加载的寄存器Ldr r0, addr ldr r0, =addr ldr r1, [r0] ldr r1, [r0, #4] ldr r1, [r0, #4]! ldr r1, [r0], #4 R0 = *addr R0 = addr R1 = *r0R1 = *(r0 + 4)R1 = *(r0 + 4); r0 += 4 R1 = *r0; r0 += 4 Str 把数据从寄存器保存的内存Str r0, addr Str r1, [r0] Str r1, [r0, #4] Str r1, [r0, #4]! Str r1, [r0], #4*addr = r0 *r0 = r1*(r0 + 4) = r1*(r0 + 4) = r1; r0 += 4 *r0 = r1; r0 += 4Ldm 把数据从内存加载的寄存器 Ldmfd sp!, {r0-r12, lr} 把寄存器的值放到慢递减栈中 Stm把数据从寄存器保存的内存Stmfd sp!, {r0-r12, lr} 从慢递减栈中把值取到寄存器Push 压栈 Push {r0-r12, lr} 把寄存器的值放到慢递减栈中 Pop 出栈 Pop {r0-r12, lr} 从慢递减栈中把值取到寄存器 b 跳转B lable 跳到lable 处执行Bl 跳转并保存返回地址 Bl lable 保存下一条指令的地址到lr ,并跳转到lable 处执行 Bx 跳转(可切换状态)Bx r0跳转到r0所指的位置执行Clz 计算一个数值高位零的个数 Clz r0, r1计算r1中开头的零的个数,把计算结果放到r0 Qadd 饱和加法 Qadd r0, r0, r1 运算结果的饱和到[0x80000000,0x7fffffff]Qadd8 饱和8位加法 Qadd8 r0, r0, r1 r1和r2的每一个字节分别相加,饱和到[-2^7, 2^7-1] 注意:每一个操作数都是寄存器,不影响Q 位Qadd16 饱和16位加法 Qadd16 r0, r0, r1 r1和r2的每一个16位相加,饱和到[-2^15, 2^15-1] 注意:每一个操作数都是寄存器,不影响Q 位 Qsub 饱和减法Qsub r0, r0, r1 运算的结果饱和到[0x80000000,0x7fffffff]Qsub16 饱和16位减法 Qsub16 r0, r0, r1 r1和r2的每一个16位分别相减,饱和到[-2^15, 2^15-1] 注意:每一个操作数都是寄存器 ,不影响Q 位Qsub8 饱和8位减法 Qsub8 r0, r0, r1 r1和r2的每一个字节分别相减,饱和到[-2^7, 2^7-1] 注意:每一个操作数都是寄存器 ,不影响Q 位 Ssat有符号饱和Ssat r0, #sat, r11<=sat<=32把r1饱和到[-2^(sat-1), 2^(sat-1)-1],结果放到r0,如果饱和会置位Q注意:把r1饱和到sat 个位,饱和后符号不变 Ssat16 有符号16位饱和 Ssat16 r0, #sat, r11<=sat<=16把r1中的每一个16位饱和到[-2^(sat-1), 2^(sat-1)-1],结果放到r0,如果饱和会置位Q注意:把r1中的每一个16位饱和到sat 个位,饱和后符号不变 Usat 无符号饱和 Usat r0, #sat, r10<=sat<=31把r1饱和到[0, 2^sat-1],结果放到r0,如果饱和会置位Q 注意:负数饱和到0 Usat16 无符号16位饱和 Usat16 r0, #sat, r1usat16 r0,#sat,r1 0<=sat<=31把r1中的两个16位分别饱和到[0, 2^sat-1],结果放到r0,如果饱和会置位Q注意:负数饱和到0Rev大小端转换 Rev r0, r1把r1进行大小端转换,结果放到r0Rev16 16位大小端转换 Rev16 r0, r1 把r1的每个16位进行大小端转换,结果放到r0 Revsh 16位大小端转换并有符号扩展 Revsh r0, r1 把r1的低16位进行大小端转换,并扩展为一个32位的有符号数 Rbit 位反转 Rbit r0, r1 把r1进行位顺序翻转,结果放到r0 Uxtb16 无符号8位扩展16位 Uxtb16 r0,r1 把r1中的两个8位数无符号扩展为两个16位数,结果放到r0 Uxtb 无符号8位扩展32位 Uxtb8 r0,r1 把r1中的8位数无符号扩展为一个32位数,结果放到r0 Uxth 无符号16位扩展32位 Uxth r0,r1 把r1中的16位数无符号扩展为一个32位数,结果放到r0 Sxtb16 有符号8位扩展16位 Sxtb16 r0,r1 把r1中的两个8位数有符号扩展为两个16位数,结果放到r0 Sxtb 有符号8位扩展32位 Sxtb8 r0,r1 把r1中的8位数有符号扩展为一个32位数,结果放到r0 Sxth 有符号16位扩展32位 Sxth r0,r1 把r1中的16位数有符号扩展为一个32位数,结果放到r0注意:这里并不是arm 指令集的全部,只是arm 指令集中比较常用的指令,如想查看全部指令集,请到arm 官方网站自行下载:。
常用ARM指令集及汇编一、ARM处理器的寻址方式二、指令集学习(一)ARM指令集1.指令格式2.条件码3.ARM存储器访问指令1)LDR/ STR-加载/ 存储指令2)LDM/ STM-多寄存器加载/ 存储指令3)SWP-寄存器和存储器交换指令4.ARM数据处理指令1)数据传送指令a)MOV-数据传送指令b)MVN-数据非传送指令2)算术逻辑运算指令a)ADD-加法运算指令b)SUB-减法运算指令c)RSB-逆向减法指令d)ADC-带进位加法指令e)SBC-带进位减法指令f)RSC-带进位逆向减法指令g)AND-逻辑“与”h)ORR-逻辑“或”i)EOR-逻辑“异或”j)BIC-位清除指令3)比较指令a)CMP-比较指令b)CMN-负数比较指令c)TST-位测试指令d)TEQ-相等测试指令4)乘法指令a)MUL-32位乘法指令b)MLA-32位乘加指令c)UMULL-64位无符号乘法指令d)UMLAL-64位无符号乘加指令e)SMULL-64位有符号乘法指令f)SMLAL-64位有符号乘加指令5.ARM分支指令1)B-分支指令2)BL-带连接的分支指令3)BX-带状态切换的分支指令6.ARM协处理器指令1)CDP-协处理器数据操作指令2)LDC-协处理器数据读取指令3)STC-协处理器数据写入指令4)MCR-ARM处理器到协处理器的数据传送指令5)MRC-协处理器到ARM处理器的数据传送指令7.ARM杂项指令1)SWI-软中断指令2)MRS-读状态寄存器指令3)MSR-写状态寄存器指令8.ARM伪指令1)ADR-小范围的地址读取伪指令2)ADRL-中等范围的地址读取伪指令3)LDR-大范围的地址读取伪指令4)NOP-空操作伪指令(二)Thumb指令集1.Thumb指令集和ARM指令集的区别2.Thumb存储器访问指令1)LDR/ STR-加载/ 存储指令2)PUSH/ POP-寄存器入栈 / 出栈指令3)LDMIA/ STMIA-多寄存器加载/ 存储指令3.Thumb数据处理指令1)数据传送指令a)MOV-数据传送指令b)MVN-数据非传送指令c)NEG-数据取负指令2)算术逻辑运算指令a)ADD-加法运算指令b)SUB-减法运算指令c)ADC-带进位加法指令d)SBC-带进位减法指令e)MUL-乘法运算指令f)AND-逻辑“与”g)ORR-逻辑“或”h)EOR-逻辑“异或”i)BIC-位清除指令j)ASR-算术右移指令k)LSL-逻辑左移指令l)LSR-逻辑右移指令m)ROR-循环右移指令3)比较指令a)CMP-比较指令b)CMN-负数比较指令c)TST-位测试指令4.Thumb分支指令1)B-分支指令2)BL-带连接的分支指令3)BX-带状态切换的分支指令5.Thumb杂项指令1)SWI-软中断指令6.Thumb伪指令1)ADR-小范围的地址读取伪指令2)LDR-大范围的地址读取伪指令3)NOP-空操作伪指令。
ARM 中常⽤的汇编指令1 处理器内部数据传输指令MSR & MRS⽤于在状态寄存器和通⽤寄存器之间传送数据MRS: 状态寄存器到通⽤寄存器的传送指令。
({R0-R12} <== CPSR,SPSR)MSR: 通⽤寄存器到状态寄存器的传送指令。
MRS:(CPSR,SPSR==>{R0-R12})MOVMOV 指令⽤于将数据从⼀个寄存器拷贝到另外⼀个寄存器,或者将⼀个⽴即数传递到寄存器⾥⾯,使⽤⽰例如下:2 存储器访问指令ARM 不能直接访问存储器,⽐如 RAM 中的数据,⼀般先将要配置的值写⼊到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx 中的数据写⼊到寄存器中。
指令描述LDR Rd, [Rn , #offset]从存储器 Rn+offset 的位置读取数据存放到 Rd 中STR Rd, [Rn, #offset]将 Rd 中的数据写⼊到存储器中的 Rn+offset 位置LDR 指令LDR 主要⽤于从存储加载数据到寄存器 Rx 中, LDR 也可以将⼀个⽴即数加载到寄存器 Rx中, LDR 加载⽴即数的时候要使⽤“=”,⽽不是“#”。
在嵌⼊式开发中, LDR 最常⽤的就是读取 CPU 的寄存器值。
上述代码就是读取寄存器中的值,读取到的寄存器值保存在 R1 寄存器中,上⾯代码中 offset 是 0,也就是没有⽤到 offset。
STR 指令LDR 是从存储器读取数据, STR 就是将数据写⼊到存储器中LDR 和 STR 都是按照字进⾏读取和写⼊的,也就是操作的 32 位数据,如果要按照字节、半字进⾏操作的话可以在指令“LDR”后⾯加上B 或 H,⽐如按字节操作的指令就是 LDRB 和STRB,按半字操作的指令就是 LDRH 和 STRH。
MRS R0, CPSR @ 将特殊寄存器 CPSR ⾥⾯的数据传递给 R0,即R0=CPSR1MSR CPSR , R0 @ 将 R0 中的数据复制到 CPSR 中,即 CPSR =R01MOV R0, R1 @ 将寄存器 R1 中的数据传递给 R0,即 R0=R1MOV R0, #0X12 @ 将⽴即数 0X12 传递给 R0 寄存器,即 R0=0X1212LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, [R0] @ 读取地址 0X0209C004 中的数据到 R1 寄存器中12LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, =0X20000002 @ R1 保存要写⼊到寄存器的值,即R1=0X20000002STR R1, [R0] @ 将 R1 中的值写⼊到 R0 中所保存的地址中1233 压栈和出栈指令我们通常会在 A 函数中调⽤ B 函数,当 B 函数执⾏完以后再回到 A 函数继续执⾏。
常用arm指令集ARM指令集是一种广泛使用的指令集架构,被广泛应用于各种嵌入式系统、移动设备和服务器等领域。
它具有高效、灵活、可扩展等特点,是现代计算机体系结构的重要组成部分。
本文将介绍常用的ARM指令集。
一、ARM指令集概述ARM指令集是一种精简指令集(RISC)架构,它采用了精简的指令集来提高执行效率和降低功耗。
由于其精简化的设计,ARM处理器可以在更小的面积内实现更高的性能和更低的功耗。
目前,ARM处理器已经广泛应用于各种嵌入式系统、移动设备和服务器等领域。
二、常用ARM指令集1.数据处理指令数据处理指令是最基本和最常用的ARM指令之一。
它包括加法、减法、乘法、除法等运算操作。
这些操作不涉及内存访问,只对寄存器中的数据进行操作。
例如:ADD R1, R2, R3:将R2和R3中的值相加,并将结果存储到R1中。
SUB R1, R2, #10:将R2中的值减去10,并将结果存储到R1中。
MUL R1, R2, R3:将R2和R3中的值相乘,并将结果存储到R1中。
2.数据传输指令数据传输指令是用于在寄存器和内存之间传输数据的指令。
它包括从内存读取数据、向内存写入数据等操作。
例如:LDR R1, [R2]:从地址为R2的内存单元中读取一个字节的数据,并将其存储到寄存器R1中。
STR R1, [R2]:将寄存器R1中的值写入地址为R2的内存单元中。
3.分支指令分支指令用于实现程序跳转,包括无条件跳转、有条件跳转等操作。
它是实现程序控制流程的关键指令之一。
例如:B label:无条件跳转到标记为label的位置。
BEQ label:如果前一次比较结果为相等,则跳转到标记为label的位置。
4.逻辑运算指令逻辑运算指令用于实现与、或、非、异或等逻辑运算操作。
它通常用于实现位操作和掩码操作等功能。
例如:AND R1, R2, #0xFF:将寄存器R2和0xFF进行按位与操作,并将结果存储到寄存器R1中。
ORR R1, R2, #0xFF:将寄存器R2和0xFF进行按位或操作,并将结果存储到寄存器R1中。
1、智能物联网工程师群,免费共享100G学习资料2、3、qq群号码:5384355434、5、欢迎大家加入交流经验,互相学习分享6、cortex-A8 中只有CP14和CP15 两种协处理器。
CP14用来测试(test),CP15用作系统控制.7、cortex-A8中协处理器CP15是协助处理器做管理工作,属于A8内部。
8、cortex-A8的通用寄存器和状态寄存器属于A8内部的32位存储器。
9、跳转指令BL只能实现前后32M的小范围的跳转,使用“LDR PC,..”伪指令可以实现大范围的跳转。
大范围4G10、汇编中用#注释(F)。
@ 错误,是@符号注释11、根据ATPCS标准,子程序间通过寄存器R0、R1、R2、R3来传递参数,如果参数多余4个,则多出的部分用堆栈传递,返回值用R0传递。
12、寄存器R13用作数据栈指针,记作SP。
13、寄存器R14称为链接寄存器,记作LR,它用于保存子程序的返回地址。
14、寄存器R15是程序计数器,记作PC,不能用作其它用途。
15、汇编的优点是效率高,体积小。
(对)16、S5PV210内部对模块的管理是分区域管理的,分为那几个区域()、()、()。
不清楚答案,查询得知,S5PV210由ARM内核、系统外围设备、存储器子系统、多媒体加速、电源管理、连接性模块等模块组成,p4217、S5PV210内部有三条总线,他们是APB总线,频率100兆以下、AHB总线,200-100兆、AXI总线。
18、S5PV210的AHB总线的工作频率范围是200M~100M。
19、S5PV210的APB总线的工作频率范围是100M以下。
20、CortexA8的工作频率高达(1GHZ),定时器的PLCK的值是(66MHZ)。
21、S5PV210内部有( 5 )个定时器,其中有PWM引脚的有定时器(T0 T1 T2T3 ),有死区功能的有定时器(T0 T1 )。
22、占空比就是输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比。
嵌入式常用指令
嵌入式系统是指集成了微处理器或微控制器的硬件系统,应用广泛于各种电子设备中。
在嵌入式系统中,常用的指令有许多种类,包括基本指令、扩展指令、特殊指令等。
以下是一些常用的嵌入式指令: 1. MOV指令:将数据从一个寄存器或内存复制到另一个寄存器或内存。
2. ADD指令:将两个数值相加并将结果存储到一个寄存器或内存。
3. SUB指令:将两个数值相减并将结果存储到一个寄存器或内存。
4. CMP指令:比较两个数值,不进行运算,只更新标志寄存器。
5. JMP指令:跳转到指定的地址。
6. CALL指令:跳转到一个子程序,并将返回地址存储到堆栈中。
7. RET指令:从子程序返回,将返回地址从堆栈中弹出。
8. NOP指令:空操作,不进行任何操作。
9. AND指令:按位与操作,将两个操作数进行逻辑与操作。
10. OR指令:按位或操作,将两个操作数进行逻辑或操作。
以上指令是嵌入式系统中常用的指令,对于嵌入式系统的程序设计和调试有着重要的作用。
在实际应用中,还会用到其他指令,如移位指令、旋转指令、字节交换指令、字节拆分指令等。
因此,了解嵌入式系统的指令是嵌入式工程师必备的技能之一。
- 1 -。
arm 汇编指令ARM汇编指令是一种用于编写ARM处理器程序的语言。
ARM处理器广泛应用于嵌入式系统和移动设备等领域。
ARM汇编指令与x86汇编指令有所不同,它基于RISC(精简指令集计算机)架构。
下面是一些基本的ARM汇编指令:1. 数据传输指令:用于在寄存器之间传输数据。
例如:- mov:将数据从一个寄存器传输到另一个寄存器。
- ldr:将数据从内存传输到寄存器。
2. 算术指令:用于执行加法、减法、乘法和除法等操作。
例如:- add:加法操作。
- sub:减法操作。
- mull:乘法操作。
- div:除法操作。
3. 逻辑指令:用于执行逻辑操作,如与、或、非等。
例如:- and:与操作。
- or:或操作。
- xor:异或操作。
4. 移位指令:用于对数据进行左移、右移或无符号右移。
例如:- lsr:无符号右移。
- asr:带符号右移。
- ror:循环右移。
5. 比较指令:用于比较两个寄存器的值。
例如:- cmp:比较两个寄存器的值,若相等则返回0,否则返回1。
6. 跳转指令:用于改变程序的执行流程。
例如:- b:条件跳转。
- bl:无条件跳转。
- bx:带状态跳转。
7. 循环指令:用于实现循环操作。
例如:- loop:内部循环。
- ldp:外部循环。
8. 调用指令:用于实现函数调用。
例如:- blx:带状态调用。
- bx:不带状态调用。
9. 系统调用指令:用于实现与操作系统交互的功能。
例如:- swi:执行系统调用。
10. 存储器访问指令:用于访问内存数据。
例如:- str:将数据存储到内存。
- ldr:从内存中加载数据。
以上仅为ARM汇编指令的一部分,实际上,ARM汇编指令还有很多其他功能。
为了更好地理解和使用ARM汇编指令,可以参考相关的教程和手册,并进行实际操作。
常用Arm汇编伪指令
在Arm汇编语言程序中,有一些特殊指令用于对汇编过程进行控制,这些指令不是可执行指令也没有对应的机器码,只用于汇编过程中为汇编程序提供汇编信息,这些指令称为伪指令,它们所完成的操作称为伪操作。
常用的伪指令有以下几种:符号定义伪指令、数据定义伪指令、汇编控制伪指令、信息报告伪指令以及杂项伪指令。
下面列出了上述几种常用的Arm汇编伪指令。
1. 符号定义伪指令
符号定义伪指令用于定义汇编程序中的变量、对变量赋值以及定义寄存器别名等操作。
表2.1 符号定义伪指令
2. 数据定义伪指令
数据定义伪指令一般用于为特定的数据分配存储单元,并可对分配的存储单元进行初始化。
表2.2 数据定义伪指令
3. 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程。
表2.3 汇编控制伪指令
4. 信息报告伪指令
报告伪指令用于汇编报告指示。
表2.4 信息报告伪指令
5. 杂项伪指令
杂项伪指令是未包含在表2.1至2.4中且在汇编程序设计中常用的伪指令。
表2_5 杂项伪指令。
在讲指令之前,先简单地介绍一下Cortex-M3 中支持的算术与逻辑标志。
本书在后面还会展开论述。
它们是:APSR 中的5 个标志位4.2.1 分类指令表表4.2 16位数据操作指令表4.3 16位转移指令IT If-Then表4.4 16位存储器数据传送指令16 数据传送指令没有任何新内容,因为它们是Thumb 指令,在v4T 时就已经定格了——译注表4.5 其它16位指令表4.6 32位数据操作指令UXTH 半字被无符号扩展到32 位(高16 位清0——译注)表4.7 32位存储器数据传送指令表4.8 32位转移指令表4.9 其它32位指令4.2.2 未支持的指令有若干条Thumb 指令没有得到Cortex-M3 的支持,下表列出了未被支持的指令,以及不支持的原因。
表4.10 因为不再是传统的架构,导致有些指令已失去意义未支持的指令以前的功能BLX #im 在使用立即数做操作数时,BLX 总是要切入ARM 状态。
因为Cortex-M3 只在Thumb 态下运行,故以此指令为代表的,凡是试图切入ARM 态的操作,都将引发一个用法fault。
SETEND由ARMv6 引入的,在运行时改变处理器端设置的指令(大端或小端)。
因为Cortex-M3 不支持动态端的功能,所以此指令也将引发faultCM3 也不支持有少量在ARMv7-M 中列出的指令。
比如,ARMv7M 支持Thumb2 的协处理器指令,但是CM3 却不能挂协处理器。
表4.11 列出了这些与协处理器相关的指令。
如果试图执行它们,则将引发用法fault(NVIC 中的NOCP (No CoProcessor)标志置位)。
表4.11 不支持的协处理器相关指令未支持的指令以前的功能MCR 把通用寄存器的值传送到协处理器的寄存器中MCR2把通用寄存器的值传送到协处理器的寄存器中MCRR 把通用寄存器的值传送到协处理器的寄存器中,一次操作两个MRC把协处理器寄存器的值传送到通用寄存器中MRC2 把协处理器寄存器的值传送到通用寄存器中MRRC把协处理器寄存器的值传送到通用寄存器中,一次操作两个LDC 把某个连续地址空间中的一串数值传送至协处理器中STC从协处理器中传送一串数值到地址连续的一段地址空间中还有一个是改变处理器状态指令(CPS),它的一些用法也不再支持。
常用数据处理指令表
助记符意义效果例1 例2
SUB 减Rd = Rn - Op2 SUB R2, R1, #240 ;R2=R1--#240 SUB R2, R1, R3 RSB 反向减Rd = Op2 – Rn SUB R2, R1, #240 ;R2=#240-- R1 SUB R2, R1, R3 ADD 加Rd = Rn + Op2 ADD R0, R0, #1 ADD R3, R2, R1 ADC 带进位加Rd = Rn + Op2 + C ADDS R4,R0,R2;加低32位ADC R5,R1,R3;加高32位SBC 带进位减Rd = Rn - Op2 + C -1 SUBS R4,R0,R2 ;减低32位SBC R5,R1,R3;减高32位RSC 反向带进位减Rd = Op2 - Rn + C -1
AND 逻辑位与Rd = Rn AND Op2 AND R9, R2, #1
ORR 逻辑位或Rd = Rn OR Op2 ORR R9, R2, #1
EOR 逻辑位异或Rd = Rn EOR Op2
BIC 位清零Rd = Rn AND NOT Op2
MOV 传送Rd = Op2 MOV R9, R2
MVN 求反Rd = NOT Op2
CMP 比较根据Rn - Op2设置条件码CMP R1, #120 ;R1--#120 结果丢弃,更新标志位CMN 负数比较根据Rn + Op2设置条件码除结果丢弃外,与ADDS相同,上面的CMP与SUBS相同
TST (位)测试根据Rn AND Op2设置条件
码结果丢弃,更新标志位
除结果丢弃外,分别与ANDS、EORS相同
TEQ (异或)测试相等根据Rn EOR Op2设置条件
MUL 乘(32位结果) Rd=Rm*Rs [31:0]
MLA 乘-累加(32位结果) Rd=Rm*Rs+Rn [31:0] MLA R4, R3, R2, R1 ;R4=R3*R2+R1 UMULL 无符号数长乘RdHi:RdLo= Rm*Rs
UMLAL 无符号数长乘-累加RdHi:RdLo+= Rm*Rs
SMULL 有符号数长乘RdHi:RdLo= Rm*Rs
SMLAL 有符号数长乘-累加RdHi:RdLo+= Rm*Rs
器。