ARM 常用 指令表 嵌入式 考试必备
arm常用指令
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处理器的寻址方式二、指令集学习(一)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中常用的汇编指令
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指令集概述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中。
ARM嵌入式期末考试题库精心整理版
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处理器广泛应用于嵌入式系统和移动设备等领域。
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汇编伪指令。
1. 符号定义伪指令
符号定义伪指令用于定义汇编程序中的变量、对变量赋值以及定义寄存器别名等操作。
表2.1 符号定义伪指令
2. 数据定义伪指令
数据定义伪指令一般用于为特定的数据分配存储单元,并可对分配的存储单元进行初始化。
表2.2 数据定义伪指令
3. 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程。
表2.3 汇编控制伪指令
4. 信息报告伪指令
报告伪指令用于汇编报告指示。
表2.4 信息报告伪指令
5. 杂项伪指令
杂项伪指令是未包含在表2.1至2.4中且在汇编程序设计中常用的伪指令。
表2_5 杂项伪指令。
实用ARM指令全
在讲指令之前,先简单地介绍一下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),它的一些用法也不再支持。
Arm常用指令
1、 内存访问指令 基本指令:
LDR:memory -> register (memory 包括 映射到内存空间的非通用寄存器)
STR:register -> memory
语法:
op{cond }{B}{T} Rd , [Rn ]
op{cond }{B} Rd , [Rn , FlexOffset ]{!}
;引用外部符号
EXPORT令定义程序
的开始
start
;此处定义了一个label
start
MOV r0, #10
MOV r1, #3
ADD r0, r0, r1
;r0 =r0 +r1
prog1
;此处定义了一个label
prog1
MOV r0, #0x18
;
7、 跳转指令 基本指令:
B:跳转 BL:跳转并将下一指令的地址存入 lr 寄存 器
语法:
op{cond} label label:要跳向的地址
例子:
loop1
~~~ b loop1
; 跳到地址 loop1 处
bl sub1
; 将下一指令地址写入 lr,并跳
至 sub1
~~~
sub1
~~~
mov pc, lr
op{cond }{B} Rd , label
op{cond }{B}{T} Rd , [Rn ],FlexOffset op:基本指令,如 LDR、STR cond:条件执行后缀 B:字节操作后缀 T:用户指令后缀 Rd:源寄存器,对于 LDR 指令,Rd 将保存从 memory 中读取的数值;对于 STR 指令,Rd 保存着将写入 memory 的数值 Rn:指针寄存器 FlexOffset:偏移量
arm指令
一、加减法指令:1、MOV(move):数据传送指令2、MVN(move negative):数据取反传送指令3、ADD(add):加法4、ADC(add with carry):带进位加法5、SUB(subtract):减法6、RSB(reverse subtract):反向减法7、SBC(subtract with carry):带借位的减法SBC{<cond>}{S} <Rd>,<Rn>,<op2> ;Rd=Rn-op2-carry8、RSC(reverse subtract with carry):带借位的反向减法RSC{<cond>}{S} <Rd>,<Rn>,<op3> ;Rd= op3-Rn-!carry二、逻辑指令1、AND:逻辑与2、ORR(logical or):逻辑或3、EOR(exclusive or):逻辑异或4、BIC(bit clear):位清零5、CLZ(count leading zeros):位计数。
CLZ{<cond>} <Rd>,<Rm>;计算存储在Rm寄存器中各位为0的总个数。
三、乘法指令1、MUL(multiply):32位乘法2、MLA(multiply accumulate):32位乘加MLA{<cond>} {S} <Rd>,<Rn>,<op2>,<op3>;3、SMULL(signed multiplication long):64位有符号数乘法SMULL {<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;Rdh Rdl=Rn×op2,结果的高32位存入Rdh,低32位存入Rdl。
嵌入式系统6(ARM指令详细介绍)
西安电子科技大学计算机学院
4
6.1.1 数据传送指令
MOV指令 MOV指令
MOV指令的格式为: MOV{条件 条件}{S} 目的寄存器, MOV{条件}{S} 目的寄存器,源操作数 MOV指令可完成从另一个寄存器、被移位的寄存器或将一 个立即数加载到目的寄存器。其中S选项决定指令的操作 是否影响CPSR中条件标志位的值,当没有S时指令不更新 CPSR中条件标志位的值。指令示例:
EOR R0,R0,#3
西安电子科技大学计算机学院
15
6.1.3 逻辑运算指令
BIC指令 BIC指令
BIC指令的格式为:
BIC{条件}{S} 目的寄存器,操作数1 操作数2 BIC{条件}{S} 目的寄存器,操作数1,操作数2 条件
BIC指令用于清除操作数1的某些位,并把结果 放置到目的寄存器中。操作数1应是一个寄存器, 操作数2可以是一个寄存器,被移位的寄存器, 或一个立即数。操作数2为32位的掩码,如果在 掩码中设置了某一位,则清除这一位。未设置 的掩码位保持不变。例如:
TST TST R1,#1 R1,#0xffe
西安电子科技大学计算机学院
19
6.1.5 测试指令
TEQ指令 TEQ指令
TEQ指令的格式为: TEQ{条件} 操作数1,操作数2 TEQ{条件} 操作数1 操作数2 条件 TEQ指令用于把一个寄存器的内容和另一个寄 存器的内容或立即数进行按位的异或运算, 并根据运算结果无条件更新CPSR中条件标志 位的值。该指令通常用于比较操作数1和操作 数2是否相等。例如:
常用arm指令集
常用ARM指令集一、ARM架构简介ARM(Advanced RISC Machine)是一种精简指令集计算机(Reduced Instruction Set Computer,RISC)架构,广泛应用于移动设备、嵌入式系统和主流服务器等领域。
ARM架构的优点包括高效能、高能效、低成本和高可伸缩性,适用于各种应用场景。
二、ARM指令集分类ARM指令集根据其特点和功能可以分为三大类:基本指令集、乘累加指令集和浮点指令集。
1. 基本指令集(ARM和Thumb指令集)基本指令集是ARM架构最基础的指令集,包含大部分常用的数据处理指令、控制指令和访存指令等。
ARM指令集的指令长度为32位。
Thumb指令集是ARM架构的一个变种,指令长度为16位。
Thumb指令集在ARMv4架构引入,用于提高代码密度,适用于存储空间有限的设备。
2. 乘累加指令集(ARM和Thumb-2指令集)乘累加指令集是基于基本指令集的扩展,加入了乘法和累加指令等。
乘累加指令集可以提高乘法和累加运算的效率,适用于需要大量复杂计算的应用。
Thumb-2指令集是Thumb指令集的进一步扩展,兼容Thumb指令集,并增加了32位指令。
Thumb-2指令集使得ARM架构在相同存储空间下能够提供更高的性能。
3. 浮点指令集(VFP和NEON指令集)浮点指令集主要用于进行浮点数运算。
VFP(Vector Floating Point)指令集是ARM架构最早引入的浮点技术,支持单精度和双精度浮点数运算。
NEON指令集是ARM架构后续引入的SIMD(Single Instruction, Multiple Data)指令集,用于提高并行处理能力和多媒体应用性能。
三、常用ARM指令以下是常用的ARM指令及其功能:1.数据处理指令–加法指令:ADD、ADC(带进位的加法指令)–减法指令:SUB、SBC(带借位的减法指令)–乘法指令:MUL、SMULL(有符号乘法指令)、UMULL(无符号乘法指令)–除法指令:SDIV(有符号除法指令)、UDIV(无符号除法指令)–移位指令:LSL(逻辑左移)、LSR(逻辑右移)、ASR(算术右移)、ROR(循环右移)2.控制指令–条件分支指令:B(无条件分支指令)、BEQ(等于零条件分支指令)、BNE(不等于零条件分支指令)等–无条件分支指令:BX(无条件跳转指令,用于实现函数调用)–跳转指令:BL(带链接跳转指令,用于实现函数调用,并将返回地址保存在链接寄存器中)3.访存指令–数据传送指令:LDR(加载指令,用于将数据从内存中加载到寄存器中)、STR(存储指令,用于将数据从寄存器中存储到内存中)–堆栈指令:PUSH(将数据压入堆栈)、POP(将数据从堆栈中弹出)–字节和半字操作指令:LDRB(加载字节指令)、LDRH(加载半字指令)、STRB(存储字节指令)、STRH(存储半字指令)4.特殊指令–中断指令:SWI(软中断指令,用于触发软件中断)–协处理器指令:CDP(协处理器数据处理指令)、MCR、MRC(协处理器寄存器传递指令)四、ARM指令优化技巧为了提高ARM指令执行效率和代码性能,可以采取以下优化技巧:1.使用适当的数据处理指令,避免不必要的指令执行和数据拷贝。
ARM常用指令
ARM常用指令ARM常用指令一、数据传送指令1、 mov指令格式: mov{}{s} Rd,op操作: Rd = op;2、 mvn指令格式: mvn{}{s} Rd,op操作: Rd = ~op;二、算术指令1、 add加法指令格式: add{}{s} Rd,Rn,op操作: Rd = Rn + op;2、 adc带进位加法指令格式: adc{}{s} Rd,Rn,op操作: Rd = Rn + op + C;3、 sub减法指令格式: sub{}{s} Rd,Rn,op操作:Rd = Rn - op;4、 sbc带借位减法指令格式: sbc{}{s} Rd,Rn,op操作: Rd = Rn - op - (~C);5、 rsb逆向减法指令格式: rsb{}{s} Rd,Rn,op操作: Rd = op - Rn;6、 rsc带借位的逆向减法指令格式: rsc{}{s} Rd,Rn,op操作: Rd = op - Rn - (~C);三、移位1、 op立即数: #number //#label寄存器: Rm寄存器移位: Rm,<移位符> #number 或 Rm,<移位符> Rs 举例: mov r0,#100 //r0 = 100mov r0,r1 //r0 = r1mov r0,r1,lsr #1 //r0 = r1 >> 1mov r0,r1,lsr r2 //r0 = r1 >> r2add r0,r1,r2,lsr #1 //r0 = r1 + r2 >> 12、移位符lsl 逻辑左移 (unsigned)x << y说明:无符号左移补0lsr 逻辑右移 (unsigned)x >> y说明:无符号右移补0asl 算术左移 (signed)x << y说明:有符号左移补0注意:逻辑左移和算术左移结果一样asr 算术右移 (signed)x >> y说明:有符号右移正数补0,负数补1ror 循环右移 ((unsigned)x >> y) | (x << (32 - y))说明: x逻辑右移y | x逻辑左移 (32 - y)rrx 扩展循环右移 (C << 31) | ((unsigned)x >> 1) 说明:相当于33位循环右移注意:没有y,只移一位四、逻辑指令1、 and逻辑与指令格式: and{}{s} Rd,Rn,op操作: Rd = Rn & op;2、 orr逻辑或指令格式: orr{}{s} Rd,Rn,op操作: Rd = Rn | op;3、 eor逻辑异或指令格式: eor{}{s} Rd,Rn,op操作: Rd = Rn ^ op;4、 bic位清除指令格式: bic{}{s} Rd,Rn,op操作: Rd = Rn & (~op);五、比较指令(默认带S位)1、 cmp比较指令格式: cmp{} Rn,op操作: Rn - op2、 cmn反比较指令格式: cmn{} Rn,op操作: Rn + op3、 tst位测试指令格式: tst{} Rn,op操作: Rn & op4、 teq相等测试指令格式: teq{} Rn,op操作: Rn ^ op六、数据处理指令位图1、 op为寄存器xxxx 000a aaas nnnn dddd cccc cttt mmmm2、 op为立即数xxxx 001a aaas nnnn dddd rrrr bbbb bbbb3、条件xxxx见ARMv4v5v6.pdf P112只有条件为真时才会执行指令,否则忽略该指令,继续下一条4、数据处理指令aaaa见ARMv4v5v6.pdf P1155、条件标志s指令含s则该位为 1 ,否则为 06、寄存器Rd,Rn,Rm分别对应dddd,nnnn,mmmmR0 ---> R150000 ---> 1111没有寄存器的则对应位置为 0,如:mov没有Rn寄存器nnnn位为 0000 ,cmp没有Rd寄存器dddd位为 00007、移位数ccccc立即数方式:最大为 0x1f寄存器方式:第 1 - 4 个c为寄存器编号,第 5 个c为 08、移位符ttt移位符: lsl lsr asr ror立即数编码: 000 010 100 110寄存器编码: 001 011 101 111asl 与 lsl 的编码相同ttt == 110 && ccccc == 00000 表示 rrx9、立即数构造立即数= bbbb bbbb 循环右移 rrrr * 2 次这种方式并不能把所有的32位数都构造出来如: #12345,#0xffff七、常量的装载1、 ldr伪指令格式: ldr Rd,= //ldr只有带'='号时才是伪指令说明:将number或label的值赋给Rd,该指令会伪造成mov、mvn、ldr等可能的指令举例: ldr r0,=0x100 //mov r0,#0x100ldr r0,=0x0 //mvn r0,#0x0ldr r0,=0x12345 //ldr r0,[pc,#offset] //offset是该指令到.word 的偏移量减去8//...//.word 0x123452、 adr / adrl伪指令格式: adr Rd,=label说明:此指令不能用立即数,其他基本和ldr一样,小范围时用adr,大范围用时adrl八、乘法指令1、 mul乘法指令格式: mul{}{s} Rd,Rm,Rs操作: Rd = Rm * Rs;2、 mla乘累加指令格式: mla{}{s} Rd,Rm,Rs,Rn操作: Rd = Rm * Rs + Rn;九、分支指令1、分支指令格式: b{l}{} label位图: xxxx 101L jjjj jjjj jjjj jjjj jjjj jjjj汇编: code[23:0] = (offset - 8) >> 2//offset是label的地址减去当前指令的地址,正数向前跳,负数向后跳code[24] = Lcode[27:25] = 101code[31:28] =操作: if(L == 1)lr = pc - 8 + 4;//保存下一条指令,当把lr的值赋给pc时可实现函数返回pc = pc + (SignExtend_30(code[23:0]) << 2);//SignExtend_30表示有符号扩展30位ARM指令是按每 4 个字节对齐的(所有指令的地址最低两位都为所以可以先右移 2 位保存,取出值后再左移 2 位offset的有效位数是26,共64M,前后各32M2、分支切换指令格式: bx{} Rm操作: pc = Rm & 0xfffffffc;T = Rm[0];格式: blx{} Rm操作: lr = pc + 4 - 8;pc = Rm & 0xfffffffc;T = Rm[0];格式:blx{} label //label必须为thumb指令函数,只能前后各跳32M十、单寄存器load-store指令1、 ldr 32 位数据读取指令格式: ldr{} Rd,addr //addr用法请见内存寻址方式操作: val = *(int *)addr;2、 ldr 16 位数据读取指令格式: ldr{}h Rd,addr操作: Rd = *(short *)addr & 0x0000ffff;3、 ldr 16 位有符号数据读取指令格式: ldr{}sh Rd,addr操作: Rd = *(short *)addr & 0x0000ffff;if(Rd[15] == 1)Rd |= 0xffff0000;4、 ldr 8 位数据读取指令格式: ldr{}b Rd,addr操作: Rd = *(char *)addr & 0x000000ff;5、 ldr 8 位有符号数据读取指令格式: ldr{}b Rd,addr操作: Rd = *(char *)addr & 0x000000ff; if(Rd[7] == 1)Rd |= 0xffffff00;6、 str 32 位数据写入指令格式: str{} Rd,addr操作: *(int *)addr = Rd;7、 str 16 位数据写入指令格式: str{}h Rd,addr操作: *(short *)addr = Rd[15:0];8、 str 8 位数据写入指令格式: str{}b Rd,addr操作: *(char *)addr = Rd[7:0];注:没有str有符号数据写入指令十一、内存寻址方式1、 label举例: ldr r0,labellebel:.word 0x12345操作: r0 = *(int *)label;2、前变址格式: [Rn,op]操作: addr = Rn + op;注: addr只是地址,还没有取值举例: ldr R0,[R1,#8]操作: addr = R1 + 8;R0 = *(int *)addr;3、回写前变址格式: [Rn,op]!操作: addr = Rn + op;Rn = Rn + op;4、后变址格式: [Rn],op操作: addr = Rn;Rn = Rn + op;5、 ldr、ldrb、str、strb指令的op立即数: #+/-offset_12寄存器: +/-Rm寄存器移位: +/-Rm,<移位符> #number注: #+/-offset_12(与前面的立即数构造方法一样)number最大为0x1f,没有+/-Rm,<移位符> Rs方式的寄存器移位+号可以省略立即数等于 0 可以省略6、 ldrh、ldrsh、ldrsb、strh指令的op立即数: #+/-offset_8寄存器: +/-Rm注: offset_8最大为255,没有寄存器移位7、Rn == pc说明:当Rn == pc时,addr = 当前指令的地址 + 8 + op举例: 0 ldr r0,[pc,#-4]4 .word 0x123458这两行指令等于mov r0,#0x12345,但是0x12345 不能构造成立即数,所以可以通过这种方式来赋值我们不能写成 ldr r0,[pc,#4],因为执行这条指令时pc已经执行地址 8 的指令,应该减去 4 而不是加 4十二、多寄存器方式1、 ldm / stm格式: {}{ia|ib|da|db} Rn{!},R_list//{r0 - r15}^ / {r0,r5,r9,pc},如果顺序不对,编译器会自动按从R0-R15调整// ^表示cpsr --> spsr或spsr -->cpsr操作: if(cond==1){if(ia == 1)//执行后增加,如果寻址模式为空,默认是iaaddr = Rn;else if(ib == 1)//执行前增加addr = Rn + 4;else if(da == 1)//执行后减少addr = Rn - sizeof(R_list) + 4; //sizeof(R_list) == 寄存器数 * 4else //db == 1//执行前减少addr = Rn - sizeof(R_list);if(ldm == 1)ldm_func(addr,R_list);else //stm == 1stm_func(addr,R_list);if(! == 1){if(ia == 1 || ib == 1)Rn += sizeof(R_list);else //da == 1 || db == 1Rn -= sizeof(R_list);}}void ldm_func(addr,R_list) {for(i = 0;i <= 14;i++){if(R_list[i] == 1)R_list[i] = *(int *)addr;addr += 4;}if(R_list[15] == 1){pc = *(int *)addr & 0xfffffffc; }if(^ == 1){cpsr = spsr;}}void stm_func(addr,R_list) {for(i = 0;i <= 15;i++){if(R_list[i] == 1)*(int *)addr = R_list[i];addr += 4;}if(^ == 1){spsr = cpsr;}}2 、更新基地址的指令对,可实现栈的push和pop操作stmia <=======> ldmdbstmib <=======> ldmdastmda <=======> ldmibstmdb <=======> ldmia举例: stmdb sp!,{r1,r2,r3}ldmia sp!,{r1,r2,r3}执行后 sp,r1,r2,r3 的值保持不变3、栈操作栈向高地址扩展的为递增栈(A,ascending),向低地址扩展的为递减栈(D,descending)栈指针(sp)指向的是有效数据称为满栈(F,full),指向的是无效数据称为空栈(E,empty)在ARM-Thumb过程调用标准(ATPCS)中,栈被定义为递减式满栈寻址方式说明 push =stm pop =ldmFA 递增满 stmfa stmib ldmfa ldmdaFD 递减满 stmfd stmdb ldmfd ldmia //arm汇编的push和pop 操作指令EA 递增空 stmea stmia ldmea ldmdbED 递减空 stmed stmda ldmed ldmib十三、程序状态寄存器指令1、 mrs格式: mrs{} Rd,2、 msr格式: msr{} {_fields},fields可以是f、x、s、f的任意组合,表示只对该域操作,默认全部f 表示标志域 psr[31:24]s 表示状态域 psr[23:16]x 表示扩展域 psr[15:8]c 表示控制域 psr[7:0]。
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处理器的指令集_嵌入式系统开发技术_[共2页]
嵌入式系统开发技术1064.加载/存储指令加载/存储(Load/Store )指令用于对存储器进行访问。
前者用于将内存中的数据装载到存储器中,后者用于将寄存器中的数据写入内存,其可以分为单寄存器传输指令、多寄存器传输指令和交换指令。
5.协处理器指令ARM 处理器使用协处理器指令来支持协处理器操作,这些协处理器指令如表6.3所示。
表6.3ARM 的协处理器指令 助记符说明操作条件码CDP coproc,opcode1,CRd,CRn, CRm{,opcode2}协处理器数据操作指令 取决于协处理器 CDP{cond} LDC{1} coproc,CRd,<地址> 协处理器数据读取指令 取决于协处理器 LDC{cond}{L} STC{1} coproc,CRd,<地址> 协处理器数据写入指令 取决于协处理器 STC{cond}{L} MCR coproc,opcode1, Rd,CRn,CRm{,opcode2} ARM 寄存器到协处理器寄存器的数据传送指令 取决于协处理器 MCR{cond} MRC coproc,opcode1, Rd,CRn,CRm{,opcode2)协处理器寄存器到ARM 寄存器的数据传送指令取决于协处理器MRC{cond}6.异常中断处理指令异常中断处理(SWI )指令用于处理ARM 处理器的异常中断事宜,通常又被称为软中断指令。
其用于产生软件中断,从而实现从用户模式变换到管理模式,并且将CPSR 寄存器的内容保存到管理模式的SPSR 寄存器中,执行转移到SWI 向量。
如果在其他工作模式下使用SWI 指令,ARM 处理器同样会切换到管理模式。
SWI 指令的标准调用格式为“SWI{cond} immed_24/immed_8”,其中“immed_24”是24位立即数,值为0~16 777 215的整数,其取出SWI 立即数的步骤如下。
(1)确定引起软件中断的SWI 指令是ARM 指令还是Thumb 指令,这可通过对SPSR 访问得到。
嵌入式课中必会命令
ADD R0,R1,#5; R0=R1+5MOV R0,#0x55; R0x55ADD R0,R1,R2; R0=R1+R2,即寄存器R1,R2的值直接相加,并将结果存放在R0中MOV R0,R1; R0=R1,即寄存器R1的数值直接赋给R0ADD R0,R1,R2,ROR #5; R0=R1+R2循环右移5位MOV R0,R1,LSL R3; R0=R1逻辑左移R3位MOV R0,R1,LSL#5; R1的值左移5位后,存入R0,相当于R1的值*32后,存入R0 MOV R0,R1,LSR#5; 相当于R1的值除以32后,存入R0MOV R0,R1,ASR#5; R1的值右移5位后,存入R0,最左端用命令执行前第31位值来填充MOV R0,R0,ROR#5; R0的值循环右移5位MOV R0,R1,RRX; R1的值右移一位,最左端由进位标志位来填充,存入R0STR R0,[R1]; [R1]=R0,将寄存器R0的值存入以R1的值为地址的存储单元中LDR R0,[R1]; R0=[R1],将以寄存器R1的值为地址的寄存器单元中的数据装入R0中LOR R0,[R1,#5]; R0=[R1+R5],将R1的值加上5作为操作数的物理地址,从存储器中取得操作数的值后,将结果存入R0中LDR R0,[R1,R2]; R0=[R1+R2],将R1加上R2的值作为操作数的物理地址,并从存储器中去得操作数的值,存入R0BEQ process1; 它将程序跳转到process1处执行LDMIA R0,[R1-R5]; 将以R0为起始地址的5个字数据分别装入R1,R2,R3,R4,R5中,即R1=[R0]、R2=[R0+4]、R3=[R0+8]、R4=[R0+12]、R5=[R0+16]LDMIA R0,{R1-R5}; 从以R0的值为起始地址的存储单元中取出5个字的数据STMIA R1,{R1-R5}; 将取出的数据存入以R1的值为起始地址的存储单元中STMFD R13!,{R0,R1,R2,R3,R4}; 将R0~R4的数据压入堆栈,R13为堆栈指针LDMFD R13!,{R0,R1,R2,R3,R4}; 将数据出栈,恢复R0~R4原先的值MOV R0,#5; R0=5MOV R0,R1; R0=R1MOV R0,R1,LSL#5; R0=R1左移5位MOV PC,R14; 退出到调用者MOVS PC,R14; 退出到调用者并恢复标志位MVN R1,R2; 将R2按位取返结果存到R1MVN R0,#0; R0=-1ADD R0,R1,#5;R0=R1+5ADD R0,R1,R2;R0=R1+R2ADD R0,R2,R3,,LSL#1;R0=R2+(R3<<1)ADDS R0,R2,R4; 低32位相加,S表示结果影响条件标志位的值ADC R1,R3,R5; 高32位相加SUB R0,R1,#5; R0=R1-5SUB R0,R1,R2; R0=R1-R2SUB R0,R1,R2,LSL#5; R0=R1-R2左移5位RSB R0,R1,#5; R0=5-R1RSB R0,R1,R2; R0=R2-R1RSB R0,R1,R2,LSL#5; R0=R2左移5位-R1ADD R0,R0,R0,LSL#2; R0’ 5*R0RSB R0,R0,R0,LSL#3; R0 7*R0’SUBS R0,R2,R4; 低32位相减,S表示结果影响寄存器CPSR的值RSC R1,R5,R3;高32位相减MULS R0,R1,R2; R0=R1*R2,结果影响寄存器CPSR的值,设置N位和Z位MLA R0,R1,R2,R3; R0=R1*R2+R3SMULL R0,R1,R2,R3; R0=R2*R3的低32位,R1=R2*R3的32位SMULL R2,R3,R7,R6; (R3,R2)=R7*R6SMLAL R0,R1,R2,R3; R0=R2*R3的32位+R0,R1=R2*R3的高32位+R1SMLAL R2,R3,R7,R6; (R3,R2)=R7*R6+(R3,R2)UMULL R0,R1,R2,R3; R0=R2*R3的低32位,R1=R2*R3的32位。
Arm嵌入式uboot常用命令
h t t p://b l o g.c h i n a u n i x.n e t/u1/34474/i n d e x.h t m l姓名:T e k k a m a n N i n j a职业:L i n u x年龄:26位置:广东 广州 天河区个性介绍:钻研嵌入式L i n u x技术E-M a i l:t e k k a m a n n i n j a@163.c o m嵌入式L i n u x开发目录四、U-boot的使用(一) (1)常用的U-boot命令详解 (2)(1)获取帮助 (2)(2)环境变量(environment variables,简称ENV)与相关指令 (5)四、U-boot的使用(二) (7)(3)串口传输命令 (7)(4)网络命令 (9)(5)Nand Flash操作指令 (11)四、U-boot的使用(三) (15)(6) 内存/寄存器操作指令 (15)(7) Nor Flash指令 (16)(8) USB 操作指令 (20)(9) SD卡(MMC)指令 (22)(10) FAT文件系统指令 (23)(11) 系统引导指令 (24)(12)EEPROM 读写指令 (26)(13)设置和读取RTC指令 (27)(14)脚本运行指令 (27)(15)系统重启指令 (28)四、U-boot的使用(四) (28)下载与烧写 (28)四、U-boot的使用(一)我一贯认为:对于一个技术类的东西,你连用都不会用,那根本就不可能会开发。
就好像一个人连Linux 不会用,那还谈何开发Linux程序呢?同样的要开发和移植U-boot,首先要对U-boot有一定的了解,起码要会使用。
所以这里我们首先熟悉一下U-boot的使用以及如何将U-boot烧入mini2440。
当然在这之前首先必须保证你的板子上已经有了U-boot。
如果没有那就先烧上一个吧。
针对mini2440的U-boot-2009.11的bin文件我已经上传到了博客中,可以直接烧入,请到这里下载:u-boot-2009.11 for mini2440 Source release把它烧到mini2440的NAND或者NOR Flash的起始地址即可,你可以使用OpenJTAG下载烧写:关于OpenOCD的安装和配置(以mini2440+OpenJTAG为例)也可以用板上已有的boottloader烧写,也可以适用H-JTAG用并口烧(这是最直接最快的)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常用数据处理指令表
助记符意义效果例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
器。