当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]ARM指令也称ARM汇编指令集,是用来操作及控制ARM处理器及其相关设备的32bit的汇编指令,相对于16bit的thumb指令集而言功能更加强大,包含指令与伪指令。现将常用指令归纳汇总如下:

ARM指令也称ARM汇编指令集,是用来操作及控制ARM处理器及其相关设备的32bit的汇编指令,相对于16bit的thumb指令集而言功能更加强大,包含指令与伪指令。现将常用指令归纳汇总如下:

一、指令、伪指令

指令:是机器码的助记符,经过汇编器编译为机器码后,可以由CPU执行。

伪指令:用来指导汇编器编译指令,是汇编器的产物,最终不会生成机器码。

二、ARM指令的编写风格

汇编代码大写:在Windows中的IDE开发环境中一般都大写。

汇编代码小写:在Linux环境中,最好遵循GNU风格,即指令一般用小写。

三、ARM汇编代码文件后缀的大小写问题

Windows环境:因为Windows不区分大小写,所以汇编文件后缀大写、小写编译过程没有区别,即test.S与test.s编译结果一致。

Linux环境:Linux环境是严格区分大小写的,test.S与test.s会被当成不同的文件来处理(处理过程也不一致)。后缀小写的test.s文件,在编译阶段不进行预处理操作,所以不能在这里面写预处理的语句(不能有宏定义等,不常用);后缀大写的test.S文件,会进行预处理、汇编等操作,所以我们可以在这里面加入预处理的命令(比较常用)。

四、ARM汇编指令的格式

ARM汇编指令的格式比较固定、简单,即是:“操作码目标寄存器,操作数1,操作数2,……操作数n”。

例如将十六进制数0xaf放到寄存器r0中,我们用汇编代码可以这样写“mov r0,#0xaf”。这里的“mov”就是操作码(指令),实现的功能是将“0xaf”这个数存放到寄存器中“r0”中,“r0”也即是目标寄存器,“#0xaf”也即是操作数。在这里,“#0xaf”表示立即数(立即寻址方式指令中给出的数称为立即数立即数,亦即是直接参与运算不需处理的数),立即数需要用“#”来标识。

五、ARM指令分类

ARM指令可以分为程序状态寄存器操作指令、寄存器装载与存储指令、算术与逻辑指令、移位指令、乘法指令、比较指令、分支指令、浮点数指令、伪指令。

1、程序状态寄存器操作指令

程序状态寄存器操作指令包含msr、mrs两个指令。

(1)msr实现将通用寄存器(r0-r15)的值复制到状态寄存器(cpsr及spsr)中,用于更改处理器的工作模式及状态。例如,

MSR CPSR, R0 ;复制 R0 到 CPSR 中

MSR SPSR, R0 ;复制 R0 到 SPSR 中

(2)mrs实现将状态寄存器(cpsr及spsr)的值复制到通用寄存器(r0-r15)中,用于读取处理器的工作模式及状态。例如,

MRS R0, CPSR ; 复制 CPSR 到 R0 中

MRS R0, SPSR ; 复制 SPSR 到 R0 中

2、寄存器装载与存储指令

常用寄存器装载与存储指令操作指令包含ldr、str、ldm、stm四个指令,其中ldm、stm可以实现多个数据的传输。

(1)ldr实现将所在内存地址的值装载到寄存器中。

ldr rd, [rbase] ;rbase的值存储到rd寄存器

(2)str实现将寄存中的值存储在相应内存地址中。

str rd, [rbase] ;存储 rd 到 rbase 所包含的有效地址

(3)ldm实现将内存的值存储在相应寄存器地址中。常用于数据出栈。

ldmfd sp!, {r0-r3} ;将内存的数据出栈到r0-r3

(4)stm实现将寄存中的值存储在相应内存地址中。常用于数据入栈。

stmfd sp, {r0-r3} ;将寄存器r0-r3压栈

3、算术与逻辑指令

常用算术与逻辑指令包含and、orr、eor三个逻辑指令和adc、add、bic、mov、mvn、rsb、sub六个算术指令,共计九个指令。

(1)and实现逻辑与,相当于c语言中的位与。

and r0, r1, #0x01 ; r0=r1 & 0x01

(2)orr实现逻辑或,相当于c语言中的位或。

orr r0, r1, #0x01 ; r0=r1 | 0x01

(3)eor实现异或,相当于c语言中的异或。

eor r0, r1, #0x01 ; r0=r1 ^ 0x01

(4)bic实现清零操作。

bic r0, r0, #0x0f ; r0 = r0 & ~(0x0f)技术将低4bit清零

(5)mov实现数据的搬移,相当于c语言中的赋值(如果后面是立即数,这个立即数的范围一般是0~255(8bit))。

mov r0,#0x01 ; r0 = 0x01

mov r0,r1 ; r0 = r1

(6)mvn实现数据的取反并搬移,相当于c语言的取反在赋值。

mvn r0,#1 ; r0 = (~1) = -2

mvn r0,r1 ; r0 = (~r1) = -(r1 + 1)

(7)rsb实现反向减法。

rsb r0, r1, #20 ; r0 = 20 - r1

rsb r0, r1, r2 ; r0 = r2 - r1

(8)add实现算术加法。

add r0, r1, #0x01 ; r0 = r1 + 0x01

(9)sub实现算术减法。

sub r0, r1, #0x01 ; r0=r1 - 0x01

4、移位指令

移位指令包含lsl、asl两个左移指令和lsr、asr、ror、rrx四个右移指令,共计六个指令。

(1)lsl实现逻辑左移,与asl作用等同。

mov r1, #0x21 ;将立即数0x21放到r1

mov r0, r1, lsl#3 ;将r1左移3位,然后放入r0中

(2)asl实现算术左移,与lsl作用等同。

mov r1, #0x21 ;将立即数0x21放到r1

mov r0, r1, asl#3 ;将r1左移3位,然后放入r0中

(3)lsr实现逻辑右移。

mov r1, #0x21 ;将立即数0x21放到r1

mov r0, r1, lsr#3 ;将r1右移3位,然后放入r0中

(4)asr实现算术右移。

mov r1, #0x21 ;将立即数0x21放到r1

mov r0, r1, asr#3 ;将r1右移3位,然后放入r0中

(5)ror实现循环右移。

mov r1, #0x21 ;将立即数0x21放到r1

mov r0, r1, ror#3 ;将r1右移3位,移出的位放依次放到高位,然后放到r0中

(6)rrx实现带扩展的循环右移

mov r1, #0x21 ;将立即数0x21放到r1

mov r0, r1, rrx#3 ;将r1右移3位,移出的位放依次放到高位(借一位构成33bit),然后放到r0中

5、乘法指令

乘法指令操作指令包含mla、mul两个指令。

(1)mla是三目乘法指令(有三个操作数)。例如:

mla r0, r1,r2,r3 ;r0 = (r1 * r2) + r3

(2)mul是两目乘法指令(有两个操作数)。例如:

mul r0, r1, r2 ;r0 = r1 * r2

6、比较指令

常用比较指令包含cmp、cmn两个指令。

(1)cmp实现比较功能,例如,cmp r0, r1 ;r0-r1

(2)cmn实现取负的值的比较功能,例如,cmn r0, r1 ;r0-(-r1)

7、分支指令

分支指令包含b、bl两个指令。

(1)b为不带连接的分支指令,当程序从当前位置调到分支程序中执行,将无法再返回到当前位置的下一条指令处。例如:

.start

.loop

mov r0,#0x01 ;将0x01加载到r0寄存器

…………

b loop ; ;调到loop

mov r1,#0x01 ;将0x01加载到r1寄存器

程序将一直在loop这里循环(相当于while循环),“mov r1,#0x01”永远得不到执行。

(2)bl为带连接的分支指令(branch and link),跳转前把返回地址放入lr中,以便用于函数调当程序从当前位置调到分支程序中执行,执行完分支程序将再返回到当前位置的下一条指令处继续执行。例如:

.start

.loop

mov r0,#0x01 ;将0x01加载到r0寄存器

…………

bl loop ;调到loop

mov r1,#0x01 ;将0x01加载到r1寄存器

程序执行完loop后调到下一行的“mov r1,#0x01”处执行。

8、浮点数指令

浮点数指令很多,常用指令有abs、cmf、dvf、mvf、muf、ldf、suf、adf几个指令,用于处理浮点数的加载、加、减、乘、除。

9、伪指令

伪指令操作指令包含adr、adrl、align、dcx、equx、opt六个指令,用于描述指定汇编代码的对齐方式、宏定义等。

六、常用GNU伪指令

global _start @ 给_start外部链接属性

.section .text @ 指定当前段为代码段

.ascii .byte .short .long .word

.quad .float .string @ 定义数据

.align 4 @ 以4字节对齐

.balignl 16 0xabcdefgh @ 16字节对齐填充

.equ @ 类似于C中宏定义

.end @标识文件结束

.include @ 头文件包含

.arm / .code32 @声明以下为arm指令

.thumb / .code16 @声明以下为thubm指令

ldr 大范围的地址加载指令

adr 小范围的地址加载指令

adrl 中等范围的地址加载指令

nop 空操作

七、常用的8种寻址方式的指令实现

1、寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作数,是一种执行效率较高的寻址方式。例如:

mov r1, r2 ;r1 = r2

2、立即(立即数)寻址

立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出,只要取出指令也就渠道了操作数。这个操作数被称为立即数,对应的寻址方式也叫作立即寻址。例如:

mov r0, #0xff00 ; r0 = 0xff00

3、寄存器移位寻址

将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。例如:

mov r0, r1, lsl #3 ; r0 = r1 << 3

4、寄存器间接寻址

寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如:

ldr r0, [r1] ;将内存地址存在r1这个寄存器中的内存地址里的值给r0

5、基址寻址

基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。常用于查表、数组操作、功能部件寄存器访问等。例如:

LDRR2,[R3,#0x0C];读取R3+0x0C地址上的内容,放入R2

6、块拷贝寻址

多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。例如,

STMIAR0!,{R1-R7} ;将R1~R7的数据保存到存储器中

7、多寄存器寻址

利用一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值

ldmia r1!, {r2-r7, r12} ;一次访问多个寄存器

8、堆栈寻址

堆栈是一种数据结构,按先进后出的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。例子,

stmfd sp!, {r2-r7, lr}

八、常用指令后缀

同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:

1、B(byte)功能不变,操作长度变为8位

2、H(half word)功能不变,长度变为16位

3、S(signed)功能不变,操作数变为有符号

4、条件执行后缀

5、“!”与“^”的作用

例如ldr可以加“b”、“h”、“s”变成 ldrb、ldrh、ldrsb、ldrsh用于表示加载8bit数据、16bit数据、有符号8bit数据、有符号16bit数据。

条件执行后缀,可以参看下表例。特点是条件后缀是否成立取决于当前代码的前面的代码,只影响当前代码的执行。

 

感叹号的作用就是r0的值在ldm过程中发生的增加或者减少最后写回到r0去,也就是说ldm时会改变r0的值。例如,

ldmia r0, {r2 - r3} ;不会改变r0的值

ldmia r0!, {r2 - r3} ;会改变r0的值

^的作用是在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回。

ldmfd sp!, {r0 - r6, pc} ;spsr不会写入到cpsr

ldmfd sp!, {r0 - r6, pc}^ ;spsr写入到cpsr

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭