处理器的主要作用就是执行指令,那么设计处理器的第一步就是要定义或者兼容指令集体系结构(Instruction Set Architecture,ISA). 定义一个指令集体系结构,包括定义各种状态元素,指令集及编码,一组编程规范和异常事件处理.
传统的指令集的设计理念主要分为CISC和RISC两种设计理念.现代处理器比如IA32体系结构的指令集,已经不是单纯的CISC,设计时候已经结合了RISC的精华.
本文介绍的Y86 ISA是IA32的一个简化版本(子集),操作集较少,寻址方式较少. (注*)
程序员的可见的状态
————
Y86的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态.如图1所示.

1.程序寄存器(Program registers): %eax, %ecx, %edx, %ebx, %esi,%edi, %esp和%ebp.都是32位的.
2.条件码(Condition codes): ZF(零标志), SF(符号标志), OF(溢出标志).用来保存最近的算术或逻辑指令造成的影响.
3.程序计数器(PC):存放当前正在执行的地址.
4.存储器(Memory):在程序员看来, Y86程序使用虚拟存储器.
5.状态码(State):表明程序执行的总体状态,它指示正常运行,或者发生某种异常.
指令集
————
图2是Y86指令集的简单描述.与IA32的AT&T指令集相似.操作的数据都是4字节的. 指令编码长度1-6个字节不等.
指令的格式大抵是: icode:ifun rA:rB D,具体如下图所示:
指令分类 | 具体指令 | 说明 | |||||||||||||||
传送指令(XXmovl) (4种) |
| Y86指令的寻址方式单一:基址+偏移量. | |||||||||||||||
算术逻辑指令(opl) (4个) | addl, subl, andl, xorl | 这4个指令的执行会设置条件码(CC). | |||||||||||||||
跳转指令(jxx) (4个) | jmp, jle, jl, je, jne, jge, jg | jmp是无条件跳转指令,其他是条件跳转指令 (根据条件码选择分支). | |||||||||||||||
条件传送指令(cmovXX) (6个) | cmovle, cmovl, cmove, cmovne, cmovge, cmovg | 根据条件码选择是否更新目的寄存器. | |||||||||||||||
call/ret指令 | call/ret | call将返回地址入栈,跳转目的地址. ret指令从过程调用中返回. | |||||||||||||||
pushl/popl指令 | pushl/popl | 入栈和出栈操作. | |||||||||||||||
halt指令 | halt | 停止执行指令指令.设置Stat位HLT. | |||||||||||||||
nop指令 | nop |
|
指令集编码
————
Y86指令1-6个字节不等.第一个字节表明指令的类型,其中高4位是代码(code)部分,低4位是功能码(function). Y86的代码值0~0xB.
图3给出了整数操作,条件传送和条件传送指令的具体编码(第一个字节),其他指令的功能码是0(可以功能扩展).

寄存器编码
——
为了方便,每个程序寄存器使用4位编码,其中F表示无寄存器.

状态码和异常
————
状态码(Stat)是程序员可见的状态之一,用来描述程序执行的总体状态.详见图5.

一个适用的处理器 , 当处理器遇到异常 , 会调用一个异常处理程序 . 在 Y86 , 当遇到异常时 , 直接让处理器停止执行指令 .
注*:本篇中的图片均来自本书的官网,详见http://csapp.cs.cmu.edu/public/figures.html
Copyright© 2011, Randal E. Bryant and David R. O'Hallaron
reference:
(版权所有,转载时请注明作者和出处-dennis_fan-http://blog.youkuaiyun.com/dennis_fan )