处理器体系结构·四
扫描二维码
随时随地手机看文章
第4章 处理器体系结构·四
关键词:处理器体系结构,汇编语言,指令集,硬件控制语言,寄存器和存储器
一个处理器支持的指令和指令的字节级编码成为它的ISA(instruction-set architecture,指令集体系结构)。
ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层,编译器编写者只需要知道允许哪些指令,以及它们是如何编码的;而处理器设计者必须建造出执行这些指令的处理器。
4.1 处理器设计的特点
1 从智力方面来说,处理器设计是非常有趣的。它需要完成复杂的人物,而结构又要尽可能简单。
2 理解处理器是如何工作的能帮助理解整个计算机系统是如何工作的。
3 虽然很少有人设计处理器,但是许多人设计包含处理器的硬件系统。
4 你的工作可能就是处理器设计。
4.2 Y86指令集体系结构
Y86的处理器状态类似于IA32。有八个寄存器(program register):%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp。处理器每个程序寄存器储存一个字。寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。而其它寄存器没有固定的含义或固定值。有三个一位的条件码(condition
code):ZF、SF、OF,它们保存着最近的算术或逻辑指令造成影响的信息。程序计数器(PC)里存放着当前正在执行执行的地址。存储器从概念上来说就是一个很大的字节数组,保存着程序和数据。Y86用虚拟地址来引用存储器位置。硬件和操作系统如眼见联合起来将虚拟地址翻译成指明数据实际存在存储器中哪个地方的实际或物理地址。
1 Y86的指令细节
(1)IA32的movl指令分成了四个不同的指令:irmovl、rrmovl、mrmovl、rmmovl,分别显式地指明源和目的的格式。源可以是立即数(i)、寄存器(r)或存储器(m)。指令名字的第一个字母指明了目的的类型。两个存储器传送指令中的存储器引用方式是简单的基址加位移形式。在地址计算中,我们不支持第二变址寄存器(second
index register)和任何寄存器值的伸缩(scaling)。同IA32一样,我们不允许从一个存储器地址直接传送到另一个存储器地址。另外我们也不允许将立即数传送到存储器。
(2)有四个整数操作指令,就是OPI。它们是addl、subl、andl、xorl。它们只对寄存器数据进行操作,而IA32还允许对存储数据进行这些操作。这些指令会设置三个条件ZF、SF、OF(零、符号、溢出)。
(3)七个跳转指令。是jmp、jle、jl、je、jne、jge、jg。根据转移指令的类型和条件代码的设置来选择转移。转移条件和IA32的一样。
(4)call指令返回地址入栈,然后跳到目的地址。ret指令从这样的过程中返回。
(5)pushl和popl指令实现了入栈和出栈,就像在IA32中一样。
(6)halt指令停止指令的执行。IA32中有一个与之相当的指令叫hlt。IA32的应用程序不允许使用这条指令,因为他会导致整个系统停止。在Y86程序中用halt指令来停止模拟器。
指令集的一个重要性质就是字节解释必须有唯一的解释。任意一个字节序列要么是一个唯一的指令蓄力的编码,要目就不是一个合法的字节序列。这个性质保证了处理器可以无二义性地执行目标代码程序。
2 IA32HE Y86的指令编码的比较
同IA32中的指令编码相比,Y86的编码简单的多,但是也没有那么简洁。在所有的Y86指令中,寄存器字段的位置都是固定的,而在不同的IA32指令中,它们的位置是不一样的。即使最多只有8个寄存器,我们也对寄存器采用了4位编码。IA32只用了3位编码。所以IA32能将入栈或出栈指令放在一个自接力,5位字段表明指令类型,剩下的3位是寄存器指示符。IA32可以将常数值编码成1、2或4个字节,而Y86总是将常熟之编码成4个字节。
4.3 逻辑设计和硬件控制语言HCL
要实现一个数字系统需要三个主要部分:计算位的函数的组合逻辑、存储位的存储器元素,以及控制存储器元素更新的时钟信号。
HCL:(hardware control language),硬件控制语言。
1 HCL和C语言的区别
(1)因为组合电路是由一些逻辑门组成的,它有两个属性就是输出会持续地响应输入的变化。相比之下,C表达式只会在程序执行过程中被遇到时才进行求值。
(2)C的逻辑表达式允许参数是任意整数,0表示FALSE,其它任何值都表示TRUE。而我们的逻辑门只对位值0和1进行操作。
(3)C的逻辑表达式有个属性就是它们可能只被部分求值。如果一个AND或OR操作的结果只用第一个参数求值就能确定,那么就不用对第二个参数求值了。而组合逻辑没有部分求值这条规则,逻辑门只是简单地响应它们输入的变化。
2 存储器和时钟控制
组合电路从本质上讲,不存储任何信息,相反,它们只是简单地响应输入信号,产生等于输入的某个函数输出。为了产生时序电路,也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位存储信息的设备。
时钟寄存器:(简称寄存器)存储单个位或字。时钟信号控制寄存器加载输入值。
随机访问存储器:(简称存储器),存储多个字,用地址来选择该读或写哪个字。
4.4 Y86的顺序实现
处理一条指令包括很多操作。我们将他们组织成某个特殊的阶段序列,使即使指令的动作差异很大,但所有的指令都遵循统一的序列。每一步的具体处理取决于正在执行的指令。各个阶段以及各阶段内执行操作的简略描述。
取指(fetch):取指阶段从存储器读入指令,地址为程序计数器(PC)的值。
译码(decode):译码阶段从寄存器堆读入最多两个操作数。
执行(execute):在执行阶段,算术/逻辑单元(ALU)要么执行指令指明的操作,计算存储器引用的有效地址,要么增加或减少栈指针。
访存(memory)访存阶段可以将数据写入存储器,或者从存储器读出数据。
写回(write back):写回阶段最多可以写两个结果到寄存器堆。
更新PC(PC update):将PC设置成下一条指令的地址。
处理器无限制地循环执行这些阶段,只有在遇到halt指令或一些错误情况时,才会停下来。我们处理的错误情况包括非法存储器地址(程序地址或数据地址),以及非法指令。
参考文献
布赖恩特, O'Hallaron D, et al. 深入理解计算机系统[M]. 中国电力出版社, 2004.