ARM的基本数据处理指令与条件代码的使用

最开始在此介绍一下CPSR寄存器中 N、Z、C、V 4位的作用:

Bit[28](V):

  • 当运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0    
  • 当运算器中进行减法运算且产生符号位借位时该位自动置0,否则为1  

Bit[29](C):     

  • 当运算器中进行加法运算且产生进位时该位自动置1,否则为0    
  • 当运算器中进行减法运算且产生借位时该位自动置0,否则为1

Bit[30](Z):当运算器中产生了0的结果该位自动置1,否则为0  

Bit[31] (N):当运算器中产生了负数的结果该位自动置1,否则为0
 

汇编条件码合集:要在cmp指令后使用,cmp的本质就是执行了一个sub,然后通过其结果的值引起对应的NZCV中的数发生改变,NZCV这几位的改变可以用一些助记符来表示,使用时在指令的后面增加对应的后缀即可,举一个简单的例子:

mov r1,#5
mov r2,#6

cmp r1,r2

moveq r1,#7

通过下图我们知道后缀EQ的含义是相等,而cmp指令就是执行了一个sub,所以 moveq 的含义就是当r1 - r2 = 0 也就时r1 = r2 时,把r1的值变为7,否则不执行此指令,并且cmp的结果是不会改变的直到下一个cmp指令出现

汇编的简介与指令的具体应用全部放在汇编代码中介绍!!

在此简单做一下指令的总结:

  • MOV:数据搬移
  • ADD:加法
  • SUB:减法
  • RSB:逆向减法
  • MUL:乘法
  • AND:按位与
  • ORR:按位或
  • EOR:按位异或
  • LSL:左移
  • LSR:右移
  • BIC:按位清零
  • STR:  写内存
  • LDR:读内存
  • STM:多寄存器内存访问
  • LDM:多寄存内存读取
@ *****************************************************************

@ 汇编中的符号
	@ 1.指令:	能够编译生成一条32位的机器码,且能被CPU识别和执行
	@ 2.伪指令:本身不是指令,编译器可以将其替换成若干条等效指令
	@ 3.伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译
	
@ ARM指令
	@ 1.数据处理指令:		数学运算、逻辑运算
	@ 2.跳转指令:			实现程序的跳转,本质就是修改了PC寄存器
	@ 3.Load/Srore指令:	访问(读写)内存
	@ 4.状态寄存器传送指令:访问(读写)CPSR寄存器
	@ 5.软中断指令:		触发软中断异常
	@ 6.协处理器指令:		操控协处理器的指令

@ *****************************************************************

.text				@表示当前段为代码段
.global _start		@声明_start为全局符号
_start:				@汇编程序的入口

@ 1.指令:能够编译生成一条32位的机器码,且能被CPU识别和执行

	@ 1.1 数据处理指令:数学运算、逻辑运算
	
		@ 数据搬移指令
		
		@ MOV R1, #1
		@ R1 = 1
		@ MOV R2, R1
		@ R2 = R1
		
		@ MVN R0, #0xFF 
		@ R0 = ~0xFF
		
		@ 立即数
		@ 立即数的本质就是包含在指令当中的数,属于指令的一部分
		@ 立即数的优点:取指的时候就可以将其读取到CPU,不用单独去内存读取,速度快
		@ 立即数的缺点:不能是任意的32位的数字,有局限性
		@ MOV R0, #0x12345678
		@ MOV R0, #0x12
		
		@ 编译器替换
		@ MOV R0, #0xFFFFFFFF
		
		@ 数据运算指令基本格式
		@	《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》
		@		操作码			指示执行哪种运算
		@		目标寄存器:	存储运算结果
		@		第一操作寄存器:第一个参与运算的数据(只能是寄存器)
		@		第二操作数:	第二个参与运算的数据(可以是寄存器或立即数)
		
		@ 加法指令
		@ MOV R2, #5
		@ MOV R3, #3
		@ ADD R1, R2, R3
		@ R1 = R2 + R3
		@ ADD R1, R2, #5
		@ R1 = R2 + 5
		
		@ 减法指令
		@ SUB R1, R2, R3
		@ R1 = R2 - R3
		@ SUB R1, R2, #3
		@ R1 = R2 - 3
		
		@ 逆向减法指令
		@ RSB R1, R2, #3
		@ R1 = 3 - R2
		
		@ 乘法指令
		@ MUL R1, R2, R3
		@ R1 = R2 * R3
		@ 乘法指令只能是两个寄存器相乘
		
		@ 按位与指令
		@ AND R1, R2, R3
		@ R1 = R2 & R3
		
		@ 按位或指令
		@ ORR R1, R2, R3
		@ R1 = R2 | R3
		
		@ 按位异或指令
		@ EOR R1, R2, R3
		@ R1 = R2 ^ R3
		
		@ 左移指令
		@ LSL R1, R2, R3
		@ R1 = (R2 << R3)
		
		@ 右移指令
		@ LSR R1, R2, R3
		@ R1 = (R2 >> R3)
		
		@ 位清零指令
		@ MOV R2, #0xFF
		@ BIC R1, R2, #0x0F
		@ 第二操作数中的哪一位为1,就将第一操作寄存器的中哪一位清零,然后将结果写入目标寄存器
		
		@ 格式扩展
		@ MOV R2, #3
		@ MOV R1, R2, LSL #1
		@ R1 = (R2 << 1)
		
		@ 数据运算指令对条件位(N、Z、C、V)的影响
		@ 默认情况下数据运算不会对条件位产生影响,在指令后加后缀”S“才可以影响
		
		@ 带进位的加法指令
		@ 两个64位的数据做加法运算
		@ 第一个数的低32位放在R1
		@ 第一个数的高32位放在R2
		@ 第二个数的低32位放在R3
		@ 第二个数的高32位放在R4
		@ 运算结果的低32位放在R5
		@ 运算结果的高32位放在R6
		
		@ 第一个数
		@ 0x00000001 FFFFFFFF
		@ 第二个数
		@ 0x00000002 00000005
		
		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x00000001
		@ MOV R3, #0x00000005
		@ MOV R4, #0x00000002
		@ ADDS R5, R1, R3
		@ ADC  R6, R2, R4
		@ 本质:R6 = R2 + R4 + 'C'
		
		@ 带借位的减法指令
		
		@ 第一个数
		@ 0x00000002 00000001
		@ 第二个数
		@ 0x00000001 00000005
		
		@ MOV R1, #0x00000001
		@ MOV R2, #0x00000002
		@ MOV R3, #0x00000005
		@ MOV R4, #0x00000001
		@ SUBS R5, R1, R3
		@ SBC  R6, R2, R4
		@ 本质:R6 = R2 - R4 - '!C'


	@ 1.2 跳转指令:实现程序的跳转,本质就是修改了PC寄存器
	
		@ 方式一:直接修改PC寄存器的值(不建议使用,需要自己计算目标指令的绝对地址)
@ MAIN:
		@ MOV R1, #1
		@ MOV R2, #2
		@ MOV R3, #3
		@ MOV PC, #0x18
		@ MOV R4, #4
		@ MOV R5, #5	
@ FUNC:
		@ MOV R6, #6
		@ MOV R7, #7
		@ MOV R8, #8
	
		@ 方式二:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址
@ MAIN:
		@ MOV R1, #1
		@ MOV R2, #2
		@ MOV R3, #3
		@ B   FUNC
		@ MOV R4, #4
		@ MOV R5, #5	
@ FUNC:
		@ MOV R6, #6
		@ MOV R7, #7
		@ MOV R8, #8
		
		@ 方式三:带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址,同时将跳转指令下一条指令的地址存储到LR寄存器
@ MAIN:
		@ MOV R1, #1
		@ MOV R2, #2
		@ MOV R3, #3
		@ BL  FUNC
		@ MOV R4, #4
		@ MOV R5, #5	
@ FUNC:
		@ MOV R6, #6
		@ MOV R7, #7
		@ MOV R8, #8
		@ MOV PC, LR
		@ 程序返回
		
		@ ARM指令的条件码
		
		@ 比较指令
		@ CMP指令的本质就是一条减法指令(SUBS),只是没有将运算结果存入目标寄存器
		@ MOV R1, #1
		@ MOV R2, #2
		@ CMP R1, R2
		@ BEQ FUNC	
		@ 执行逻辑:if(EQ){B FUNC}	本质:if(Z==1){B FUNC}
		@ BNE FUNC	
		@ 执行逻辑:if(NQ){B FUNC}	本质:if(Z==0){B FUNC}
		@ MOV R3, #3
		@ MOV R4, #4
		@ MOV R5, #5
@ FUNC:
		@ MOV R6, #6
		@ MOV R7, #7

		@ ARM指令集中大多数指令都可以带条件码后缀
		@ MOV R1, #1
		@ MOV R2, #2
		@ CMP R1, R2
		@ MOVGT R3, #3
		
		@ 练习:用汇编语言实现以下逻辑
			@ 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
			

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值