L9ARM体系结构与接口技术--数据处理指令(day6)

@ 汇编的中符号
    @ 1.指令:  能够编译生成一条32bit机器码,并且能被CPU识别和执行
    @ 2.伪指令:本身不是指令,编译器可以将其替换成若干条指令
    @ 3.伪操作:不会生成指令,只是在编译阶段告诉编译器怎么编译
    
@ ARM指令集
    @ 1.数据处理指令:  进行数学运算、逻辑运算
    @ 2.跳转指令:        实现程序的跳转,本质就是修改了pc寄存器
    @ 3.Load/srore指令:访问(读写)内存
    @ 4.状态寄存器传送指令:用于访问(读写)CPSR寄存器
    @ 5.软中断指令:    触发软中断
    @ 6.协处理指令:    操作协处理器的指令
    
    
.text          @ 表示当前为代码段
.global _start @ 将_start定义为全局符号
_start:        @ 汇编的入口

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

    @ 1.1 数据处理指令:  进行数学运算、逻辑运算
    
            @ 数据搬移指令
            MOV R1,#1    @汇编指令
            @ R1 = 1
            MOV R2,#2
            MOV R3,#3
stop:            @死循环,防止程序跑飞
    B stop  

.end           @ 汇编的结束  


 

 pc的值永远是4的整数倍(后两位为00)

 

 不同汇编代码,机器码不一样

 

 本来执行不了,但是会被替换成另一条指令执行,(效果是一样的)所以不会报错。

@ 汇编的中符号
	@ 1.指令: 能够编译生成一条32bit机器码,并且能被CPU识别和执行
	@ 2.伪指令:本身不是指令,编译器可以将其替换成若干条指令
	@ 3.伪操作:不会生成指令,只是在编译阶段告诉编译器怎么编译

@ ARM指令集
	@ 1.数据处理指令: 进行数学运算、逻辑运算
	@ 2.跳转指令:		实现程序的跳转,本质就是修改了pc寄存器
	@ 3.Load/srore指令:访问(读写)内存
	@ 4.状态寄存器传送指令:用于访问(读写)CPSR寄存器
	@ 5.软中断指令:	触发软中断
	@ 6.协处理指令:	操作协处理器的指令


.text		@ 表示当前为代码段
.global _start @ 将_start定义为全局符号
_start: 	@ 汇编的入口

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

	@ 1.1 数据处理指令: 进行数学运算、逻辑运算

			@ 数据搬移指令
			@ MOV R1,#1	@汇编指令
			@ R1 = 1
			@ MOV R2,#2
			@ MOV R3,#3
			@ MOV PC,#7
			@ MOV R2,R1
			@ R2=R1
			
			@ MVN R0, #0xFF
			@ R0 = ~0xFF   按位取反
			
			@ 立即数(本质就是包含在指令当中的数,属于指令的一部分)
			@ 优点:速度快,取址时就可以将其读取到CPU,不用单独去内存读取
			@ 缺点:不能是任意的32位数字,有局限性
			
			@ MOV R0, #0x12345678  @报错(数太大,整个指令一共32位)
			@ MOV R0, #0x12
			
			@ 伪指令
			@ MOV R0, #0xFFFFFFFF
			
		@数据运算指令格式
			@《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》
			@	操作码:			表示执行哪种操作
			@	自标寄存器:		用于存储运算的结果
			@	第一操作寄存器:	存储第一个参与运算的数据(只能写寄存器)
			@	第二操作数:		第二个参与运算的数据(可以是寄存器也可以是立即数)
			
			@ 加法指令
			@ MOV R2, #5
			@ MOV R3, #3
			@ ADD R1, R2, R3	@R1 = R2 + R3
			@ ADD R1, R2, #5
			@@ADD R1, #5, #5 错误 
			@@ADD R1, #5, R2 错误
			
			@ 减法指令
			@ 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
			
			@ 左移指令
			@ MOV R2, #0xF0
			@ MOV R3, #0x2
			@ LSL R1, R2, R3  @R1 = (R2 << R3)
			
			@ 右移指令
			@ MOV R2, #0xF0
			@ MOV R3, #0x2
			@ 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"可以影响
			@ MOV R1, #3
			@ SUB R2, R1, #5	@无影响
			@ SUBS R2, R1, #5	@有影响(产生负数,N变为1)
			
			@ 两个64位的数据做加法运算
			@ 第一个数的低32位放在R1
			@ 第一个数的高32位放在R2
			@ 第二个数的低32位放在R3
			@ 第二个数的高32位放在R4
			
			@ 带进位的加法运算
			@ 第一个数	0x00000001	FFFFFFFF
			@ 第二个数	0x00000002	00000005
			
			@ MOV R1, #0xFFFFFFFF
			@ MOV R2, #0x00000001
			@ MOV R3, #0x00000005
			@ MOV R4, #0x00000002
			
			@ ADDS R5, R1, R3
			@ ADC  R6, R2, R4		@将CPSR中的C位(0或1)也加了进去 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		@将CPSR中的C位取反(1或0)也减了进去 R6 = R2 - R4 - '!C'
			
			
			
stop:					@死循环,防止程序跑飞
	B stop

.end					@ 汇编的结束 

作业:

1.编程实现使用32bit的ARM处理器实现两个128位的数据的加法运算。

注:

第一个数的bit[31:0]、bit[63:32]、bit[95:64]、bit[127:96]分别存储在R1、R2、R3、R4寄存器
第二个数的bit[31:0]、bit[63:32]、bit[95:64]、bit[127:96]分别存储在R5、R6、R7、R8寄存器
运算结果的bit[31:0]、bit[63:32]、bit[95:64]、bit[127:96]分别存储在R9、R10、R11、R12寄存器

答: 

.text		@ 表示当前为代码段
.global _start @ 将_start定义为全局符号
_start: 	@ 汇编的入口


			@ 带进位的加法运算(两个128位数据)
			@ 第一个数	0xFFFFFFFF	00000001 00000001 00000001
			@ 第二个数	0x00000002	00000002 00000002 00000002
			
			 MOV R1, #0xFFFFFFFF
			 MOV R2, #0x00000001
			 MOV R3, #0x00000001
			 MOV R4, #0x00000001
			 MOV R5, #0x00000002
			 MOV R6, #0x00000002
			 MOV R7, #0x00000002
			 MOV R8, #0x00000002
			
			 ADDS R9, R1, R5
			 ADCS  R10, R2, R6
			 ADCS  R11, R3, R7
			 ADC  R12, R4, R8
			
stop:					@死循环,防止程序跑飞
	B stop

.end					@ 汇编的结束 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值