迪斯科广场舞思密达:寄存器

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 12:14:21
寄存器:--------------------------------------------------------------------------------
 
寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。寄存器分类
 
--------------------------------------------------------------------------------   1. 程序计数器PC (Program Counter)
   2.地址寄存器AR
   3.缓冲寄存器DR
   4.指令寄存器IR
   5.微地址寄存器μAR
   6. 微指令寄存器μIR
 
7.状态指令寄存器SR(status pointer)
 
8.通用寄存器(General purpose-registers)
 
9.堆栈指针寄存器(stack pointer)CPU原理示意性程序
 
--------------------------------------------------------------------------------注:下文称CPU原理示意性程序为:CPU_CODE
 
代码及说明如下:
 
 
 
//全局变量的定义—对应着CPU固有的各种寄存器
 
//控制寄存器
 
int IP;           //程序计数器
 
int AR;         //地址寄存器
 
int DR;         //数据缓冲寄存器
 
int PSW;      //状态字寄存器
 
//段寄存器
 
int CS;         //代码
 
int DS;         //数据段
 
int ES;         //附加段
 
int SS;         //堆栈段
 
//指针及变址寄存器
 
int SP;
 
int BP;
 
int DI;
 
int SI;
 
//数据寄存器
 
int AX;
 
int BX;
 
int CX;
 
int DX;
 
 
 
int interrupt;//是否有中断的标志 0-无,1-有虽然CPU没有寄存器与之对应,但是它的功能在CPU中是通过硬件电路来实现的。
 
//主入口函数:CPU加电时,从这里开始运行
 
int main()
 
{
 
   //全局变量的初始化,对应着硬件完成的关键寄存器的默认值
 
   //IP=0:CS=FFF0H确定了CPU执行的第一条机器指令的物理地址,
 
   //您是否记得,这就是BIOS ROM的入口地址,这样就可以解释
 
   //计算机就开始执行BIOS程序的原因了。
 
   IP=0;
 
   CS=FFF0H;
 
//while循环是CPU运行状态的表现,同时也代表着操作控制器的运行逻辑。
 
//这个循环也是CPU运行的原动力。
 
       while(1)
 
       {
 
       //取指令
 
       getCommand();
 
       //执行指令
 
       execCommand();
 
       //中断处理过程
 
       intProcess();
 
       }
 
}
 
//该函数主要是CPU的取指令操作的代码表示:
 
//CPU先将IP:CS传给AR,然后IP+1,通过AR获得指令,将指令送至指令寄存器,结束取指令的任务。
 
void getCommand()
 
{
 
       //PC(IP)的值赋给地址寄存器
 
       AR=IP;
 
       //PC+1,指向下一条将要执行的指令的偏移地址
 
       IP=IP+1;
 
       //地址寄存器+CS段存器-->指令的物理地址
 
   CS:IP->物理地址;
 
       //传送指令到指令寄存器
 
     
 
}
 
//在取指令任务结束后,指令寄存器内存放着从内存中取来的等待执行的指令。
 
//该执行指令函数:首先将按照约定的规则通过之列的某些特殊字段,把指令转化为微程序的入口地址,然后跳转到这个微程序的函数体去执行,具体的微操作。
 
void execCommand()
 
{
 
       //读取指令寄存器的内容,进行指令译码,根据不同的译码执行不同的微操作
 
     
 
       switch(ConvertCode(IR))
 
       {
 
              case 0:
 
                     add();
 
                     break;
 
              case 1:
 
                     sub();
 
                     break;
 
              case 2:
 
                     mov();
 
                     break;
 
              case 3:
 
                     in();
 
                     break;
 
              case 4:
 
                     out();
 
                     break;
 
              case 5:
 
                     push();
 
                     break;
 
              case 6:
 
                     pop();
 
                     break;
 
        default:
 
                     break;
 
       }
 
}
 
//中断的处理过程
 
void intProcess()
 
{
 
 
 
       if(interrupt==1)
 
       {
 
              //获得中断向量号
 
              //保护中断现场,目的是可以从中断处理程序返回后继续执行
 
              //根据中断向量号,算出中断处理程序的地址,赋值给程序计数器IP
 
       }
 
     
 
}
 
int ConvertCode()
 
{
 
       //根据特定的规则获得相应指令对应的微程序的入口地址
 
}
 
void add()
 
{
 
       //加法的微程序指令
 
}
 
void sub()
 
{
 
       //减法的微程序指令
 
}
 
void mov()
 
{
 
       //mov微程序指令
 
 
 
}
 
void in()
 
{
 
       //IN 的微程序指令
 
}
 
void out()
 
{
 
       //OUT 的微程序指令
 
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/loverszhaokai/archive/2010/11/28/6041356.aspx