ARM的汇编指令讲解
arm汇编逻辑指令 -回复
arm汇编逻辑指令-回复ARM汇编逻辑指令ARM汇编逻辑指令是一种基于RISC(Reduced Instruction Set Computing)的指令集架构,在数字电子设备中被广泛使用。
逻辑指令主要用于实现基本的逻辑操作,例如布尔运算、比较和分支跳转等。
本文将深入探讨ARM汇编逻辑指令的各个方面,包括指令格式、操作数和指令示例等。
一、指令格式ARM汇编逻辑指令的指令格式通常包括操作码、目标寄存器和操作数等字段。
下面是一个典型的ARM汇编逻辑指令的格式:<操作码>{xx}{cond} <目标寄存器>, <操作数1>, <操作数2>其中,操作码用于指定具体的逻辑操作,xx字段用于指定操作的类型(例如AND、OR或XOR等),cond字段用于指定条件执行的条件码,目标寄存器用于存储运算结果,操作数1和操作数2分别是参与运算的操作数。
二、操作数ARM汇编逻辑指令的操作数可以是寄存器或立即数。
寄存器是存储在CPU内部的高速存储器单元,用于存储临时数据。
ARM架构通常提供了16个通用寄存器(R0-R15),其中R0-R7用于存储一般性目的数据,R8-R15用于存储特殊用途数据。
立即数是直接写在指令中的常数值,通常用于表示较小的数据。
立即数的宽度取决于具体的指令和操作码。
例如,对于AND指令,立即数可以是8位或32位的。
三、指令示例以下是一些常见的ARM汇编逻辑指令示例:1. AND指令AND指令用于将两个操作数逐位进行与运算,并将结果存储在目标寄存器中。
例如,下面的指令将执行R1 = R2 AND 3:AND R1, R2, 32. OR指令OR指令用于将两个操作数逐位进行或运算,并将结果存储在目标寄存器中。
例如,下面的指令将执行R1 = R2 OR R3:ORR R1, R2, R33. XOR指令XOR指令用于将两个操作数逐位进行异或运算,并将结果存储在目标寄存器中。
ARM中常用的汇编指令
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常用汇编指令介绍
b 跳转指令(跳转范围为32Mb)
bl 带返回地址的跳转,指令自动将下一条指令的地址复制到R14 寄存器,然后跳转到指定地址去执行,执行完后返回到下一条指令处执行
pc 寄存器R15,程序计数器指向当前执行的程序地址
lr 寄存器R14,链接寄存器保存程序跳转时的返回地址
ldr 从内存中读取数据加载到寄存器中
str 将寄存器中的数据保存到内存
mov 寄存器与寄存器之间的数据传送指令,也可以将立即数传给目标寄存器add 加法指令
sub 减法指令
bic 位清除指令
orr 逻辑或运算指令。
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汇编指令简介1.ARM汇编指令基本概念2.ARM汇编指令分类三、乘法指令在ARM汇编中的表示1.立即数乘法指令2.寄存器乘法指令3.内存乘法指令四、乘法指令的执行过程1.立即数乘法指令执行过程2.寄存器乘法指令执行过程3.内存乘法指令执行过程五、乘法指令的应用实例1.立即数乘法实例2.寄存器乘法实例3.内存乘法实例六、总结正文:一、引言在ARM汇编语言中,乘法指令是用于实现两个数相乘的指令。
了解乘法指令的表示和执行过程,以及其在实际编程中的应用,对于掌握ARM汇编语言至关重要。
二、ARM汇编指令简介1.ARM汇编指令基本概念ARM汇编指令是一种低级编程语言,用于控制ARM处理器执行各种操作。
它与机器码一一对应,通过汇编器将汇编指令转换成机器码,供处理器执行。
2.ARM汇编指令分类ARM汇编指令主要分为四类:数据传送指令、算术指令、逻辑指令和程序控制指令。
其中,乘法指令属于算术指令。
三、乘法指令在ARM汇编中的表示1.立即数乘法指令立即数乘法指令用于实现一个立即数与一个寄存器或内存单元相乘。
在ARM汇编中,立即数乘法指令用“`MOV`”指令表示,例如:```MOV r0, #5 ; r0 = r0 * 5```2.寄存器乘法指令寄存器乘法指令用于实现两个寄存器相乘。
在ARM汇编中,寄存器乘法指令用“`MUL`”指令表示,例如:```MUL r1, r2 ; r0 = r1 * r2```3.内存乘法指令内存乘法指令用于实现一个寄存器与一个内存单元相乘。
在ARM汇编中,内存乘法指令用“`MOV`”和“`MUL`”指令组合表示,例如:```MOV r0, [r1] ; r0 = *r1MUL r2, r0 ; r0 = r0 * r2```四、乘法指令的执行过程1.立即数乘法指令执行过程立即数乘法指令的执行过程较为简单,汇编器在编译时会直接将立即数与寄存器或内存单元相乘,并将结果存回原寄存器或内存单元。
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)是指令的第二个操作数,可以是立即数、寄存器的偏移值、寄存器的移位值等。
常用的ARM汇编指令
常⽤的ARM汇编指令转⾃:https:///zb861359/article/details/81027021?utm_source=app1、 IMPORT和EXPORTIMPORT ,定义表⽰这是⼀个外部变量的标号,不是在本程序定义的EXPORT ,表⽰本程序⾥⾯⽤到的变量提供给其他模块调⽤的。
以上两个在汇编和C语⾔混合编程的时候⽤到。
2、AREA语法格式:AREA 段名属性1 ,属性2 ,……AREA伪指令⽤于定义⼀个代码段或数据段。
其中,段名若以数字开头,则该段名需⽤“|”括起来,如:|1_test|。
属性字段表⽰该代码段(或数据段)的相关属性,多个属性⽤逗号分隔。
常⽤的属性如下:— CODE 属性:⽤于定义代码段,默认为READONLY 。
— DATA 属性:⽤于定义数据段,默认为READWRITE 。
— READONLY 属性:指定本段为只读,代码段默认为READONLY 。
— READWRITE 属性:指定本段为可读可写,数据段的默认属性为READWRITE 。
— ALIGN 属性:使⽤⽅式为ALIGN表达式。
在默认时,ELF(可执⾏连接⽂件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐⽅式为2表达式次⽅。
— COMMON 属性:该属性定义⼀个通⽤的段,不包含任何的⽤户代码和数据。
各源⽂件中同名的COMMON段共享同⼀段存储单元。
⼀个汇编语⾔程序⾄少要包含⼀个段,当程序太长时,也可以将程序分为多个代码段和数据段。
使⽤⽰例:AREA Init ,CODE ,READONLY ; 该伪指令定义了⼀个代码段,段名为Init ,属性为只读。
3、LDR、LDRB、LDRHARM微处理器⽀持加载/存储指令⽤于在寄存器和存储器之间传送数据,加载指令⽤于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。
常⽤的加载存储指令如下:— LDR 字数据加载指令— LDRB 字节数据加载指令— LDRH 半字数据加载指令1) LDR指令有两种⽤法:a、ldr加载指令LDR指令的格式为:LDR{条件} ⽬的寄存器,<存储器地址>LDR指令⽤亍从存储器中将⼀个32位的字数据传送到⽬的寄存器中。
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 模式。
ARM指令集详解--汇编
ARM指令集详解--汇编1. 汇编1.1. 通⽤通⽤寄存器37个寄存器,31个通⽤寄存器,6个状态寄存器,R13指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的低8位,也就是控制位CPSR有4个8位区域:标志域(F)、状态域(S)、扩展域(X)、控制域(C)MSR - Load specified fields of the CPSR or SPSR with an immediate constant, orfrom the contents of a general-purpose register. Syntax: MSR{cond} _, #immed_8rMSR{cond} _, Rm where: cond is an optional condition code. is either CPSR orSPSR. specifies the field or fields to be moved. can be one or more of: ccontrol field mask byte (PSR[7:0]) x extension field mask byte (PSR[15:8]) sstatus field mask byte (PSR[23:16) f flags field mask byte (PSR[31:24]).immed_8r is an expression evaluating to a numeric constant. The constant mustcorrespond to an 8-bit pattern rotated by an even number of bits within a32-bit word. Rm is the source register.C 控制域屏蔽字节(psr[7:0])X 扩展域屏蔽字节(psr[15:8])S 状态域屏蔽字节(psr[23:16])F 标志域屏蔽字节(psr[31:24])CPSR寄存器FIQ和IRQ的区别?MODE(以下为⼆进制)10000⽤户模式PC,CPSR,R0~R1410001FIQ PC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R7~R010010IRQ PC,CPSR,SPSR_irq,R14_irq~R13_irq,R12~R010011管理模式(svc)PC,CPSR,SPSR_svc,R14_svc~R13_svc,R12~R010111终⽌模式PC,CPSR,SPSR_abt,R14_abt~R13_abt,R12~R011011未定义PC,CPSR,SPSR_und,R14_und~R13_und,R2~R011111系统模式(sys)PC,CPSR,R14 ~R01.2. 指令格式1) 基本格式<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,⽽{<cond>}为指令执⾏条件,是可选的,如果不写则使⽤默认条件AL(⽆条件执⾏)。
arm 汇编 位操作
ARM 汇编语言提供了丰富的位操作指令,这些指令可以在位级别上操作数据,从而实现各种位运算和位操作功能。
以下是一些常用的ARM 汇编位操作指令:1. AND 指令:该指令将两个操作数的相应位进行逻辑与操作,并将结果存储在目标寄存器中。
例如:```AND r0, r1, r2 ; 将r1 和r2 的相应位进行逻辑与操作,并将结果存储在r0 中```2. EOR 指令:该指令将两个操作数的相应位进行逻辑异或操作,并将结果存储在目标寄存器中。
例如:```EOR r0, r1, r2 ; 将r1 和r2 的相应位进行逻辑异或操作,并将结果存储在r0 中```3. ORR 指令:该指令将两个操作数的相应位进行逻辑或操作,并将结果存储在目标寄存器中。
例如:```ORR r0, r1, r2 ; 将r1 和r2 的相应位进行逻辑或操作,并将结果存储在r0 中```4. BIC 指令:该指令将目标寄存器的相应位清零,其他位保持不变。
例如:```BIC r0, r1, r2 ; 将r1 的相应位清零,其他位保持不变,并将结果存储在r0 中```5. MVN 指令:该指令将目标寄存器的相应位取反,其他位保持不变。
例如:```MVN r0, r1 ; 将r1 的相应位取反,其他位保持不变,并将结果存储在r0 中```这些是ARM 汇编语言中常用的位操作指令,它们可以帮助您在汇编语言中进行高效的位运算和位操作。
请注意,这些指令的用法可能会因ARM 架构版本和具体的处理器型号而有所不同。
因此,在实际应用中,建议查阅相关ARM 架构文档以了解更详细的信息。
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(Advanced RISC Machines)汇编指令集。
本文将从小白角度出发,向读者介绍ARM汇编指令集的基本概念和入门知识。
1. ARM汇编简介ARM汇编指令集是一种低级程序设计语言,用于在ARM微处理器上进行编程。
它不同于高级语言如C++或Java,具有较为底层的特性。
掌握ARM汇编指令集可以让开发者更深入地理解计算机内部运行原理,并能进行更加灵活和高效的编程。
2. ARM寄存器ARM汇编指令集使用一组寄存器来存储和处理数据。
其中,常用的寄存器有13个通用寄存器(R0-R12)、程序计数器(PC)、堆栈指针(SP)和链接寄存器(LR),另外还有一些特殊用途的寄存器。
这些寄存器提供了一种基于寄存器的计算模型,使得ARM汇编具有高效处理数据的能力。
3. 指令格式ARM汇编指令集的指令格式一般包括操作码和操作数。
操作码表示具体的操作,如加法、乘法等,而操作数则指定操作所需的寄存器和立即数等。
4. 数据处理指令ARM汇编指令集提供了一系列的数据处理指令,用于对寄存器中的数据进行处理。
这些指令包括基本的算术运算、逻辑运算以及移位操作等,可以实现各种数据处理需求。
5. 分支指令分支指令是ARM汇编指令集中常用的一类指令,用于根据条件进行跳转。
跳转指令可以在程序执行过程中改变程序执行的顺序,实现条件判断和循环等功能。
6. 存储器访问指令存储器访问指令用于在ARM汇编中对内存进行读写操作。
通过这些指令,可以将数据从寄存器中存储到内存中,或者将内存中的数据加载到寄存器中进行处理。
7. 输入输出指令输入输出指令用于实现与外部设备的交互。
例如,通过输入指令可以从键盘或其他输入设备中获取用户输入的数据,而通过输出指令可以将数据输出到显示器或其他输出设备中。
8. 常用例程ARM汇编指令集中有一些常用的例程,可以用于处理常见的编程任务。
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-汇编指令集(总结)ARM汇编指令集指令、伪指令(汇编)指令:是机器码的助记符,经过汇编器编译后,由CPU执⾏。
(汇编)伪指令:⽤来指导指令执⾏,是汇编器的产物,最终不会⽣成机器码。
有两种不同风格的ARM指令1).ARM官⽅的ARM汇编风格:指令⼀般⽤⼤写,Windows中的IDE开发环境。
2).GNU风格的ARM汇编:指令⼀般⽤⼩写。
ARM汇编的特点1. LDR/STR架构1).ARM采⽤RISC架构,CPU本⾝不能直接读取内存,⽽需要先将内存中内容加载⼊CPU中通⽤寄存器中才能被CPU处理。
2).ldr(load register)指令将内存内容加载⼊通⽤寄存器。
3).str(store register)指令将寄存器内容存⼊内存空间中。
4).ldr/str组合⽤来实现 ARM CPU和内存数据交换。
2. ⾄此8种寻址⽅式1).寄存器寻址mov r1, r2。
2).⽴即(⽴即数)寻址 mov r0, #0xFF00。
3).寄存器移位寻址 mov r0, r1, lsl #3。
4).寄存器间接寻址 ldr r1, [r2] 表⽰内存,内存地址存在r2这个寄存器中,把内存地址⾥的值给r1。
5).基址变址寻址ldr r1, [r2, #4]内存地址在r2+4⾥⾯。
6).多寄存器寻址 ldmia r1!, {r2-r7, r12}⼀次访问多个寄存器。
7).堆栈寻址 stmfd sp!, {r2-r7, lr}。
8).相对寻址 beq flag。
3. 指令后缀同⼀指令经常附带不同后缀,变成不同的指令。
经常使⽤的后缀有:B(byte)功能不变,操作长度变为8位H(half word)功能不变,长度变为16位S(signed)功能不变,操作数变为有符号如 ldr ldrb ldrh ldrsb ldrshS(S标志)功能不变,影响CPSR标志位如 mov和movs movs r0, #04. 条件执⾏后缀条件后缀是否成⽴取决于当前代码的前⾯的代码。
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指令格式
• ARM指令集——第2个操作数
<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}
灵活的使用第2个操作数“operand2”能够提高代码效率。
它有如下的形式:
▪Rm——寄存器方式;
如:SUB R1,R1,R2
▪Rm,shift——寄存器移位方式;
ARM指令种类
存储器访问指令
➢ARM处理器是典型的RISC处理器,对存储器的访问 只能使用加载和存储指令实现。对外围IO、程序数据 的访问均要通过加载/存储指令进行。 ➢存储器访问指令分为单寄存器操作指令和多寄存器操 作指令。 ➢所有单寄存器加载/存储指令可分为“字和无符号字 节加载存储指令”和“半字和有符号字节加载存储指 令。 ➢一条指令处理多寄存器的的加载/存储。
个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:
LDMIA
R1!,{R2-R4,R6}
;将R1指向的单元中的数据读出到R2~R4,R6中
• 相对寻址
相对寻址是基址寻址的一种变通。由程序计数器
PC提供基准地址,指令中的地址码字段作为偏移量,两者
相加后得到的地址即为操作数的有效地址。
BL
SUBR1
四种类型的堆栈方式:满递增、空递增、满递减、空递减
ARM指令格式
ARM指令的基本格式如下:
<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}
其中<>号内的项是必须的,{}号内的项是可选的。 各项的说明如下:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编知识点的要求:
1、能看的懂
2、可以做修改
3、不需要用汇编直接编写程序
汇编代码的应用场合:
1、ARM的启动代码必须要汇编,如:uboot最开始初始化硬件的代码
2、内核在最开始初始化的位置。
一、ARM汇编指令的编码格式
1、编码格式
ARM汇编指令编译成机器码以后,机器码的长度是32bits,这32bits的编码有一个固定的格式。
不同ARM 汇编指令,编码格式不同。
2、举例
C:
if(a==10)
a++;
else
a--;
汇编1:
CMP R0, #10;
ADDEQ R0,R0,#1
SUBNE R0,R0,#1
汇编2
SUBS R1, R0, #10; //S ---运算的结果会影响条件码标志位:CPSR:NZCV
ADDEQ R0,R0,#1
SUBNE R0,R0,#1
提示:
空指令NOP,实际上是占用CPU的时间,但是执行后,没有什么意义。
NOP ---- MOV R0,R0
3、条件码标识
10 -10
Z = 1
C = 0
N = 0
V = 0
=================================================================================
二、ARM的寻址方式
1、立即数寻址
操作数,有立即数。
ADD R0,R0,#1
MOV R1,#10
ORR R1,R1,#0xf @ R1=R1 | 0xf
BIC R1,R1,#0xf @R1 = R1&(~(0xf))
错误:
ADD R1,#1,#2
注意:立即数合法的条件
在ARM汇编指令中,并不是所有的立即数,立即数是有一定的限制的。
什么样的立即数是合法的???
1、如果一个立即数是小于256的(即该立即数是8bits以内的,0~255),该立即数是合法的。
2、如果一个立即数是大于等于256,该立即数经过循环左移偶数位,可以得到一个小于256的数,则该立即数合法。
256 = 0x100 ------→左移20位0x10000000----→左移4 0x1 合法
0x111 非法
0x102 非法
0x104 合法
0xfff
0xff00
0x12000
0x450000
0xab
原因:
在数据处理指令编码的时候,立即数用12bits来表示:
高4bits:循环左移左移偶数位除以2
低8bits:循环左移后的结果。
重要问题:
ADD R1,R0,#0xffff 非法
解决:
LDR R2,=0xffff // R2=0xffff,将立即数0xffff的值传送给R2
ADD R1, R0, R2
2、寄存器寻址
所有的操作数都是寄存器,没有立即数
ADD R0,R0,R1
MOV R1,R0
ORR R1,R1,R0 @ R1=R1 | 0xf
BIC R1,R1,R0 @R1 = R1&(~(0xf))
3、寄存器间接寻址
本质上,相当于C语言的指针
问题:读取0x30008000地址下的内容,该内容是int型的???
C:
int a;
a = *(int *)0x30008000
汇编:
LDR R0,=0x30008000
LDR R1,[R0] //LDR = loader,数据加载指令,加载一个地址下的内容
STR R2,[R1] //STR---store,数据存储指令,将一个数据存放到一个地址下。
错误的写法:
LDR R1, [0x30008000]
注意:间接寻址的地址需要存放到一个通用寄存器中,然后在使用。
4、寄存器的偏移寻址
MOV R0, R2,LSL #3 //LSL—逻辑左移。
R0 = R2<<3
ADD R0,R1,R2,LSL #4 //R0 = R1 + (R2<<4)
SUB R0, R1, R2,LSL R3 //R0= R1- (R2<<R3)
5、基址变址寻址
是一个间接寻址的变形,地址是由基地址和偏移量组成的
1)先变址
LDR R0, [R1, #4] //将R1+4作为新地址,将新的地址下的内容加载给R0
2)后变址
LDR R0, [R1],#4 //先将R1地址下的内容加载给R0,然后R1=R1+4
3)自动变址
LDR R0, [R1, #4]! //!---》自动变址,将R1+4作为新地址,将新的地址下的内容加载给R0;然后R1=R1+4
6、栈的寻址
栈有四种寻址方式
对栈的操作:
STM --→多个STR,一次可以完成多个数据的存储LDM--→多个LDR,一次可以完成多个数据的加载例:
在操作满递减栈的时候:
出栈:LDMFD
入栈:STMFD
7、相对寻址
BL delay
B loop
三、ARM的汇编指令
1、跳转指令(B)---分支指令branch
B :单纯的跳转
BL :跳转的同时保存返回地址
BX :带状态切换的跳转
BLX:带状态切换的跳转,并保存返回地址
注意:受跳转指令编码格式的限制,跳转的范围是-32MB~32MB。
例:
BL delay //delay与跳转指令的不能超过32MB
注意,如果跳转的范围超过32MB,使用:
LDR PC, =delay
2、数据处理指令
需要注意:
立即数合法的要求
1)传送指令
mov R1,R0
mov R2,#10
mvn R3,#10 //将10取反,然后再传给R3
2)算术逻辑运算指令
ADD R1,R2,R0 //R1=R2+R0
SUB R2,R1,#10 //R2 = R1 -10
ORR R1,R1,#0xf // 将R1的低四位置1,其它位保持不变
BIC R2,R2,#0xf //将R2的低四位清0,其它位保持不变AND R3,R3,#0xf //保留R3的低四位,其它位都清0
EOR R4,R4,#10 // R4 =R4^10
3)比较指令
CMP R0, #10 //R0-10,然后根据运算的结果自动影响标志位CMN R0, #10 //R0+10,然后根据运算的结果自动影响标志位
TST R0, #8 // R0 & 8,然后根据运算的结果自动影响标志位
TEQ R0, #8 // R0 ^ 8,然后根据运算的结果自动影响标志位
3、乘法指令和乘加指令
MUL R3,R2,#10 //R3=R2*10
MLA R2,R1, R0, #10 //R2=R1*R0 + 10
4、存储器访问指令
根据存储器的地址访问该地址下的内容:
LDR R1,[R0] //R0—存储器的地址
STR R2,[R0]
STMFD SP!, {R0-R8,LR}
LDMFD SP!, {R0-R8,PC}
SWP R2, R1, [R0] //通用寄存器和存储器之间的字类型数据交换相当于:
LDR R2, [R0]
STR R1, [R0]
5、协处理器指令
在ARM内核中,有一个协处理器(CP15),协处理器有16个寄存器C0~C15,我们对协处理器中寄存器进行访问的时候,使用的是协处理器指令,不能使用ARM汇编指令。
协处理器的作用:设置MMU、设置cache、读取芯片的ID,设置ARM的大小端格式
6、软件中断指令
SWI :ARM ---linux的系统调用
7、通用寄存器和状态寄存器的访问指令
MRS :将S(status register)move 到R(register)中
MSR
例:
MRS R0,CPSR
BIC R0,R0,#0x80
MSR CPSR,R0
上面程序的目的:将CPSR[7]清0,将所有的IRQ中断都打开。
四、ARM汇编伪指令
1、什么是伪指令
伪指令并不是真正的ARM汇编指令,当我遇到一些应用的时候,这些应用的场景并不能使用汇编指令实现,所以提出伪指令的概念。
伪指令相当于汇编指令的序列,一条伪指令在编译的时候,会被编译成一条或几条汇编指令。
伪指令相当于C语言的小函数。
2、LDR
1)ARM汇编指令
加载某地址上的数据。
如:LDR R2,[R0]
2)ARM汇编伪指令
(1)传输不能使用mov来传递的立即数
MOV R1,#0xffff //非法
替代:
LDR R1,=0xffff
(2)获取一个标示符的地址,大范围的
BL delay //当delay与BL delay指令,距离超过了32MB,跳不过去
替代:
LDR PC,=delay //范围在4GB内
3、NOP
是一个空指令,相当于MOV R0,R0 ,占用CPU的执行时间,没有作用。
nop指令占用的时间:(1/MIPS)us
如:MIPS = 998 ---- (1/998) us
4、ADR
小范围的地址读取指令,-1020 ~ 1020。