标签:
1、计算机系统只限于机器语言程序级。
2、指令被编码为有一个或多个字节序列组成的二进制格式。一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构(ISA)。
3、虽然每个厂商制造的处理器性能和复杂性不断提高,但是不同型号在ISA级别上都保持着兼容。因此,ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层,编译器编写者只需要知道允许哪些指令,以及他们是如何编码的。而处理器设计者必须建造出执行这些指令的处理器。
4、现代处理器的实际工作方式可能跟ISA隐含的计算模型大相径庭。ISA模型看上去应该是顺序指令执行,也就是先取出一条指令,等到它执行完毕,再开始下一条。
5、在Web浏览器或平衡二叉树和哈希表这样的信息检索数据结构中使用缓存,能够在提高性能的同时,又保持一个更简单、更抽象模型的功能。
6、HCL:一种描述硬件系统控制部分的简单语言,可用于描述处理器设计。
7、在本章中,我们定义一个简单地不完备的指令集,称之为“Y86”指令集。它基于顺序操作、功能正确但有点不实用。由于处理器的每个时钟周期执行一条完整地Y86指令,因此它的时钟必须足够慢,以允许在一个周期内完成所有动作。随后,我们创建一个流水线化的处理器,这个处理器将每条指令的执行分解成五步,每个步骤由一个独立的硬件部分或阶段来处理。指令步经流水线的各个阶段,且每个时钟周期有一条新指令进入流水线,所以处理器可以同时执行五条指令的不同阶段。因此要求处理器能够处理很多冒险或冲突。冒险就是一条指令的位置或操作数依赖于其他仍在流水线中的指令。
定义一个指令集体系结构,包括定义各种状态元素、指令集和他们的编码、一组编程规范和异常事件处理。
程序员可见状态:程序中的每条指令都会读取或修改处理器状态的某些部分。
Y86中包含:
①程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp。他们都可以存储一个字。%esp被入栈、出栈、调用和返回指令作为栈指针。
②PC(程序计数器):存放当前正在执行指令的地址。(在IA32中,用%eip表示,指示将要执行的下一条指令在存储器中的地址。)
③程序存储器:就是一个很大的字节数组,保存着程序和数据。Y86用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址,指明数据实际保存在存储器中哪个地方。
④条件码:ZF、OF、SF。都是一位条件码,用来保存最近的算术或逻辑指令所造成影响的有关信息。
⑤Stat:程序状态的最后一个部分是状态码,它表明程序执行的总体状态。它会指示是正常运行还是出现了某种异常。
①在movl指令中,指令名字的第一个字母就表明了源类型。指令第二个字母指明了目的类型。立即数(i)、寄存器(r)、存储器(m)。两个存储器传送指令中的存储器引用方式是简单地基址和偏移量形式。在地址计算中,不支持第二变址寄存器和任何寄存器值的伸缩。不允许从一个存储器地址直接传送到另一个存储器地址,也不允许将立即数传送到存储器。
②addl,subl,andl,xorl是四个整数操作指令,Y86中只允许对寄存器数据进行操作(IA32中还允许对存储器数据进行操作),这些指令会设置条件码ZF、SF、OF。
③jmp,jle,jl,je,jne,jge,jg是七个跳转指令,根据分支指令的类型和条件码的设置来选择分支。
④cmovle,cmovl,cmove,cmovne,cmovge,cmovg是六个条件传送指令,这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
⑤call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回。
⑥pushl和popl指令实现了入栈和出栈。
⑦halt指令停止指令的执行(IA32中的指令hlt)。IA32中应用程序不允许使用这条指令,因为它会导致整个系统暂停运行。对于Y86而言,执行halt指令会导致处理器停止,并将状态码设置为HLT。
①在上图中还可看见指令的字节级编码。每条指令需要1-6个字节不等。每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分。功能值只有在一组相关指令共用一个代码时才有用。
②如图,8个程序寄存器中每个都有相应0-7的寄存器标示符,Y86与IA32的寄存器编号一致。程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID为地址的随机访问存储器。当需要指明不应访问任何寄存器时,就用ID值0xF来表示。
③有的指令只有一个字节长,因为可能附加有寄存器指示符字节,指定一个或两个寄存器。这些寄存器字段为rA,rB。有则有,无则无,只有一个的则将第二个设为0xF。
④有的指令需要一个附加的4字节常数字作为立即数数据或地址指示符偏移量或分支指令和调用指令的目的地址。所有整数采用小端法编码。
注意:分支指令和调用指令的目的地址是一个绝对地址,而不是像IA32中那样使用PC相对寻址方式。处理器用PC相对寻址方式,分支指令的编码会更简洁,同时这样也能允许代码从存储器的一部分复制到另一部分,而不需要更新所有的分支目标地址。
例如:
⑤指令集的一个重要性质就是字节编码必须有唯一的解释。这个性质保证了处理器可以无二义性地执行目标代码程序。即使代码嵌入在程序的其他字节中,只要从序列的第一个字节开始处理,我们仍然可以很容易地确定指令序列。反过来说,如果不知道一段代码序列的起始位置,我们就不能准确地确定怎样将序列划分成单独的指令。
标签:
原文地址:http://www.cnblogs.com/paperfish/p/4883061.html