目录
1.流水线
2.指令流水线
3. 多核处理器编辑
4. 工程搭建
4.1为Keil软件配置编译工具链
5.程序编写
5.1 数据处理指令
5.2 带标志位的加法ADC ADDS
5.3 跳转指令B\BL
5.4 单寄存器内存访问
5.5 批量寄存器内存访问
5.6 满减操作
1.流水线
2.指令流水线
3. 多核处理器
4. 工程搭建
4.1为Keil软件配置编译工具链
4.1.1创建新工程
4.1.2设置工程保存的路径和工程的文件名字,在这里我将工程保存到 ARM-ASM 文件夹下,将工程命名为 arm-asm。
4.1.3 设置我们工程支持哪款 CPU,这里我们选择 Samsung 的 S3C2440A 芯片
4.1.4 单击“OK”之后,弹出提示框是否导入启动文件,选择“否”:
4.1.5建好工程后,软件界面如下图所示:
4.1.6 添加.s汇编文件到工程中
4.1.7 在.s汇编文件中写汇编代码
5.程序编写
1指令:编译完生成一条机器码存储在内存单元当中,CPU执行时能完成对应的操作
1) 数据处理指令: 对数据进行逻辑、算数运算
2) 跳转指令: 实现程序的跳转,实质是修改PC
3) Load/Store指令:对内存的读写操作
4)状态寄存器传送指令:对CPSR进行读写操作
5)异常中断产生指令:触发软中断,常用于内核的系统调用
6)协处理器指令;操作协处理器的指令
2.伪操作:不会生成机器码也不会占用内存,其作用是告诉编译器怎样编译(类似C中的宏定义)
3.伪指令:不是指令,编译器在编译时将其替换成等效的指令
5.1 数据处理指令
AREA RESET,CODE,READONLY;定义一个代码段RESET,属性为只读
ENTRY ;程序的入口
; 1)数据处理指令
; 搬移指令 MOV 作用:赋值=
MOV R0,#2
MOV R1,#3
MOV R2,#1
MOV R3,#3
MOV R4,#4
MOV PC,#0 ;PC取址0 循环;数据取反指令 MVN
MVN R4,#0X000000FF ;R4=~0X000000FF=0XFF000000
MOV R5,#255; 立即数:合法的数,包含在指令中的数
; 与普通变量的区别:立即数是存储在寄存器中,执行速度快
; 缺点:长度有限 这里规定最大为12bit,2^12=4096个数(连续数:0-255)其余为离散数
LDR R5,=0X12345678
; 加法指令 ADD
ADD R2,R0,R1 ;R2=R0+R1
; 减法指令 SUB
SUB R2,R1,R0 ;R2=R1-R0
; 乘法指令 MUL
MUL R2,R0,R1 ;R2=R0*R1
END
; nzcv验证
; SUBS R2,R0,R1 ;验证N 加S并使用减法指令产生负数,验证N位,发现被置位 n=1负数
; SUBS R1,R0,R2 ;验证Z 加S并使用减法指令产生0,验证z位,发现z和c都被置1,
;因为减法时产生借位c会被置0,没有借位被置1
; MOV R1,#0XFFFFFFFE
; MOV R2,#2
; ADDS R3,R1,R2 ;验证C,加法指令产生了进位(注意这里是32位),C位被置1
5.2 带标志位的加法ADC ADDS
; 第一个数;0X00000001 0XFFFFFFFF
; 第二个数;0X00000003 0X00000004
; 第一个数的低32位放到R1,高32bit放R2
; 第二个数的低32位放R3,高32bit放R4
; 低加低 高加高 运算结构的低32bit放R5,高32bit放R6
MOV R1,#0XFFFFFFFF
MOV R2,#0x00000001
MOV R3,#0X00000004
MOV R4,#0X00000003
ADDS R5,R1,R3
ADC R6,R4,R2 ;本质R6=R4+R2+‘c’
5.3 跳转指令B\BL
MOV R0,#2
CMP R0,#1
;B JUMP ;B 只是跳转
;BL JUMP ;BL 跳转后PC=LR 可跳转回去
;BEQ JUMP ;CMP相等时跳转==if((EQ)(B JUMP)) 本质:if(R0-#1==0){B JUMP}
;BNE JUMP ;CMP不相等时跳转
MOV R0,#2
MOV R0,#3
JUMP
MOV R0,#4
MOV R1,#5
MOV PC,LR
5.4 单寄存器内存访问
单寄存器内存访问的索引方式(寻址方式)
MOV R0,#0XFFFFFFFF
MOV R1,#0X40000000
STR R0,[R1] ;将R0的数据写到R1地址内
LDR R2,[R1] ;读取R1地址里的内容到R2中
前索引 先偏移8位后存储数据
STR R0,[R1,#8]
后索引 先存储数据后偏移地址
STR R0,[R1],#4
自动索引 (前后索引)偏移地址并存储数据
STR R0,[R1,#4]!
5.5 批量寄存器内存访问
MOV R0,#1
MOV R1,#2
MOV R2,#3
MOV R3,#4
MOV R4,#5
MOV R5,#0X40000020
STM R5,{R0-R4}
STM R5,{R4,R2,R3,R1,R0}STMIA R5!,{R0-R4} ; 空增
STMIB R5!,{R0-R4} ; 满赠
STMDA R5!,{R0-R4} ; 空减
STMDB R5!,{R0-R4} ; 满减
5.6 满减操作
MOV SP,#0X40000020 ;初始化栈地址
MAIN
MOV R1,#1
MOV R2,#2
BL FUNC
ADD R3,R1,R2
TOP
B TOP
FUNC
STMFD SP!,{R1,R2}
MOV R1,#10
MOV R2,#5
SUB R3,R1,R2
LDMFD SP!,{R1,R2}
MOV PC,LR