ARM寄存器基础笔记
1.2.2 寄存器组织
R8~R12 也是存放临时变量 R13/SP 栈指针寄存器,记录栈顶地址 (地址指向那,栈就在那) R14/LR 链接返回寄存器,保存程序返回地址,如函数调用返回 CASE:当BL fun 返回地址保存在R14寄存器里 R15/pC 保存CPU下一步执行的地址里面的指令
|
小知识
|
CPRS寄存器-当前程序状态寄存器
1,图解一,前5位记录当前CPU在什么模式(7种模式)
|
2,图解二V, C,Z,N
CPSR工作模式由状态寄存器的最低5位决定 图解:最低5位
熟悉问题 共37个寄存器,这些寄存器分别是干什么的?
|
1.2.3
大小端存储-简称高存稿,低存低
网络字节序-使用大端存储 |
1.2.4 处理器组成原来
一条指令执行完,需要经历3个阶段
|
1.2.5 流水线-CPU内部可以同时处理几条指令,不是一起处理,是处在同一阶段
|
1.2.6 Thumb寄存器
R8~R12这部分寄存器在Thumb模式下隐藏掉
|
1.3 汇编和C混合编程
|
1.3.1 汇编指令构造格式-ARM指令长度固定,4个字节,32位,定长
条件码 操作码 类码 S码 目的寄存器 源寄存器 立即数 MOV R0, #0x1 MOVS R0, R1 把R1寄存器的值存储到R0中
|
条件码解析图
|
小知识
字节(Byte):通常将可表示常用英文字符8位二进制称为一字节。 |
条件码
|
条件码与S码的区分:
工作的时间: 指令之前工作-------->判断条件码是否成立,例如beq指令 指令之后工作-------->根据S码的设置,影响CPSR相关标志位,没有具体说明是影响那个标志位 比如两个数相加,可以产生进位,也可以溢出
(当一个指令执行完之后,加完了产生的进位,进1)
|
常用汇编指令
例如: AREA asm1test,CODE,READONLY ENTRY MOV R0 ,#0x1 MOV R1,R0 MOVR2,#0x2
ADD R3,R1,R2;R1+R2 = >R3 SUBR4,R3,R1 ;R3-R1=>R4 SUBSR0,R0,R0 B .; . 表示当前指令地址 BL;保存返回函数的地址 (B和BL的区别,有没有返回函数的地址) MVNR5,#0x0;数据取反函数 MOV R5,#0x0 MOVR6,#0x9000 STRR5,[R6] LDRR7,[R6]
STR R5,[R6,#0x4] ;表示基址+偏移地址 LDRR7,[R6]
ORR R6,R1,R2 ;R1&R2=>R6 ANDR3,R1,R2 ;R1&R2=>R3 ADC 带进位加法 SUB 减法运算(只保存数据,不修改CPSR寄存器标志位) SBC 带借位减法 AND 汇编层面的并操作 ORR 32位逻辑或 EOR 32位逻辑异或 CMP 比较指令(32位数比较)保存计算结果,目的,修改寄存器CPSR标志位) BIC 位清零指令 STR 从寄存器到内存 STR R5,[R6,#0x4] ;表示基址+偏移地址 LDR 从内存到寄存器 SWP 交换指令
|
操作CPSR状态寄存器的两条指令
MRS 操作状态寄存器,R,register表示通用寄存器,S stack 表示状态寄存器 (把CPSR的值取出来给通用寄存器) MSR (把通用寄存器的值给CPSR状态寄存器) |
小知识
一个寄存器只能保存32位数字,如果想做一个64位加法运算 |
如果修改CPSR里的值
|