3. ARM 指令集架构
相比于前一节课讲的 lc2k isa, arm 架构的效果会好很多
ISA 的分类
RISC 架构,Reduced Instruction Set Computing
指令数量更少,编码的指令长度是一致的,硬件设备相对更加简单,程序更大,手写会更加困难,但是当前非常常用
应用: lc2k, risc-v, arm (包括其子集 LEG)
CISC 架构,Complex Instruction Set Computing
用更多、更复杂的指令集,编码的指令的长度是不一定的,所以硬件更复杂,程序的长度更短,手写更方便,现在比较少用了
应用: x86
指令及其分类
算术指令 Arithmetic
格式:3 operand fields, 一般会将 destination 寄存器放在第一位
- ADD X1, X2, X3: 将 X2 + X3 的结果转存到 X1 寄存器中
- 这个和 lc2k 是反的
- 只能操作于
ARM 指令集存储形式
| opcode | Rm | shamt | Rn | Rd | 存储了一个指令集
其中 Rm 表示第二个 register operand, Rn 表示第一个 register operand, Rd 表示 destination operand. 这个存储顺序和输入顺序并不一致,或者说相反
第二operand的格式
可以是一个立即数或者一个register 地址,如果是立即数,我们会在数字的前面加上一个 # 符号标注
例如 ADDI X3, X4, #10 表示 X4 + 10 -> X3
其他常用 算术指令
ORR: inclusive or: 按位或EOR: exclusive or: 按位或LSL: logical shift left:LSL X1 X2 #10X2<<10 -> X1LSR: logical shift right
内存指令集 memory instructions
word 单词
表示几个字节的组合,在 lc2k 以及 arm 中,一个 word 通常是 4 个字节 32 位
有些地方写的 double word 就表示 8 字节
注意这里的 word 并不等于 char 之类的字符命令,只是一个长度单位,也可以用于指代长度 4 字节的 int
可寻址性 addressable
lc2k 指令集架构下,word 是可寻址的,也就是说,每个地址会指向内存中某个特定的 word,同时这也要求在 lc2k 的内存中 指令必须每 4 字节对齐一次,或者说PC 等指针在内存中的移动长度单位是 4 字节
移动 1 字节(比如 1 char)是非法的
相比较下, ARM 架构是 byte addressable,即每个地址指向一个字节,每次移动的单位也是1字节,可以逐个遍历一个字符串的每一个 char,更可以遍历每个 int (一次性读取 4 个字节)
LEGv8 内存指令代码
与 lc2k 指令一样,基于 base + displacement 的寻址方式,base为一个寄存器,displacement 为一个9位立即数,范围为 -256 ~ 255, 其寄存器长度为 64 位,因此从内存中读取的 数据会被扩展到 64 位,且需要经过 sign extension
LDUR: Load Register,LDUR X1 [X2, #40]表示X1 = MEM[X2 + 40]一次性读取64位STUR: Store Register,STUR X1 [X2, #40]表示MEM[X2 + 40] = X1一次性存储64位LDURSW: Load Register Signed Word,LDURSW X1 [X2, #40]表示X1 = MEM[X2 + 40]一次性读取,但是会将读取的值扩展为 64 位STURW: Store Register Word,STURW X1 [X2, #40]表示MEM[X2 + 40] = X1但是会截断为 32 位LDURH: Load Register Halfword,LDURH X1 [X2, #40]表示X1 = MEM[X2 + 40]一次性读取,但是会将读取的值扩展为 64 位STURB: Store Register Byte,STURB X1 [X2, #40]表示MEM[X2 + 40] = X1但是会截断为 8 位MOVZ: Move with Zero,MOVZ X1, #10, LSL #2表示X1 = 10 << 2,常用于一个寄存器的初始化,将某几个位置变成指定的 16 位数字,其他位置初始化为 0MOVK: Move with Keep,MOVK X1, #10, LSL #2表示X1 = X1 | 10 << 2,常用于一个寄存器的初始化,将某几个位置变成指定的 16 位数字,其他位置保持不变
命名特点
- ‘SW’ 表示 signed word,有符号的 word
- ‘H’ 表示 halfword,半字,16 位
- ‘UR’ 表示 unsigned register,无符号寄存器
