注:以下内容均来自开源学习组织DataWhale
处理器体系架构
1 指令系统结构
根据“x86-64”指令集,定义了一个简化版“Y86-64”指令集。以下内容均基于“Y86-64”指令系统:
-
15个寄存器:
%rax %rsp %r8 %r12 %rcx %rbp %r9 %r13 %rdx %rsi %r10 %r14 %rbx %rdi %r11
其中%rsp被定义为栈指针,其他14个无固定含义
-
条件码:
零标识(ZF)、负号标志(SF)、溢出标志(OF)
-
程序计数器PC保存当前正在执行的指令的地址,状态码Stat表示程序执行的状态。
-
movq指令:其中r为寄存器,i为立即数,m为内存
例如:rrmovq rA, rB表示操作数rA是寄存器,操作数rB也是寄存器。
上图中每条指令的第一个字节表明指令的类型,这个字节分两部分,每部分占4个bits,高四位表示指令代码,第四位表示指令功能。
-
寄存器编号
其中F代表无寄存器,例如指令irmovq中源操作数为一个立即数,不是寄存器,所以在后面指令第二个字节的高四位为F
-
整数操作指令
-
跳转操作指令
-
数据传送指令
-
其他指令
其中halt表示停止指令,执行后处理器停止,并将状态码设为HLT;nop表示一个空操作;call和ret表示函数的调用和返回;push和pop为压栈和弹栈操作。
可以根据上述的指令编码,翻译一段Y86的汇编代码。
例如:rmmovq %rsp, 0x123456789abcd(%rdx)
上面这段汇编代码对应二进制表示为:
40 42 cd ab 89 67 45 23 01 00
40:rmmovq
42:4为%rsp编号,2为%rdx编号
cd ab 89 67 45 23 01 00:为23456789abcd补齐8个字节后的小端法存储形式
-
Y86-64中状态码
2 阶段
Y86-64处理器执行命令时分为如下6个阶段:
- 取址:处理器执行所有的指令都需要取址。在 Y86-64 指令系统中,指令的长度 不是固定的,因此取址阶段需要根据指令代码判断指令是否含有寄存器指示符、 是否含有常数来计算当前的指令长度。
- 译码:在译码阶段中,处理器从寄存器文件中读取数据。寄存器文件有两个读 端口,可以支持同时进行两个读操作。
- 执行:指令被正式执行的阶段。在该阶段中,算术逻辑单元(ALU)主要执行 三类操作:执行算术逻辑运算、计算内存引用的有效地址、针对 push 和 pop 指令的运算。
- 访存:对内存进行读写操作的阶段
- 写回:将执行结果写回到寄存器文件中
- 更新:将PC更新为下一条指令的地址