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

目录

一、跳转指令

 二、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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值