ARM汇编指令集-跳转与存储器访问指令

发布时间:2023年12月22日

目录

一、跳转指令

?二、ARM指令的条件码

三、内存访问指令

四、ARM指令的寻址方式


一、跳转指令

跳转指令:实现程序的跳转,本质是修改了PC的寄存器

方式1:直接修改PC寄存器的值(不建议使用)

方式2.不带返回的(即不影响LR)跳转指令(本质修改PC寄存器的值修改成跳转标号下第一条指令的地址)

方式3.带返回的(LR为下一条指令的地址)跳转指令(本质修改PC寄存器的值修改成跳转标号下第一条指令的地址,同时将跳转指下一条指令的地址存储到LR)?

?二、ARM指令的条件码

比较指令存储在CPSR中NZCV中)(NZCV也可做关系运算)

CMP R1,R2??CMP的本质就是一条减法指令(SUBS),只是没有将运算的结果存入寄存器中

R1-R2? ????????① == , Z = 1

? ? ? ? ? ? ? ? ? ? ? ② != , Z = 0

? ? ? ? ? ? ? ? ? ? ? ?③ <? , C = 0(产生借位)

? ? ? ? ? ? ? ? ? ? ? ?④ <=?, C = 0 或 Z = 1

? ? ? ? ? ? ? ? ? ? ? ?⑤ <? ,C = 1 且 Z = 0

? ? ? ? ? ? ? ? ? ? ? ⑥ >=? ,C = 1?

ARM的条件码(后缀)

ARM 指令 中大多数指令都可以带条件码后缀

小练习:

练习:用汇编语言实现以下逻辑
			 int R1 = 9;
			 int R2 = 15;
		 START:
			 if(R1 == R2)
		     {
			 	STOP();
			 }
			 else if(R1 > R2)
			 {			
				R1 = R1 - R2;
			 	goto START;
			 }
			 else 
             {
			 	R2 = R2 - R1;
				goto START;
			 }
		
@ 练习答案
		 MOV R1, #9
		 MOV R2, #15
 START:
		 CMP R1,R2
		 BEQ STOP
		 SUBGT R1, R1, R2
		 SUBLT R2, R2, R1
		 B START
 STOP:				
		 B STOP

三、内存访问指令

Load/Srore 指令:访问(读写)内存? ? ?【LD/ST】

@ 1.3 Load/Store指令:访问(读写)内存
	
		@ 写内存
		@ MOV R1, #0xFF000000
		@ MOV R2, #0x40000000	当前芯片支持读写代码的地址区(可在debug的MEmory map中查看)
		@ STR R1, [R2] 
		@ 将R1寄存器中的数据写入到R2指向的内存空间
		
		@ 读内存
		@ LDR R3, [R2]
		@ 将R2指向的内存空间中的数据读取到R3寄存器
		
		@ 读/写指定的数据类型
		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x40000000
		@ STRB R1, [R2]
		@ 将R1寄存器中的数据的Bit[7:0]写入到R2指向的内存空间, B :byte
		@ STRH R1, [R2] 	
		@ 将R1寄存器中的数据的Bit[15:0]写入到R2指向的内存空间, H :halfword
		@ STR  R1, [R2] 	
		@ 将R1寄存器中的数据的Bit[31:0]写入到R2指向的内存空间,word
        @ LDR指令同样支持以上后缀

四、ARM指令的寻址方式

(不同处理器的寻址方式不同)

寻址方式就是CPU去寻找操作数的方式,不同的获取方式

1. 立即数寻址:参与运算的数是立即数,CPU去寻找的是立即数的寻找方式

??? ? MOV R1, #1
?? ?? ADD R1, R2, #1

2. 寄存器寻址

	 ADD R1, R2, R3

3. 寄存器移位寻址

?     MOV R1, R2, LSL #1

4.? 寄存器间接寻址:R2不是直接参与运算的寄存器,通过指针R2操作内存

 ???  STR R1, [R2]

?5.基址 加 变址 寻址

         MOV R1, #0xFFFFFFFF
		 MOV R2, #0x40000000
		 MOV R3, #4
		 STR R1, [R2,R3]
		 将R1寄存器中的数据写入到R2+R3指向的内存空间
		 STR R1, [R2,R3,LSL #1]
		 将R1寄存器中的数据写入到R2+(R3<<1)指向的内存空间

?6.基址 加 变址 寻址 的索引方式

	     前索引
		 MOV R1, #0xFFFFFFFF
		 MOV R2, #0x40000000
		 STR R1, [R2,#8]
		 将R1寄存器中的数据写入到R2+8指向的内存空间
		
后索引
		 MOV R1, #0xFFFFFFFF
		 MOV R2, #0x40000000
		 STR R1, [R2],#8
		 将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8

		 自动索引
		 MOV R1, #0xFFFFFFFF
		 MOV R2, #0x40000000
		 STR R1, [R2,#8]!
		 将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8
		
		

?以上寻址方式和索引方式同样适用于LDR

文章来源:https://blog.csdn.net/lumijgfei2_0/article/details/132782155
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。