CSAPP学习笔记(五)

Posted by HK on February 6, 2019

第四章 主要介绍处理器引荐的设计。研究一个硬件系统执行某种ISA指令的方式,更好地理解计算机是如何工作的。了解一个系统的内部工作原理。

第四章 处理器体系结构

定义一个简单的指令集x86,作为处理器实现的运行示例,称指令集为“Y86-64”(字节编码比较简单,机器代码没有x86-64紧凑)

Y86-64指令集体系结构

定义一个指令集体系结构包括定义各种状态单元、指令集和它们的编码、一组编程规范和异常事件处理。

Y86-64程序中的每条指令都会读取或修改处理器状态的某些部分,成为程序员可见状态(程序员也可以是产生机器级代码的编译器)。

Y86-64程序员可见状态:有15个程序寄存器RF(%rax、%rcx、%rdx、%rbx、%rsp、%rdp、%rsi、%rdi、%r8-%r14)(寄存器%rsp被入栈、出栈、调用和返回指令作为栈指针,除此寄存器没有固定的含义或固定值),3个一位的条件码CC(ZF、SF、OF),程序计数器PC存放当前正在执行指令的地址,内存DMEN,程序状态Stat(程序状态的最后一个部分是状态码Stat,指示正常运行或出现某种异常)。

内存:一个保存着程序和数据的很大的字节数组。Y86-64程序用虚拟地址来引用内存位置。

Y86-64指令

Y86-64指令集只包括8字节整数操作。

  • x86-64的movq:irmovq、rrmovq、mrmovq、rmmovq(立即数i、寄存器r、内存m,前面是源的类型,后面是目的的类型)。
  • 整数操作指令:addq,subq,andq,xorq(只对寄存器的数据进行操作)这些指令会设置3个条件码ZF、SF、OF。
  • 跳转指令jXX:jmp、jle、jl、je、jne、jge、jg。
  • 条件传送指令:cmovle、cmovl、cmove、comvne、comvge、comvg。
  • call指令返回地址入栈,然后跳到目的地址。ret指令返回。
  • pushq指令入栈、popq指令出栈。
  • halt指令停止指令的执行,会导致处理器停止,并将状态码设置为HLT。

指令编码长度从1word-10word不等。

img

指令编码

每条指令的第一个字节表明指令的类型,这个字节高4位是code部分,低四位是function部分。代码值为0-0xB,功能值只有在一组相关指令共用一个代码时才有用。

Y86-64指令集的功能码

每个程序寄存器都有一个对映范围在0-0xE之间的寄存器标识符register ID。程序寄存器存在CPU中的一个寄存器文件中,,这个寄存器文件就是一个小的、以寄存器ID作为地址的随机访问存储器。(当需要知名不因访问任何寄存器时用ID值0xF表示)

附加的寄存器符指示字节指定一个或两个寄存器。一个附加的8字节常数字能最irmovq的立即数据,rmmovq和mrmov的地址指示符的偏移量,以及分支指令和调用指令的目的地址。(分支指令和调用指令的目的是一个绝对地址,而非使用相对寻址)

Y86-64异常

img

任何AOK以外的代码都会使处理器停止。

Y86-64指令特例

pushp指令会将栈指针减8并将一个寄存器值写入内存中。故执行%rsp指令时,由于要入栈的寄存器会被童一条指令修改,处理器的行为是不确定的。故通常约定:压入%rsp的原始值或压入减去8的%rsp的值。

popq指令一样,可将%rsp置为从内存中读出的值或增量后的栈指针。

逻辑设计和硬件控制语言HCL

逻辑门

AND、OR、NOT,逻辑门只对单个位的数进行操作,而不是整个字。

逻辑门总是活动的,一旦一个门的输入变化了,在很短的时间内,输出就会相应地变化。

组合电路和HCL布尔表达式

多个逻辑门组成一个网,网构成计算块,即组合电路。

构建网的限制:

  1. 每个逻辑门的输入必须为一个系统输入(主输入)或某个存储单元的输出或某个逻辑门的输出。
  2. 两个或多个逻辑门的输入不能连接在一起。
  3. 网必须是无环的,即不能形成回路。

字级的组合电路和HCL整数表达式

在HCL中所有的字级信号都声明为int,不指定字的大小。