@ 汇编的中符号
@ 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 @ 汇编的结束