常用ARM指令及汇编【一】

本文详细介绍了ARM处理器的寻址方式,包括寄存器寻址、立即寻址、寄存器偏移寻址等,并提供了实例说明。此外,还介绍了ARM指令集,包括数据处理、存储访问和控制转移指令,以及伪指令的使用,是理解ARM汇编编程的重要参考资料。
摘要由CSDN通过智能技术生成

常用ARM指令及汇编包括

1、ARM处理器寻址方式
2、指令集介绍
3、伪指令
4、ARM汇编程序设计
5、C与汇编混合编程

ARM处理器寻址方式

1、寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作
MOV  R1, R2       ;R2->R1
SUB  R0, R1,R2    ;R1-R2 -> R0

2、立即寻址:立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令就取出了可以立即使用的操作数
SUBS R0,R0,#1      ;R0-1 -> R0
MOV  R0,#0xff00    ;0xff00 -> R0
注:立即数要以"#"为前缀,表示16进制数值时以"0x"表示

3、寄存器偏移寻址:是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前选择进行移位操作
MOV  R0,R2,LSL #3       ;R2的值左移3位,结果存入R0,即R0 = R2 * 8
ANDS R1,R1,R2,LSL R3   ;R2的值左移R3位,然后和R1相与操作,结果放入R1

寄存器偏移寻址可采用的移位操作如下
(1)、LSL(Logical Shift Left)逻辑左移,寄存器中字的低端空出补0
(2)、LSR(Logical Shift Right)逻辑右移,寄存器中字的高端空出补0
(3)、ASR(Arthmetic Shift Right)算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1
(4)、ROR(Rotate Right)循环右移,由字的低端移出的位填入高端空出的位
(5)、RRX(Rotate Right eXtended by 1 place),操作数右移一位,左侧空位由CPSR的C填充

4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针
LDR R1,[R2]    ;将R2中的数值作为地址,取出此地址中的数据保存在R1中
SWP R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与R1中的值交换

5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。
LDR R2,[R3,#0x0F]    ;将R3的数值加0x0F作为地址,取出此地址的数值保存在R2中
STR R1,[R0,#-2]      ;将R0中的数值减2作为地址,把R1中的内容保存到此地址位置
 
6、多寄存器寻址:一次可以传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器
LDMIA R1!,{R2-R7,R12}  ;将R1所指向的地址的数据读出到R2-R7,R12,R1自动更新
STMIA R0!,{R3-R6,R10}  ;将R3-R6,R10中的数值保存到R0指向的地址,R0自动更新

7、堆栈寻址:堆栈是特定顺序进行存取的存储区,堆栈寻址时隐含的使用一个专门的寄存器(堆栈指针),指向一块存储区域(堆栈),存储器堆栈可分为两种:
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
如此可结合出四中情况:
1、满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址,指令如 LDMFA,STMFA
2、空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置,指令如 LDMEA,STMEA
3、满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址,指令如 LDMFD,STMFD
4、空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置,指令如 LDMED,STMED
STMFD SP!,{R1-R7,LR}  ;将R1-R7,LR入栈,满递减堆栈
LDMFD SP!,{R1-R7,LR}  ;数据出栈,放入R1-R7,LR寄存器,满递减堆栈

8、块拷贝寻址:多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置
STMIA R0!,{R1-R7}     ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,方向为向上增长
STMIB R0!,{R1-R7}     ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,方向为向上增长
SIMDA R0!,{R1-R7}     ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之后增加,方向为向下增长
STMDB R0!,{R1-R7}     ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加,方向为向下增长
不论是向上还是向下递增,存储时高编号的寄存器放在高地址的内存,出来时,高地址的内容给编号高的寄存器

9、相对寻址:是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址
BL ROUTE1    ;调用到 ROUTE1 子程序
BEQ LOOP     ;条件跳转到 LOOP 标号处

 

====================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值