ARM3_汇编指令
arm32汇编指令手册简要
ARM32汇编指令手册简要:掌握ARM32汇编指令,轻松开发嵌入式系统在嵌入式系统开发中,ARM32汇编指令是必不可少的一部分。
ARM32汇编指令手册简要提供了ARM32汇编指令的基础知识和常用指令的详细介绍,帮助开发人员更好地掌握ARM32汇编指令,从而轻松开发嵌入式系统。
ARM32汇编指令是一种低级语言,它是由CPU直接执行的指令。
掌握ARM32汇编指令对于嵌入式系统开发人员来说非常重要。
了解ARM32汇编指令的基本结构和语法是必要的。
ARM32汇编指令的基本结构包括指令助记符、寄存器、操作数和注释。
指令助记符是指令的名称,寄存器是用来存储数据的地方,操作数是指令的参数,注释是对指令的解释说明。
ARM32汇编指令手册简要中还介绍了一些常用的指令,如MOV、ADD、SUB、CMP、B、BL等。
这些指令涵盖了ARM32汇编指令的大部分功能。
MOV指令可以将一个寄存器的值传递给另一个寄存器;ADD和SUB指令可以进行加法和减法运算;CMP指令可以比较两个值的大小;B和BL指令可以进行跳转操作。
掌握这些指令可以帮助开发人员更好地编写ARM32汇编程序。
除了介绍基本结构和常用指令外,ARM32汇编指令手册简要还介绍了一些高级指令,如LDR、STR、LDM、STM、SWI等。
这些指令可以让开发人员更加灵活地操作内存和系统调用。
例如,LDR和STR指令可以读取和写入内存中的数据;LDM和STM指令可以一次性读取或写入多个寄存器的值;SWI指令可以进行系统调用。
掌握这些高级指令可以让开发人员更加高效地编写ARM32汇编程序。
ARM32汇编指令手册简要提供了ARM32汇编指令的基础知识和常用指令的详细介绍,帮助开发人员更好地掌握ARM32汇编指令,从而轻松开发嵌入式系统。
掌握ARM32汇编指令不仅可以提高开发效率,还可以让开发人员更好地理解计算机底层原理,更加深入地了解嵌入式系统的工作原理。
ARM32汇编指令是嵌入式系统开发中必不可少的一部分。
ARM汇编指令列表
CPSR位[31:24]为条件位域,用f表示;位[23:16]为状态位域,用s表示;位[15:8] 为扩展位域,用x表示;位[7:0] 为控制位域,用c表示;与指令MSR相关关于移位中断向量表Load and Store指令LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] !;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址 R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址 R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器 R0,并将R0的高24 位清零。
LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将 R0的高24位清零。
LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器 R0,并将R0的高16位清零。
LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0 的高16位清零。
LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将 R0的高16位清零。
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
2-3、ARM汇编指令
ARM寻址方式
• 基址寻址
R6 0x04 0x?? 0x04 0x4000000C 0x4000000C 0xAA R4 0x03 0x?? 0x03 0x40000008 基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加, 将R3+0x0C作 形成操作数的有效地址。基址寻址用于访问基址附近的存储单元, R3 0x02 0x?? R3 0x400000000x40000004 0x02 为地址装载数 常用于查表、数组操作、功能部件寄存器访问等。 0x40000000 R2 0x01 0x?? R2 0xAA 0x55 0x01 据 LDR R2,[R3,#0x0C];读取R3+0x0C地址上的存储单元的内容放入R2 存储器 R1 0x40000000 0x40000010 STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存;到保存到R0指 LDR R2,[R3,#0x0C] 定的存储单元 LDMIA R1!,{R2-R4,R6}
if(a > b)
else
a++;
b++;
对应的汇编代码:
CMPRBiblioteka ,R1;R0与R1比较 ADDHI R0,R0,#1
;若R0>R1,则R0=R0+1
ADDLS R1,R1,#1 ;若R0≤R1,则R1=R1+1
1110 1111
AL NV
任何 任何
无条件执行 (指令默认条件) 从不执行(不要使用)
ARM指令格式
使用条件码"cond"可 以实现高效的逻辑操作, 提高代码效率 C代码:
操作码 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 条件助记符 EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE 标志 Z=1 Z=0 C=1 C=0 N=1 N=0 V=1 V=0 C=1,Z=0 C=0,Z=1 N=V N!=V Z=0,N=V Z=1,N!=V 相等 不相等 无符号数大于或等于 无符号数小于 负数 正数或零 溢出 没有溢出 无符号数大于 无符号数小于或等于 有符号数大于或等于 有符号数小于 有符号数大于 有符号数小于或等于 含义
ARM汇编指令集
ARM汇编指令集汇编指令集的介绍,包括指令和伪指令。
指令和概念指令指令指的是CPU机器指令的助记符,是由CPU的指令集提供的,经过编译之后,会以机器码的形式由CPU读取执⾏伪指令伪指令本质上不是指令,和CPU的机器指令没有任何关系,只是和指令⼀起写在代码中⽽已,是由环境提供的,其⽬的是⽤于指导编译过程,伪指令经过编译后不会⽣成⼆进制机器码,仅仅在编译阶段有效果指令编程风格ARM官⽅风格官⽅风格指令⼀般使⽤⼤写,例如:LDR R0,[R1],Windows中常使⽤这种风格GUN Linux风格指令⼀般使⽤⼩写字母,例如:ldr r0,[r1],Linux环境中常⽤这种风格ARM汇编特点LDR/STR架构1. 采⽤RISC架构,CPU本⾝不能直接读取内存,⽽需要把内存中的数据加载到CPU的通⽤寄存器中,才能被CPU处理2. ldr(load register)将内存中的数据加载到通⽤寄存器3. str(store register)将寄存器内容存⼊内存空间4. ldr和str组合,可以实现ARM CPU和内存的数据交换8种寻址⽅式1. 寄存器寻址:move r1,r2:把r2的值赋值到r1寄存器中2. ⽴即寻址:move r0,#0xFF00:把⽴即数0xFF00赋值给r0寄存器3. 寄存器移位寻址:move r0,r1,lsl #3:把r1左移三位(*8)之后的值赋值给r0寄存器4. 寄存器间接寻址:ldr r1,[r2]:寄存器有中括号,表⽰内存地址对应的数据,所以这⾥r2表⽰⼀个内存地址,[]表⽰取r2指针对应的数据,这句代码的意思是把r2对应的内存中的数据赋值给r15. 基址变址寻址:ldr r1,[r2,#4]:将指针r2的值(内存地址)+4之后指向的数据赋值给r16. 多寄存器寻址:ldmia r1!,{r2 - r7,r12}:这种情况下,r1是⼀个指针,⾥边存放的内存地址,然后以r1⾥边的内存地址为基地址,向后以此加1得到{}⾥的寄存器数量个内存地址,然后将刚才得到的这些内存地址指向的变量的值赋值给{}⾥的对应位置的寄存器,类似从内存中读取数组,然后把数组的元素依次赋值给这些寄存器7. 堆栈寻址:stmfd sp!,{r2 - r7,lr}:和多寄存器类似,区别是将栈SP中连续访问{}数量个字节,然后依次赋值给{}⾥的寄存器8. 相对寻址:beq flag::flag:标号⽤于标记标号后⾯那句指令的地址,常⽤来表⽰⼊⼝点,函数名就是⼀个标号,C语⾔中的goto就可以跳转到⼀个标号,在ARM汇编中⽤指令b flag:就可以跳转到flag:对应的标号处执⾏,和beq flag:是⼀样的,其原理是相对于PC程序位置寄存器做⼀个偏移指令后缀1. ARM中的指令可以带后缀,从⽽丰富该指令的功能,这种形式叫做指令族,常⽤的后缀有:2. B(byte):功能不变,操作长度变为8位(依赖CPU位数,以下相同)3. H(Halfword):功能不变,操作长度变为16位3. H(Halfword):功能不变,操作长度变为16位4. S(signed):功能不变,操作数变为有符号数5. S(S标识):影响CPSR⾥的NZCV标识位,6. 举例:1. ldr指令族:ldrb,ldrh,ldrsb ldrsh,从内存中加载指定长度的数据2. mov指令族:movs r0,#0,结果是0,赋值会影响CPSR的NZCV标识,将Z位置为1条件执⾏后缀1. 条件执⾏后缀⽤于限制该执⾏执⾏的,只有在符合条件之后才能够执⾏该指令2.3. 举例:moveq r0,r1,如果eq成⽴,执⾏mov r0,r1,不成⽴则该条不执⾏,和C语⾔中的条件判断类似4. 条件后缀成⽴与否,不是取决于本条指令,⽽是取决于之前指令运⾏后的结果5. 条件后缀决定了本条指令是否执⾏,不会影响之前和之后指令6. 条件后缀和CPSR的NZCV位相关,例如,如果上⼀句代码执⾏的结果将Z置为1,下⼀句带有eq条件后缀的语句就会被执⾏多级指令流⽔线1. 多级流⽔线⽤于增加处理器处理指令的速度,2. 允许CPU同时异步的执⾏多条指令,⽽⾮上⼀条指令全部执⾏完毕之后才会执⾏下⼀条指令3. 多级可以简单那理解为把⼀条指令分为多个步骤来异步执⾏,例如:1. CPU把⼀条指令分为[取址,解码,执⾏]3个步骤,则为3级指令流⽔线2. 第⼀条指令进⾏取值操作3. 第⼀条指令取值完毕,进⼊解码操作,第⼆条指令紧随其后就开始执⾏取值操作4. 第⼀条指令解码完毕,进⼊执⾏操作,第⼆条指令紧接着进⼊解码操作,同时第三条指令进⼊取值操作5. 第⼀条指令执⾏完毕,第⼆条指令进⼊执⾏操作,第三条指令进⼊解码操作,第四条指令进⼊取值操作,依次类推4. 可见,多级流⽔线可以提⾼同时执⾏指令的数量,从⽽加速指令执⾏5. 需要注意的是,PC指向的是正在取值的指令,⽽⾮正在执⾏的指令,之间的差值就是流⽔线级数和单字节长度的乘积,在中断返回到PC的时候需要注意这个问题ARM指令数据处理指令数据传输指令mov:move,在两个寄存器之间或者⽴即数和寄存器之间传递数据,将后⼀个寄存器上的值或者⽴即数赋值给前⼀个寄存器 例如:mov r1,r0mov r1,#0xFF:将⽴即数0xFF赋值给寄存器r1mvn:和mov⽤法⼀致,区别是mvn会把后⼀个寄存器的值或者⽴即数按位取反后赋值给前⼀个寄存器 例如:mvn r0,#0xFF,则r0的值为0xffffff00(32位数据)算术运算指令add:加法运算sub:减法运算rsb:反减运算adc: 带进位的加法运算sbc: 带进位的减法运算rsc:带进位的反减指令逻辑指令and:与操作orr:或操作eor:异或操作bic:位清除操作⽐较指令cmp:⽐较⼤⼩cmn:取反⽐较tst:按位与运算teq:按位异或运算乘法指令mvl: mla: umull: umlal: smull: smlal:前导0计数clz:统计⼀个数的⼆进制位前⾯有⼏个0CPSR访问指令mrs⽤于读取CPSR和SPSRmsr⽤于写CPSR和SPSRCPSR和SPSRCPSR是程序状态寄存器,整个Soc只有⼀个SPSR在五种异常模式下各有⼀个,⽤于从普通模式进⼊异常模式的时候,保存普通模式下的CPSR,在返回普通模式时可以恢复原来的CPSR跳转分⽀指令b指令: ⽆条件直接跳转,没打算返回bl指令:跳转前把返回地址放⼊lr中,以便返回,常⽤在函数中bx指令:跳转同时切换到ARM模式,⽤于异常处理的跳转内存访问指令ldr:加载指定内存地址的数据到寄存器,按照字节访问str:加载指定寄存器数据到内存地址中,按照字节访问ldm:和ldr功能⼀样,⼀次多字节多寄存器访问stm:和str功能⼀样,⼀次多字节多寄存器访问swp:内存和寄存器互换指令,⼀边读⼀边写,例如:swp r1,r2,[r0]:读取指针r0的数据到r1中,同时把r2的数据赋值给r0指针指向的变量软中断指令swi(software interrupt),在软件层模拟产⽣⼀个中断,这个中断会传送给CPU,常⽤于实现系统调⽤⽴即数⾮法与合法ARM指令都是32为,除了指令标记和操作标记外,只能附带少位数的⽴即数,所以有⾮法与合法之分⾮法⽴即数:合法⽴即数:经过任意位数的移位后,⾮0部分可以⽤8位表⽰就是合法⽴即数协处理器与指令协处理器协处理器属于Soc中另外⼀颗核⼼,⽤于协助主CPU实现某些功能,被主CPU调⽤来执⾏任务,协处理器和MMU,Cache,TLB有功能和管理上的联系ARM设计可以⽀持多达16个协处理器,但是⼀般只实现其中的CP15协处理器指令mrc:读取CP15中的寄存器mcr:向CP15中的寄存器写数据指令⽤法:mcr{<”cond”>} p15,<”opcode_1”>,<”Rd”>,<”Crn”>,<”Crm”>,{<”opcode_2”>} opcode_1:对于CP15永远为0Rd:ARM通⽤寄存器Crn:CP15寄存器,取值范围c0~c15Crm:CP15寄存器,⼀般为c0opcode_2:省略或者为0ldm,stm和栈ldm,stmldr与str只能访问4个字节,当数据较⼤的时候,就会明显的降低效率,这时就需要使⽤到ldm和stm,ldm与stm是⼤量的从寄存器与内存交换数据的⽅式,常⽤于在内存和寄存器之间⼤量读取和写⼊数据:stmia sp {r0 - r12}:stm表⽰进⾏批量数据操作,ia的意思是将r0存⼊SP的内存地址处,然后SP内存地址+4(32位),将r1存⼊该地址,内存地址再+4,存⼊r2,依次存到r12,这就是⼀个寄存器和内存交换⼤量数据的⽰例,在⼀个周期内完成了多个内存地址和多个寄存器的操作。
arm 汇编 指令
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汇编指令格式ARM汇编语言是一种底层程序设计语言,用于直接操控ARM处理器的指令和寄存器。
ARM汇编指令格式是编写ARM汇编程序的基础,本文将一步一步详细解答与ARM汇编指令格式相关的问题。
第一部分:ARM汇编基础在深入理解ARM汇编指令格式之前,我们需要先了解一些基本概念。
ARM 处理器是英国公司ARM Holdings开发的一种低功耗、高性能的处理器体系架构,广泛应用于移动设备、嵌入式系统等领域。
ARM汇编语言是ARM 处理器的机器码的可读形式,用于编写底层程序。
在ARM汇编语言中,指令以二进制形式表示,通常以助记符的形式出现。
每条指令占用一个或多个字(通常一个字等于4个字节),按字节编址。
第二部分:指令格式详解ARM处理器的指令格式包括指令助记符、操作数和操作码等部分。
ARM 汇编指令格式的一般形式如下:[label:] mnemonic{cond}{S} Rd, Rn, Operand2其中,[label:]为可选项,表示标号,用于在程序中跳转或引用;mnemonic为指令的助记符,用于表示具体的操作;{cond}为可选项,表示条件代码,用于指定是否执行指令;{S}为可选项,表示是否更新条件代码;Rd表示目标操作数的寄存器;Rn表示源操作数的寄存器;Operand2为第二个操作数。
指令助记符(mnemonic)代表具体的指令功能,例如ADD表示加法、MOV表示数据传输等。
条件代码(cond)用于指定是否执行指令,常用的条件代码有EQ(等于)、NE(不等于)、GT(大于)等。
这样,我们可以根据需要选择是否在特定条件下执行指令。
更新条件代码(S)表示执行指令后是否更新条件代码寄存器。
如果设置了该标志位,则根据指令的结果设置条件代码寄存器。
目标操作数(Rd)是指令的结果存储的寄存器,源操作数(Rn)是参与指令计算的寄存器。
操作数(Operand2)是指令的第二个操作数,可以是立即数、寄存器的偏移值、寄存器的移位值等。
3.ARM汇编指令集
(2)算术指令: ADD ADC SUB SBC RSB RSC
逻辑指令: AND ORR EOR BIC
比较指令: CMP CMN TST TEQ
数据搬移: MOV MVN
(3)加法指令 ADD R1,R2,R3 @ R1=R2+R3
64位乘法: MULL R0, R1, R2, R3 @{R1:R0}=R2*R3
【6】分支指令(偏移,跳转)
(1)指令格式
B{<cond>} label
BL{<cond>} subroutine_label
(2) b -- 无返回的跳转 -- c语言的goto
【1】测试一:
(1)mov r0,#16
mov r0,r1,ASR #4
MUL r1,r2,#3
mvn r0,r0 @r0=~r0
add r0,r0,#1
RSB R0,R0,#0 @R0 = 0-R0
比如:(1)0x1122
(2)0x8000007F
01 0001 0010 0010
0000 0000 0000 0000 0000 | 0111 1111 10| 00
用伪指令:
ldr r1,#0x1122
数据传输指令 MOV R1,R2 @ R1=R2
取反传送指令 MVN R1,R2 @ R1= ~R2
【2】乘法指令
32位乘法: MUL R1,R2,R3 @R1=R2*R3
mov r3,r1,LSL #2 @r3=r1*4=4
【8】立即数
(1)立即数:就是满足一定规则的数。
这个数可以用一个8位的数循环右移0--30之间的偶数位形成。
ARM汇编指令列表
ARM汇编伪指令ARM条件码CPSR位[31:24]为条件位域,用f表示;位[23:16]为状态位域,用s表示;位[15:8] 为扩展位域,用x表示;位[7:0] 为控制位域,用c表示;与指令MSR相关关于移位中断向量表APCS寄存器使用约定Load and Store指令LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2] !;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址 R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址 R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器 R0,并将R0的高24 位清零。
LDRB R0,[R1,#8] ;将存储器地址为R1+8的字节数据读入寄存器R0,并将 R0的高24位清零。
LDRH R0,[R1] ;将存储器地址为R1的半字数据读入寄存器 R0,并将R0的高16位清零。
LDRH R0,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R0,并将R0 的高16位清零。
LDRH R0,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R0,并将 R0的高16位清零。
arm 汇编指令
arm 汇编指令一、arm 汇编简介1.1 什么是 arm 汇编1.2 arm 汇编的应用领域1.3 arm 汇编与高级语言的对比二、arm 汇编基础2.1 寄存器2.1.1 通用寄存器2.1.2 特殊寄存器2.2 数据传输指令2.2.1 加载指令2.2.2 存储指令2.3 算术指令2.3.1 加法指令2.3.2 减法指令三、arm 汇编进阶3.1 分支指令3.1.1 无条件分支3.1.2 有条件分支3.2 比较指令3.2.1 比较指令的作用3.2.2 比较指令的使用方法3.3 位操作指令3.3.1 与操作3.3.2 或操作3.3.3 异或操作四、arm 汇编优化技巧4.1 减少存取操作4.2 使用预处理器4.3 循环展开4.4 减少分支操作4.5 使用内联汇编五、arm 汇编的应用案例5.1 arm 汇编在嵌入式系统中的应用5.2 arm 汇编在图形处理中的应用5.3 arm 汇编在操作系统中的应用六、总结6.1 arm 汇编的优势和不足6.2 arm 汇编的未来发展6.3 arm 汇编学习的建议arm 汇编指令一、arm 汇编简介1.1 什么是 arm 汇编arm 汇编是一种底层的编程语言,用于直接操作处理器的指令集。
它与高级语言相比更接近机器语言,能够更加精细地控制硬件资源。
arm 汇编通常用于需要对性能和资源进行高度优化的场景,如嵌入式系统开发、驱动程序编写和底层图形处理等。
1.2 arm 汇编的应用领域arm 汇编广泛应用于各种领域,包括嵌入式系统、移动设备、游戏开发、图形处理、操作系统等。
由于 arm 汇编的高效性和精确性,它能够在这些领域中发挥重要作用。
例如,在嵌入式系统中,arm 汇编可以直接访问硬件资源,提供更高的执行效率和更低的资源消耗。
1.3 arm 汇编与高级语言的对比arm 汇编与高级语言相比有着明显的区别。
在高级语言中,程序员不需要关注底层的机器细节,只需要编写抽象的代码即可。
ARM中的汇编指令
ARM中的汇编指令BIC:ARM 指令,对某些位,清零。
先取反再相与。
asm(“BIC r2, r2,#0x1f”); ##对R2 的低5 位清零。
ORR:ARM 指令,逻辑或asm(“ORR r2, r2, #0x10”); ##R2 逻辑与0x10。
MRS:asm(“MRS r2, CPSR”); ##将CPSR 的值加载到R2 中。
MSR:asm(“MSR CPSR, r2”); ##将R2 的值加载到CPSR 中。
asm(“ SWI 0x0”); ##跳转到软件中断函数,并转换为SVC 模式。
LDR:{条件}目的寄存器存储器寄存器。
将存储地址所指的4 个字节数据传送到寄存器,其中寻址方式会有很多种。
asm(“ldr r0,=0xddeeaabb”); ##在这里ldr 是一个伪指令,相当于move 指令。
asm(“ldr r0, [r1]”);##将存储器地址为r1 的一个字的数据加载到r0 中。
MRC 与MCR:在处理器寄存器与协处理器寄存器之间交换数据。
MRC {cond} coproc, opcode1, Rd, CRn, CRm {,opcode2}asm(“mrc p15,0,r0,c1,c1,0”); ##在CRn, CRm 均为c1, opcode 均为0 时,表示SCR(Secure Configuration Register),表示将c1 的值赋值给r0.asm(“mcr p15,0,r0,c1,c1,0”); ##将r0 的值赋值给c1.asm(“mcr p15,0,r0,c12,c0,0”);##将r0 的值赋值给c12,此时c12 表示VBAR,Vector Base Address Register,存放异常时的入口地址。
SMC:(Secure Monitor Call). asm(“SMC 0x0”);##将ARM core 切换到Trust Zone 模式。
ARM3_汇编指令
ARM3_汇编指令16位数据操作指令名字功能ADC 带进位加法(ADD with Carry)ADD 加法AND 按位与。
这里的按位与和C的”&”功能相同ASR 算术右移(Arithmetic Shift Right)BIC 按位清零(把一个数跟另一个无符号数的反码按位与)CMN 负向比较(把一个数跟另一个数据的二进制补码相比较)CMP 比较(Compare,比较两个数并且更新标志)CPY 把一个寄存器的值拷贝(COPY)到另一个寄存器中EOR 近位异或LSL 逻辑左移(Logic Shift Left)LSR 逻辑右移(Logic Shift Right)MOV 寄存器加载数据,既能用于寄存器间的传输,也能用于加载立即数MUL 乘法(Multiplication)MVN 加载一个数的NOT值(取到逻辑反的值)NEG 取二进制补码ORR 按位或ROR 循环右移SBC 带借位的减法SUB 减法(Subtraction)TST 测试(Test,执行按位与操作,并且根据结果更新Z)REV 在一个32位寄存器中反转(Reverse)字节序REVH 把一个32位寄存器分成两个(Half)16位数,在每个16位数中反转字节序REVSH 把一个32位寄存器的低16位半字进行字节反转,然后带符号扩展到32位SXTB 带符号(Signed)扩展一个字节(Byte)到32位SXTH 带符号(Signed)扩展一个半字(Half)到32位UXTB 无符号(Unsigned)扩展一个字节(Byte)到32位UXTH 无符号(Unsigned)扩展一个半字(Half)到32位16位转移指令名字功能B 无条件转移(Branch)B 有条件(Condition)转移BL 转移并连接(Link)。
用于呼叫一个子程序,返回地址被存储在LR中CBZ 比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)CBNZ 比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)IT If-Then16位存储器数据传送指令名字功能LDR 从存储器中加载(Load)字到一个寄存器(Register)中LDRH 从存储器中加载半(Half)字到一个寄存器中LDRB 从存储器中加载字节(Byte)到一个寄存器中LDRSH 从存储器中加载半字,再经过带符号扩展后存储一个寄存器中LDRSB 从存储器中加载字节,再经过带符号扩展后存储一个寄存器中STR 把一个寄存器按字存储(Store)到存储器中STRH 把一个寄存器存器的低半字存储到存储器中STRB 把一个寄存器的低字节存储到存储器中LDMIA 加载多个字,并且在加载后自增基址寄存器STMIA 存储多个字,并且在存储后自增基址寄存器PUSH 压入多个寄存器到栈中POP 从栈中弹出多个值到寄存器中其它16位指令名字功能SVC 系统服务调用(Service Call)BKPT 断点(Break Point)指令。
arm 32 常见汇编指令 对应的机器码
arm 32 常见汇编指令对应的机器码
ARM 32位汇编指令是一种用于ARM架构的低级编程语言,它将人类可读的汇编指令转换为机器码,从而实现对计算机硬件的直接控制。
以下是几个常见的ARM 32位汇编指令及其对应的机器码:
1. MOV指令:将一个数据从一个位置复制到另一个位置。
机器码:0xMOV Rd, Rn
2. ADD指令:将两个数据相加并将结果存储在目标寄存器中。
机器码:0xADD Rd, Rn, Rm
3. SUB指令:将两个数据相减并将结果存储在目标寄存器中。
机器码:0xSUB Rd, Rn, Rm
4. CMP指令:比较两个数据的大小,并根据比较结果设置条件代码。
机器码:0xCMP Rn, Rm
5. LDR指令:从内存中加载数据到寄存器中。
机器码:0xLDR Rd, [Rn, #offset]
6. STR指令:将寄存器中的数据存储到内存中。
机器码:0xSTR Rd, [Rn, #offset]
7. B指令:无条件跳转到指定的地址。
机器码:0xB label
8. BEQ指令:如果上一次比较结果为相等,则跳转到指定的地址。
机器码:0xBEQ label
以上是ARM 32位汇编指令的一些常见例子,每个指令都有对应的机器码。
通过编写汇编程序,程序员可以直接对计算机硬件进行控制,实现各种功能。
虽然汇编语言比高级语言更难以理解和编写,但它提供了更高的灵活性和效率,特别适合对性能要求较高的应用。
ARM汇编指令集详解
ARM汇编指令集一、跳转指令跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:Ⅰ.使用专门的跳转指令。
Ⅱ.直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:1、B指令B指令的格式为:B{条件} 目标地址B指令是最简单的跳转指令。
一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。
注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。
它是24 位有符号数,左移两位后有符号扩展为32 位,表示的有效偏移为26 位(前后32MB的地址空间)。
以下指令:B Label ;程序无条件跳转到标号Label处执行CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label 处执行BEQ Label2、BL指令BL指令的格式为:BL{条件} 目标地址BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。
该指令是实现子程序调用的一个基本但常用的手段。
以下指令:BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中3、BLX指令BLX指令的格式为:BLX 目标地址BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。
因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。
arm汇编指令 组成结构
arm汇编指令组成结构ARM汇编指令是一种低级程序设计语言,用于编写针对ARM架构的机器码指令。
ARM汇编指令由一系列操作码(opcode)和操作数(operand)组成,用于执行特定的计算和操作。
ARM汇编指令的基本组成结构如下:1. 操作码(Opcode):操作码是指令的核心部分,用于指定要执行的操作类型。
ARM指令集包含多种操作码,如数据处理、分支、加载/存储等。
2. 操作数(Operand):操作数是指令的操作对象,包括寄存器、立即数和内存地址等。
操作数用于指定要操作的数据和存储位置。
3. 寻址模式(Addressing Mode):寻址模式用于确定操作数的存储位置。
ARM架构支持多种寻址模式,如寄存器寻址、立即数寻址、基址寻址、间接寻址等。
4. 条件码(Condition Code):条件码用于指定指令的执行条件。
ARM指令集中的大多数指令都可以根据条件码来选择是否执行。
5. 注释(Comment):注释是对指令的解释和说明,用于提高代码的可读性和可维护性。
注释在汇编代码中以分号(;)开头,可以在指令后面或单独一行进行编写。
下面是一个示例,展示了一条ARM汇编指令的组成结构:```ADD r0, r1, r2 ; 将寄存器r1和r2中的值相加,结果存入r0寄存器```- 操作码:ADD,表示进行加法运算。
- 操作数:r0、r1和r2,分别表示寄存器的编号。
- 寻址模式:无,因为操作数直接使用寄存器。
- 条件码:无,表示无条件执行。
- 注释:"; 将寄存器r1和r2中的值相加,结果存入r0寄存器",用于解释指令的作用。
需要注意的是,ARM汇编指令的具体语法和操作码取决于所使用的ARM架构版本和指令集。
不同的ARM架构版本可能会有不同的指令集和指令格式。
因此,在编写ARM汇编代码时,需要参考相应的ARM架构手册或文档以获取准确的指令信息。
ARM汇编编程基础之三-基本寻址方式与基本指令
ARM汇编编程基础之三-基本寻址方式与基本指令
于寄存器(pc 和lr)。
这种寻址方式,在指令的32 位机器码中的地址码部分,存放的是寄存器(pc 和lr)的编号,故称之为寄存器寻址。
2、立即数寻址
MOV pc, #64 表示将常数64 放入寄存器pc,其中常数64 被称为立即数。
立即数寻址指令中的地址码部分就是操作数本身,也就是说,数据就包含在指令
当中,取出指令也就取出了可以立即使用的操作数(故称为立即数)。
这里,可能大家会看出一个问题:由于立即数是位于32 位机器码中的,而
32 位机器码中除了操作数外还有操作码,这就意味着不可能用全部32bit 来表
示立即数。
事实上,ARM 机器指令中,仅用了最低的12bit 来表示立即数。
那么我们自然推论立即数的范围是-20482047,这意味着MOV pc, #8192 这样的指令是非法的。
但事实情况并非如此,MOV pc,#8192 是合法且能正常运行的。
真实情况是,ARM 机器指令可以表示的立即数范围是-2--2-1,只不过它只能表示这其中的2。
arm cortex 3 汇编 stmia 指令
标题:深度解析ARM Cortex 3汇编指令中的STMIA指令在ARM Cortex 3汇编指令中,STMIA指令是一个非常重要的指令,它在数据存储和传输中起着至关重要的作用。
本文将对STMIA指令进行深度解析,从基本概念到实际应用进行探讨,帮助读者更深入地理解这一关键指令。
1. STMIA指令的基本概念在ARM Cortex 3架构中,STMIA指令用于将一组寄存器的内容一次性存储到内存中。
其中,STM代表Store Multiple,IA代表Increment After。
在实际应用中,STMIA指令通常与LDMIA指令配合使用,实现对一组寄存器内容的高效读写操作。
2. STMIA指令的具体应用在实际编程中,STMIA指令被广泛应用于嵌入式系统和实时操作系统中。
在嵌入式系统的中断处理过程中,需要将多个寄存器的状态保存到堆栈中,这时就可以使用STMIA指令来高效地完成这一操作。
STMIA指令还可以用于数据传输和上下文切换等场景。
3. STMIA指令的性能优化由于STMIA指令一次性将多个寄存器的内容存储到内存中,因此在性能优化方面有着独特的特点。
在实际应用中,可以通过合理选择存储器位置区域、对齐方式和存储顺序等手段,优化STMIA指令的执行效率,从而提升整体系统的性能。
4. 个人观点和理解作为一名嵌入式系统开发工程师,我深刻理解STMIA指令在ARM Cortex 3汇编指令集中的重要性。
在实际项目中,充分发挥STMIA指令的优势,可以极大地提升系统的稳定性和性能。
我建议开发人员在学习ARM汇编指令时,应当深入理解STMIA指令的原理和应用场景,以便更好地发挥其作用。
总结回顾通过本文对ARM Cortex 3汇编指令中的STMIA指令进行深度解析,我们不仅对其基本概念有了更深入的了解,还能够更好地应用于实际开发中。
在使用STMIA指令时,我们可以结合具体的应用场景和系统需求,进行性能优化,从而更好地发挥其作用。
arm常用汇编指令
arm常用汇编指令ARM的汇编指令是ARM处理器在运行时所执行的基本操作。
汇编指令是一种低级编程语言,它主要是为了直接操作硬件而设计的。
在ARM 汇编指令中,每个指令都是由一个操作码和一些操作数组成的。
操作码就是指令的类型,而操作数则是指令要操作的数据。
下面是一些常用的ARM汇编指令:1. mov指令mov指令是ARM汇编指令中最常用的指令之一。
它用来将一个数据从一个位置复制到另一个位置。
例如,下面的代码将寄存器r1中的值复制到寄存器r2中:mov r2, r12. add指令add指令用来将两个数相加并将结果存放在一个寄存器中。
例如,下面的代码将r1和r2中的值相加并将结果存放在r3中:add r3, r1, r23. sub指令sub指令用来将一个数从另一个数中减去并将结果存放在一个寄存器中。
例如,下面的代码将r2中的值从r1中减去并将结果存放在r3中:sub r3, r1, r24. cmp指令cmp指令用来比较两个数的大小。
它会将两个数相减,并将结果存放在一个特殊的寄存器中。
如果相减结果为0,表示两个数相等;如果结果为正数,表示第一个数大于第二个数;如果结果为负数,表示第一个数小于第二个数。
例如,下面的代码比较r1和r2的大小:cmp r1, r25. beq指令beq指令用来进行条件分支。
如果cmp指令的结果为0,则跳转到指定的地址。
例如,下面的代码如果r1等于r2,就跳到标号my_label处执行:beq my_label6. bne指令bne指令用来进行条件分支。
如果cmp指令的结果不为0,则跳转到指定的地址。
例如,下面的代码如果r1不等于r2,就跳到标号my_label处执行:bne my_label7. ldr指令ldr指令用来从内存中读取一个值并存放到寄存器中。
例如,下面的代码从内存地址0x100处读取一个值并存放到寄存器r1中:ldr r1, [0x100]8. str指令str指令用来将一个值存储到内存中。
常用ARM汇编指令
常⽤ARM汇编指令1、相对跳转指令:b, bl 区别在于bl指令除了跳转之外,还将返回地址(bl的下⼀条指令的地址)保存在lr寄存器中。
可跳转范围是当前指令的前后32MB。
2、数据发送指令mov,地址读取伪指令ldr mov指令: mov r1, r2 //r1=r2,把⼀个寄存器的值赋给另⼀个寄存器 mov r1,#358 //r1=4096, 把⼀个常数赋给寄存器 ldr伪指令:(第⼆个参数为“=”时表⽰伪指令,否则表⽰内存访问指令) ldr r1,=358 //把⼀个常数赋给寄存器3、内存访问指令:ldr、str、ldm、stm ldr指令从内存中读取数据到寄存器: ldr r1, [r2, #4] //将地址为r2+4的内存单元数据读取到r1中 ldr r1, [r2] //将地址r2内存中数据读取到r1中 ldr r1, [r2], #4 //将地址为r2的内存中的数据读取到r1中,然后r2=r2+4 str指令把寄存器的值存储到内存中: str r1, [r2, #4] //将r1的数据保存到地址为r2+4的内存单元中 str r1, [r2] //将r1的数据保存到地址r2的内存单元中 str r1, [r2], #4 //将r1的数据保存到r2的内存单元中,然后r2= r2+44、加减指令:add、sub add r1,r2,#1 //表⽰r1 = r2+1 sub r1,r2,#1 //表⽰r1 = r2-15、程序状态访问寄存器:msr、mrs ARM 有⼀个程序状态寄存器(cpsr),⽤来控制处理器的⼯作模式、设置中断的总开关 msr cpsr, r0 //复制r0到cpsr mrs r0,cpsr //复制cpsr到r06、其他汇编指令 .extern main .text .global _start _start: ".extern"定义⼀个外部符号(可以是变量也可以是函数) “.text”表⽰羡慕的语句都属于代码段 “.global”将本⽂件中的某个程序标号定义为全局的,如上表⽰将_start定义为全局函数。
3ARM指令及汇编程序设计共31页文档
常量
数字常量
十进制 12,5,876,0 十六进制 0xFF,0x1 N进制 n-XXX,2-010111
字符常量
布尔常量
段定义
AREA Hello,CODE,READONLY ENTRY START MOV R7,#10
MOV R6,#5 ADD R6,R6,R7 B END
(9)FILED 语法格式:标号 FIELD 表达式
4 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程, 常用的汇编控制伪指令包括以下几条: (1) IF、ELSE、ENDIF 语法格式: IF 逻辑表达式
指令序列 1
ELSE
指令序列 2
ENDIF
汇编控制伪指令(Cont.)
<>内的项是必须的
{}内的项是可选的
opcode 指令助记符,如LDR,STR等
cond 执行条件,如EQ,NE等
S 是否影响CPSR寄存器的值
Rd
目标寄存器
Rn
第一个操作数的寄存器
operand2 第二个操作数
第二个操作数
#immed_8r
常数表达式,必须是一个8位常数的偶数次循环移位 合法常量:0x3FC、0、0xF0000000、200、0xF0000001 非法常量:0x1FE、511、0xFFFF、0x1010、0xF0000010
数据常量定义伪指令
数据常量定义伪指令EQU用于为程序中的常量、 标号等定义一个等效的字符名称,类似于 C 语言 中的#define 。 EQU语法格式 : 名称 EQU 表达式 { ,类型 } ;其中 EQU 可用 “ * ” 代替。 名称为 EQU 伪指令定义的字符名称,当表达 式为 32 位的常量时,可以指定表达式的数据类 型,可以有以下三种类型: CODE16 、 CODE32 和 DATA 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16位数据操作指令
名字功能
ADC 带进位加法(ADD with Carry)
ADD 加法
AND 按位与。
这里的按位与和C的”&”功能相同
ASR 算术右移(Arithmetic Shift Right)
BIC 按位清零(把一个数跟另一个无符号数的反码按位与)
CMN 负向比较(把一个数跟另一个数据的二进制补码相比较)
CMP 比较(Compare,比较两个数并且更新标志)
CPY 把一个寄存器的值拷贝(COPY)到另一个寄存器中
EOR 近位异或
LSL 逻辑左移(Logic Shift Left)
LSR 逻辑右移(Logic Shift Right)
MOV 寄存器加载数据,既能用于寄存器间的传输,也能用于加载立即数
MUL 乘法(Multiplication)
MVN 加载一个数的NOT值(取到逻辑反的值)
NEG 取二进制补码
ORR 按位或
ROR 循环右移
SBC 带借位的减法
SUB 减法(Subtraction)
TST 测试(Test,执行按位与操作,并且根据结果更新Z)
REV 在一个32位寄存器中反转(Reverse)字节序
REVH 把一个32位寄存器分成两个(Half)16位数,在每个16位数中反转字节序REVSH 把一个32位寄存器的低16位半字进行字节反转,然后带符号扩展到32位SXTB 带符号(Signed)扩展一个字节(Byte)到32位
SXTH 带符号(Signed)扩展一个半字(Half)到32位
UXTB 无符号(Unsigned)扩展一个字节(Byte)到32位
UXTH 无符号(Unsigned)扩展一个半字(Half)到32位
16位转移指令
名字功能
B 无条件转移(Branch)
B<cond> 有条件(Condition)转移
BL 转移并连接(Link)。
用于呼叫一个子程序,返回地址被存储在LR中
CBZ 比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)
CBNZ 比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)
IT If-Then
16位存储器数据传送指令
名字功能
LDR 从存储器中加载(Load)字到一个寄存器(Register)中
LDRH 从存储器中加载半(Half)字到一个寄存器中
LDRB 从存储器中加载字节(Byte)到一个寄存器中
LDRSH 从存储器中加载半字,再经过带符号扩展后存储一个寄存器中
LDRSB 从存储器中加载字节,再经过带符号扩展后存储一个寄存器中
STR 把一个寄存器按字存储(Store)到存储器中
STRH 把一个寄存器存器的低半字存储到存储器中
STRB 把一个寄存器的低字节存储到存储器中
LDMIA 加载多个字,并且在加载后自增基址寄存器
STMIA 存储多个字,并且在存储后自增基址寄存器
PUSH 压入多个寄存器到栈中
POP 从栈中弹出多个值到寄存器中
其它16位指令
名字功能
SVC 系统服务调用(Service Call)
BKPT 断点(Break Point)指令。
如果调试被使能,则进入调试状态(停机)。
NOP 无操作(No Operation)
CPSIE 使能PRIMASK(CPSIE i)/FAULTMASK(CPSIE f)——清零相应的位CPSID 除能PRIMASK(CPSID i)/FAULTMASK(CPSID f)——置位相应的位
32位数据操作指令
名字功能
ADC 带进位加法
ADD 加法
ADDW 宽加法(可以加12 位立即数)
AND 按位与(原文是逻辑与,有误——译注)
ASR 算术右移
BIC 位清零(把一个数按位取反后,与另一个数逻辑与)
BFC 位段清零
BFI 位段插入
CMN 负向比较(把一个数和另一个数的二进制补码比较,并更新标志位)CMP 比较两个数并更新标志位
CLZ 计算前导零的数目
EOR 按位异或
LSL 逻辑左移
LSR 逻辑右移
MLA 乘加
MLS 乘减
MOVW 把16 位立即数放到寄存器的底16位,高16位清0
MOV 加载16位立即数到寄存器(其实汇编器会产生MOVW——译注)
MOVT 把16 位立即数放到寄存器的高16位,低16位不影响
MVN 移动一个数的补码
MUL 乘法
ORR 按位或(原文为逻辑或,有误——译注)
ORN 把源操作数按位取反后,再执行按位或(原文为逻辑或,有误——译注)
RBIT 位反转(把一个32 位整数先用2 进制表达,再旋转180度——译注)
REV 对一个32 位整数做按字节反转
REVH/REV16 对一个32 位整数的高低半字都执行字节反转
REVSH 对一个32 位整数的低半字执行字节反转,再带符号扩展成32位数
ROR 圆圈右移
RRX 带进位的逻辑右移一格(最高位用C 填充,且不影响C的值——译注)
SFBX 从一个32 位整数中提取任意的位段,并且带符号扩展成32 位整数
SDIV 带符号除法
SMLAL 带符号长乘加(两个带符号的32 位整数相乘得到64 位的带符号积,再把积加到另一个带符号64位整数中)
SMULL 带符号长乘法(两个带符号的32 位整数相乘得到64位的带符号积)
SSAT 带符号的饱和运算
SBC 带借位的减法
SUB 减法
SUBW 宽减法,可以减12 位立即数
SXTB 字节带符号扩展到32位数
TEQ 测试是否相等(对两个数执行异或,更新标志但不存储结果)
TST 测试(对两个数执行按位与,更新Z 标志但不存储结果)
UBFX 无符号位段提取
UDIV 无符号除法
UMLAL 无符号长乘加(两个无符号的32 位整数相乘得到64 位的无符号积,再把积加到另一个无符号64位整数中)
UMULL 无符号长乘法(两个无符号的32 位整数相乘得到64位的无符号积)
USAT 无符号饱和操作(但是源操作数是带符号的——译注)
UXTB 字节被无符号扩展到32 位(高24位清0——译注)
UXTH 半字被无符号扩展到32 位(高16位清0——译注)
32位存储器数据传送指令
名字功能
LDR 加载字到寄存器
LDRB 加载字节到寄存器
LDRH 加载半字到寄存器
LDRSH 加载半字到寄存器,再带符号扩展到32位
LDM 从一片连续的地址空间中加载多个字到若干寄存器
LDRD 从连续的地址空间加载双字(64 位整数)到2 个寄存器
STR 存储寄存器中的字
STRB 存储寄存器中的低字节
STRH 存储寄存器中的低半字
STM 存储若干寄存器中的字到一片连续的地址空间中
STRD 存储2 个寄存器组成的双字到连续的地址空间中
PUSH 把若干寄存器的值压入堆栈中
POP 从堆栈中弹出若干的寄存器的值
32位转移指令
名字功能
B 无条件转移
BL 转移并连接(呼叫子程序)
TBB 以字节为单位的查表转移。
从一个字节数组中选一个8位前向跳转地址并转移
TBH 以半字为单位的查表转移。
从一个半字数组中选一个16 位前向跳转的地址并转移其它32位指令
LDREX 加载字到寄存器,并且在内核中标明一段地址进入了互斥访问状态
LDREXH 加载半字到寄存器,并且在内核中标明一段地址进入了互斥访问状态LDREXB 加载字节到寄存器,并且在内核中标明一段地址进入了互斥访问状态
STREX 检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的字STREXH 检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的半字STREXB 检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的字节CLREX 在本地的处理上清除互斥访问状态的标记(先前由LDREX/LDREXH/LDREXB做的标记)
MRS 加载特殊功能寄存器的值到通用寄存器
MSR 存储通用寄存器的值到特殊功能寄存器
NOP 无操作
SEV 发送事件
WFE 休眠并且在发生事件时被唤醒
WFI 休眠并且在发生中断时被唤醒
ISB 指令同步隔离(与流水线和MPU等有关——译注)
DSB 数据同步隔离(与流水线、MPU 和cache等有关——译注)DMB 数据存储隔离(与流水线、MPU 和cache等有关——译注)。