Featured image of post CSAPP之四——处理器体系结构

CSAPP之四——处理器体系结构

继续深耕《深入理解计算机》

这是CSAPP第四章,作者想通过自己定义的Y86-64的ISA指令集定义、设计、编码以及制造一个简单的单周期流水线化的处理器。作者的思路也非常清晰,包括了上述的所有步骤,在每一步描述了嵌入了处理器设计的基本原则以及需要注意的技术细节。下面是设计的ISA的指令集

image.png

前置知识

堆栈操作

作者在4.1.6和4.3.3两次提到堆栈操作的特殊性,此处做一个基本的回顾。堆栈指令包括 popqpushq 两条,作者设计假定栈顶的地址始终保存在寄存器 %rsp 中,参考程序的机器级表示中的内容,有如下示意图

在理解上面过程之前,我们假设:

  • 堆栈中保存的是 8字节的元素,而且按照小端法存储的,即低有效位对应低地址;
  • 数据在内存中的地址,指的是整个数据的第一个字节在内存中的地址,例如保存一个2字节的数据 0x1234 在内存地址0x100处,那么0x100地址保存字节0x34,0x101处保存字节0x12。

结合上面的假设,很容易看出,

  • 堆栈是从高地址向低地址增长的,推入一个元素栈顶指针地址变小,弹出一个元素则变大;
  • %rsp 始终指向栈顶的最后一个元素的地址,也就是最后一个元素在内存中的起始地址

基于上面的两点,程序的操作就比较好理解了,初始状态 %rsp 中地址是0x108,

  • %rax 寄存器中的数据push进去,所以堆栈元素要增加8字节,为了将新的元素放到堆栈里面,先执行 %rsp = %rsp - 8,此时 %rsp 指向要入栈的新元素的起始地址0x100,这时就可以根据 %rsp 的其实地址连续存储8个字节的新元素了,这个操作类似于
    1
    2
    
    subq $8, %rsp // rsp = rsp - 8
    movq %rbp, (%rsp) // %rbp的元素拷贝到%rsp存储的地址处
    
  • 出栈就是相反的,当前的 %rsp 保存的就是需要弹出元素的地址,那么可以直接将该地址开始的连续8个字节先拷贝到目的地址,然后 %rsp = %rsp + 8,此时 %rsp 指向堆栈的新的最后一个元素的地址。等价于如下的操作
    1
    2
    
    movq (%rsp), %rax
    subq $8, %rsp
    

上面的操作可以保证,%rsp 始终指向栈顶元素的起始地址

条件传送 vs 条件分支

参考文献


本文原载于 巴巴变的博客,遵循 CC BY-NC-SA 4.0协议,复制请保留原文出处。

comments powered by Disqus