一、BL指令
1.指令架构
2.属性解析
(1)cond
(2)L
当是BL指令的时候,L位会被设置成1,从而会存储返回地址到R14寄存器中。如果不是BL指令而是B指令,则L位会被置位0,并且指令简单的完成跳转,不会存储返回地址到R14寄存器中
(3)signed_immed_24
跳转的目标地址,计算规则如下:
(1)将24位有符号数立即扩展为30位有符号数
(2)将(1)的计算结果左移2位扩展为32位有符号数
(3)将(2)的计算结果加8再加PC指针的值,就是目标地址
二、LDR指令
1.立即数偏移寻址
(1)指令架构
(2)属性解析
属性 | 含义 |
---|---|
Rd | 目的寄存器 |
Rn | 基址寄存器 |
offset_12 | 立即数偏移 |
U | 表示正负,+offset还是-offset |
(3)示例
LDR PC,[PC - 4]
1110 0101 0001 1111 1111 000000000100
2.寄存器偏移寻址
(1)指令架构
(2)属性解析
属性 | 含义 |
---|---|
Rd | 目的寄存器 |
Rn | 基址寄存器 |
Rm | 寄存器偏移 |
U | 表示正负,+Rm还是-Rm |
(3)示例
LDR PC,[R1 + PC]
1110 0111 1001 0001 1111 000000001111
三、MOV指令
1.指令架构
2.属性解析
(1)立即数时,shifter_operand具体结构如下:
(2)旋转方式:alisdair.mcdiarmid.org/arm-immedia…
(3)立即数存在位数限制和具体数字大小限制,并不能覆盖所有的数字
四、ARM的三级流水线指令
处理器处于ARM状态时,每条指令为4个字节,所以PC值为正在执行的指令地址加8字节,即是:
PC值 = 当前程序执行位置 + 8字节
处理器处于Thumb状态时,每条指令为2字节,所以PC值为正在执行的指令地址加4字节,即是:
PC值 = 当前程序执行位置 + 4字节