0x00e:30f480000000        |              irmovl $128,%esp  实现所有Y86指令所需要的计算分为6个基本阶段:取值、译码、执行、访存、写回和更新PC。

1、取指

A、取指阶段从存储器读取指令字节,地址为程序计数器(PC) 的值。从指令中抽取出指令指示符字节的两个四位部分,称为icode(指令代码)和ifun(指令功能)。

例1:rrmovl rA,rB指令,它的字节编码是2 0 rA rB,那么icode:ifun就是2:0。

B、它可能取出一个寄存器指示符字符,指明一个或两个寄存器操作数指示符rA和rB,这里的rA和rB与上面例子中的rA、rB位置相同。

例2: 
0x00e:30f480000000        |              irmovl $128,%esp 

那么 rA表示为f,rB表示为4

C、它还可能取出一个四字节常数字valC。 这个valC就是例2中的128

D、还有计算当前指令的下一指令的地址 valP,valP等于PC的值加上已取出指令的长度

最后我们以例2为例,系统的表达一下这个阶段发生了什么事情:

对于寄存器操作符有两个的操作,这个阶段的通用的表达为  icode:ifun←M1[PC]

rA:rB←M1[PC+1]

valC←M4[PC+2]

valP←PC+6

在例2中,是这样的:icode:ifun←M1[0x00e] =3:0

rA:rB←M1[0x00f] =f:4

valC←M4[0x010] =128

valP←0x00e+6=0x014

但是如果寄存器操作符不是两个,而是1个的时候,又会有什么不同呢?

例3:0x01a:a02f                         |                  pushl %edx

在这种情况下就没有了步骤C,其他步骤还是一样 。具体如下:

icode:ifun←M1[0x01a] =a:0

rA:rB←M1[0x01b] =2:f

valP←0x01a+2=0x01c 

注:上面M1[X]表示访问(读或写)存储器位置X处的一个字节,而M4[X]表示访问四个字节。

2、译码 

译码阶段从寄存器文件读入最多两个操作数,得到值valA和/或valB。

例4:subl %edx,%ebx     

其中%edx存储的值为9,%ebx存储的值为21,那么valA就会被赋值为%edx的值,valB就会被赋值为%ebx的值。

这个阶段要看具体的指令而定,如果只有一个操作数:

例5: pushl rA

此时发生的事为: valA被赋值为rA的值,valB被赋值为%esp的值,%esp就是栈指针

例6:popl rA

此时发生的事为:valA和valB都被赋值为%esp的值 

3、执行

在执行阶段,算术/逻辑单元(ALU) 要么执行指令指明的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值我们称为valE。

例7:irmovl $100,%esp 

此时的操作就相当于valE←0+100=100 

例8:pushl %edx

在32位系统中,pushl操作就是将栈指针向下移4个单位,就是减去4,假设此时的%esp为100,则valE←100-4=96,相反,popl操作就是加上4

4、访存 

访存阶段可以将数据写入存储器,或者从存储器读出数据。读出的值为valM。与这个阶段有关的操作指令主要是push和pop

例9:popl %eax

对于pop操作,属于读数据,因此用valM表示读出的值,valM←M4[valA] ,在此例中,valM被赋值为M4[%eax]

例10:pushl %edx  ,假设%edx表示的值为9,valE的值为124

对于push操作,属于写入数据,而写入数据的位置就是栈指针的位置,也就是用执行阶段得到的值valE。表示为M4[valE]←valA,在此例中,就是M4[124]←9

5、写回 

这个阶段将执行阶段得到的结果写入到rB,写回阶段最多可以写两个结果到寄存器文件。

例11:irmovl $128,%esp

此时会将valE写入到rB,而valE就是128,即R[%esp] ←valE=128

对于没有rB操作数的指令又会怎么办呢?

例12:popl rA

此时会发生R[%esp] ←valE

      R[rA] ←valM

而pushl操作没变,即R[%esp]←valE

6、更新PC

将PC设置成下一条指令的地址,就是将PC设置为valP

例13:
0x00e:30f480000000        |              irmovl $128,%esp 

PC←valP=0x014 ,具体分析同例2

Y86处理器的各个阶段的更多相关文章

  1. CS:APP2e Y86处理器模拟器∗指南

    CS:APP2e Y86处理器模拟器∗指南 Randal E.Bryant David R. O'Hallaron 2013年7月29日 本文档描述了处理器模拟器,伴随的表示在第4章Y86处理器架构的 ...

  2. 深入理解计算机系统(4.1)------Y86指令集体系结构

    本章我们将进入处理器体系结构介绍的神秘海洋中,我们熟悉的手机,电脑等设备的核心硬件都离不开处理器.处理器可以称的上是人类创造的最复杂的系统之一,一块手指大小的硅片,可以容纳一个完整的高性能处理器.大的 ...

  3. 用Dart&Henson玩转Activity跳转

    用Dart&Henson玩转Activity跳转 Extra是Android标准的组件之间(Activity/Fragment/Service等)传递数据的方式.本文介绍了开源项目Dart的使 ...

  4. verilog实现16位五级流水线的CPU带Hazard冲突处理

    verilog实现16位五级流水线的CPU带Hazard冲突处理 该文是基于博主之前一篇博客http://www.cnblogs.com/wsine/p/4292869.html所增加的Hazard处 ...

  5. Linux下C程序的编辑,编译和运行以及调试

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  6. javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。

    首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会 ...

  7. 【转】请求处理机制其二:Django中间件的解析

    Middleware 开始工作了 get_response 做的第一件事就是遍历处理器的 _request_middleware 实例变量并调用其中的每一个方法,传入 HttpRequest 的实例作 ...

  8. 【转】对Django框架架构和Request/Response处理流程的分析

    本文转载于疯狂的蚂蚁. 一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组成: 核心在于中间件middleware,django所有的请求.返回都由中间件来完成. ...

  9. 【Django】django 处理request流程细节(转)

    首先发生的是一些和 Django 有关(前期准备)的其他事情,分别是: 如果是 Apache/mod_python 提供服务,request 由 mod_python 创建的 django.core. ...

随机推荐

  1. [上传下载] C#FileUp文件上传类 (转载)

    点击下载 FileUp.zip 主要功能如下 .把上传的文件转换为字节数组 .流转化为字节数组 .上传文件根据FileUpload控件上传 .把Byte流上传到指定目录并保存为文件 看下面代码吧 // ...

  2. arcgis engine - 鹰眼在栅格图无法显示.

    一般,如果是矢量图,则不会出现这样的情况,鹰眼图无法显示,这时,只要在主控件的OnMapReplaced中显示指定鹰眼控制的空间参照,即可,如:在map_Big_OnMapReplaced方法中,添加 ...

  3. play app to war

    project/Build.scala import sbt._ import Keys._ import play.Play.autoImport._ import PlayKeys._ impor ...

  4. iframe中的各种跳转方法(转)

    一.背景A,B,C,D都是jsp,D是C的iframe,C是B的iframe,B是A的iframe,在D中跳转页面的写法区别如下. 二.JS跳转window.location.href.locatio ...

  5. root 密码丢失后的重新设置

    /usr/local/mysql/bin/mysqld_safe --skip-grant-tables & mysql> use mysql; mysql> update use ...

  6. PoshyTip jQuery 文本提示插件的使用

    PoshyTip 是JQuery中一款文本提示插件,在Jsp页面使用相当方便,插件内包含了很多外观样式,可以作为FormTooltips使用. 插件包下载地址:http://vadikom.com/f ...

  7. angularJS的controller之间如何正确的通信

    AngularJS中的controller是个函数,用来向视图的作用域($scope)添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为. 当我们在创建新的控制器时,angularJ ...

  8. sql 命令操作用法

    ---恢复内容开始--- 远程登录数据库: mysql -u root -p 要求输入密码 ============== 查看数据库: show databases;============= 选择数 ...

  9. ES6-个人学习笔记二--解构赋值

    第二期,解构赋值如果能够熟练应用确实是个十分方便的功能,但是过分的依赖和嵌套只会让代码理解和维护起来十分困难,是个体现高逼格的表达式呢~ 1,解构赋值的基础 //定义:es6运行按照一定模式,从数组或 ...

  10. C对字符串的部分操作

    字符串分割(C++)   经常碰到字符串分割的问题,这里总结下,也方便我以后使用. 一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char ...