要点一:
一个处理器支持的指令和指令的字节级编码成为它的指令集体系结构(ISA)。不同的处理器家族都有不同的isa。
这也决定了一个程序在一种处理器上编译了以后就不能在另一种处理器上运行。
要点二:
在Y86中程序员的可见状态分别为八个程序寄存器(每个存储一个字)、三个一位的条件码、计数器pc以及存储器。
但在Y86-64中,则有15个程序寄存器(这里省略了x86-64的寄存器%r15以简化指令的编码,每个存储64位的字)、pc、程序状态的状态码和内存。
内存从概念上来说就是一个很大的字节数组,保存着程序和数据。Y86程序用虚拟地址来引用内存位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址,指明数据实际存在内存中的哪个地方。
要点三:
那么以下就是Y86的指令集和所占大小:
table4
在movl指令中,前两个字母分别表示了源和目的的格式。源可以是立即数(i)、寄存器(r)或内存(m),第一个字母指明源的类型;目的可以是寄存器(r)或内存(m),第二个字母指明了目的类型。并且该指令不允许从一个内存地址直接传送到另一个内存地址,也不允许将立即数传送到内存。
其余的指令与x86类似。
要点三:
每条指令需要1-6个字节不等(Y86-64则是1~10),每条指令的第一个字节表面指令的类型。这个字节分为两部分,每部分四位:高四位是代码部分,低四位是功能部分。代码值位0-B(十六进制);功能值只有在一组相关指令公用一个代码时才有用。
要点四:
八个程序寄存器中每个都有相应的0~7的寄存器标识符(64中则是15个,0~0xE),当指明不需要访问任何一个寄存器的时候,就只需要将ID值8(64为0xF)用于指令代码中。
期间还要注意字节长度,如果不够需要补充。
要点五:
关于复杂指令集(CISC)和精简指令集(RISC)的对比:
CISC | RISC |
指令数量很多,Intel描述全套指令的文档有700多页长 | 指令数量少得多。通常少于100个 |
有些指令的执行时间很长 | 没有较长的执行时间的指令。 |
编码是可变长度的。IA32的指令长度可以是1~15 | 编码是固定长度的,通常所有的指令都编码为4字节 |
指定操作数的方式很多样 | 简单寻址方式(只有基址和位移寻址) |
可以对存储器和寄存器操作数进行算术和逻辑运算 | 只能对寄存器操作数进行算术和逻辑运算。允许使用存储器引用的只有load和store指令。 |
对机器级程序来说实现细节是不可见的。 | 对机器级程序来说实现细节是可见的 |
条件码 | 没有条件码 |
栈密集的过程链接 | 寄存器密集的过程链接 |
要点六:
大多数的Y86是以一种直接明了的方式修改程序状态的,所以定义每条指令想要达到的结果并不困难。
值得注意的是:
push指令会把栈指针减4(64是-8),并且将一个寄存器值写入存储器中。也就是说,当执行pushl %esp指令时,处理器的行为是不确定的(指push的内容),因为腰入栈的寄存器会被同一条指令修改,通常有两种约定:①压入%esp的原始值;②压入减了4的%esp的值。
要点七:
将很多逻辑门组合成成一个网,就能构建计算块,称为组合电路。
但是构建时有几个限制:
①每个逻辑门的输入必须连接到下述选项之一:1)一个系统输入;2)某个存储器单元的输出;3)某个逻辑门的输出
②两个或多个逻辑门的输出不能连接在一起,否则它们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障
③这个网必须是无环的。也就是在网中不能有路径经过一系列的门而形成一个回路,这样的回路会导致该网络计算的函数有歧义
逻辑门有下面三个:
下面是一个简单的组合电路
结合之前的逻辑门分析,可以得出这是一个判断相等的电路。
同时,还有另一个简单但很有用的组合电路,成为多路复用器。多路复用器根据输入控制信号的值,从一组不同的数据信号中选出一个。
要点七:
通过将逻辑门组成一个更大的网,我妹可以构造出能计算更加复杂函数的组合逻辑。
组合逻辑电路可以设计成在字级数据上执行许多不同类型的操作。
算术/逻辑单元(ALU)是一种很重要的组合电路。
要点八:
组合电路从本质上讲,不存储任何信息(毕竟只是一个输入输出的过程)。相反,它们只是简单地响应输入信号,产生等于输入的某个函数输出。为了产生时序电路,也就是有状态并且在这个状态上进行计算的系统,就得引入按位存储信息的设备:
时钟寄存器(存储单个位或字,时钟信号控制寄存器加载输入值)
随机访问存储器(存储多个字,用地址来选择该读或该写哪个字)
这是寄存器的工作流程:
接下来是存储器:
要点九:
处理器的执行操作流程:
取指:取指阶段从存储器读入指令,地址为程序计数器(PC)的值。
解码:解码阶段从寄存器文件读入最多两个操作数,得到值valA和valB.
执行:在执行阶段,ALU要么执行指令指明的操作,计算存储器引用的有效地址,要么增加或减少栈指针。
访存:访存阶段可以将数据写入存储器,或者从存储器读出数据。
写回:写回阶段最多可以些两个结果到寄存器文件。
更新PC:将PC设置成下一条指令的地址
要点十:
HDL与C的区别:
组合电路的输出持续随输入变化,而C语言只会在程序执行中被遇到时才求值
C语言中0为false,其余都为true;而HDL只有0和1
C语言表达式可能被部分求值(例如&&、||),而HDL没有这种规则,只是简单地相应输入的变化