20135316王剑桥 linux第五周课实验笔记

4.1.1程序员的可见的状态

————

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):表明程序执行的总体状态,它指示正常运行,或者发生某种异常.

4.1.2指令集

————

图2是Y86指令集的简单描述.与IA32的AT&T指令集相似.操作的数据都是4字节的. 指令编码长度1-6个字节不等.

指令的格式大抵是: icode:ifun rA:rB D,具体如下图所示:


指令分类


具体指令


说明


传送指令(XXmovl)

(4种)


指令



目的


irmovl


立即数


寄存器


rrmovl


寄存器


寄存器


mrmovl


存储器


寄存器


rmmovl


寄存器


存储器


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

4.1.3指令集编码

————

Y86指令1-6个字节不等.第一个字节表明指令的类型,其中高4位是代码(code)部分,低4位是功能码(function). Y86的代码值0~0xB.

图3给出了整数操作,条件传送和条件传送指令的具体编码(第一个字节),其他指令的功能码是0(可以功能扩展).

寄存器编码

——

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

4.1.4状态码和异常

————

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


一个适用的处理器,当处理器遇到异常,会调用一个异常处理程序.在Y86,当遇到异常时,直接让处理器停止执行指令.

4.2    逻辑设计和硬件控制语言HCL

实现一个数字系统需要三个主要组成部分:位运算函数的组合逻辑、存储器元素、时钟信号

VHDL的语法类似于Ada语言,而Verilog HDL的语法类似于C语言。

4.2.2    组合电路和HCL布尔表达式

组合电路的组成有两条限定:

1).    多个逻辑门的输出不能接在一起,否则会导致输入信号的矛盾。
    2).    必须是无环的。

4.2.3    字级的组合电路和HCL整数表达式

算术/逻辑单元(ALU)是一种很重要的组合电路。

4.2.5    存储器和时钟控制

组合电路在本质上不存储任何信息,只是简单的响应输入信号,并产生某个函数输出。为了产生时序电路——就是具有状态并以状态为基础进行计算的系统,必须引入按位存储信息的设备。

两类存储设备:

时钟寄存器:存储单个字
   随机访问存储器:存储多个字,用地址选择。例子包括虚拟存储器系统、寄存器堆;此处,寄存器标识符(ID)作为地址。

在硬件和机器级编程中,"寄存器"的含义有细微的差别。在硬件中,寄存器直接将其输入和输出线连接到电路的其它部分。在机器级编程中,寄存器代表CPU中为数不多的可寻址的字,这里的地址是寄存器ID。分别称这两类寄存器为硬件寄存器程序寄存器。

4.3 Y86的顺序实现

4.3.1将处理组织成阶段

取指(fetch)

取值阶段从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。

它按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)

译码(decode)

ALU从寄存器文件(通用寄存器的集合)读入最多两个操作数。(即一次最多读取两个寄存器中的内容)

执行(execute)

在执行阶段会根据指令的类型,将算数/逻辑单元(ALU)用于不同的目的。对其他指令,它会作为一个加法器来计算增加或减少栈指针,或者计算有效地址,或者只是简单地加0,将一个输入传递到输出。

条件码寄存器(CC)有三个条件位。ALU负责计算条件码新值。当执行一条跳转指令时,会根据条件码和跳转类型来计算分支信号cnd。

访存(memory)

访存阶段,数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。

写回(write back)

写回阶段最多可以写两个结果到寄存器文件。寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。

更新PC(PC update)

根据指令代码和分支标志,从前几步得出的信号值中,选出下一个PC的值。

我们以SEQ(sequential 顺序的)处理器为例讲解CPU的基本原理。每个时钟周期上,SEQ执行处理一条完整指令所需的所有步骤。不过这需要一个很长的时钟周期时间,因此时钟周期频率会低到不可接受。

SEQ的时序

 

组合逻辑不需要任何时序或控制——只要输入变化了,值就通过逻辑门网络传播。

我们也将随机访问存储器(寄存器文件、指令存储器和数据存储器)看成和组合逻辑一样的操作。(写随机访问存储器需要等待高电平)

由于指令存储器只用来读指令,因此我们可以将这个单元看成是组合逻辑。(内存向指令存储器中写指令是CPU外部的事件 不属于CPU内的时序)

每个时钟周期,程序计数器都会装载新的指令地址。

只有在执行整数运算指令时,才会装载条件码寄存器。

只有在执行mov、push、call指令时,才会写数据存储器。

要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制。

因为指令运行计算的结果,写入寄存器存储器中。

我们可以把取指、译码、执行等过程看做是组合逻辑的处理过程(因为它们不涉及写入寄存器)。把写回看做是另一个过程。

则整个过程可简化为下图所示:

学习中遇到的问题:

1.首先是对指令的不熟悉,有些地址变化不是很清楚,对指令的编码目前要借助书上的表格才能做到。以后要多多练习,增加熟悉程度。

2.对Y86的顺序实现只有抽象的认识,看了一遍书之后感觉很混乱,太多东西要记住,没有太多的实质认识,概念性东西太多了,通过实验操作更好的理解运用。

时间: 2024-10-14 01:05:35

20135316王剑桥 linux第五周课实验笔记的相关文章

20135316王剑桥 linux第四周课实验笔记

第三章 程序的机器级表示 3.1历史观点 Intel处理器的换代:8086——80286——i386——i486——Pentium——PentiumPro——PentiumII——PentiumIII——Pentium4——Pentium4E——Core2——Corei7. 这些所有的代都是Intel系列的,Intel系列本身有很多名字,比如x86,比如IA32,Intel系列中64位扩展称为x86-64.最常用的是x86.也就是说x86就是Intel每一代处理器的统称. 8086和80286的

第五周JAVA学习笔记(五)

将指定目录下的所有文件显示到列表框(JList)组件中, :效果图如下:                  import java.awt.BorderLayout; import java.io.File; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; public class kuang { public st

第五周总结&实验报告三

第五周总结&实验报告三 实验报告 1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) ① 统计该字符串中字母s出现的次数. ② 统计该字符串中子串"is"出现的次数. ③ 统计该字符串中单词"is"出现的次数. ④ 实现该字符串的倒序输出. ① 统计该字符串中字母s出现的次数. package test3; public class Zifu { public static v

Linux第五周上课笔记(1),rpm软件安装,yum源,yum仓库

第五周上课笔记 一.应用软件的安装 1.认识软件:|libmp3lame0|-3.99.3-23|.el7|.x86_64|.rpm 软件名     软件版本   适用系统 64位  红帽适用软件 2.如何安装软件 1.rpm rpm      -vih    name.rpm      安装,-v:显示过程,-h:指定加密方式为哈希加密 -e      name          卸载 -q      name          查询软件生成文件 -qlp  name.rpm        查

马哥Linux第五周作业

1.显示当前系统上root.fedora或user1用户的默认shell: PS:第一眼看到问题可能会有点头疼,那就把问题拆分完成,组合多个简单命令完成复杂工作 第一步,查找到这些用户并显示: 使用|或衔接多个过滤条件: [[email protected] ~]# grep -E "^root\>|^fedora\>|^user1\>" /etc/passwd   #grep -E也可使用egrep root:x:0:0:root:/root:/bin/bash u

linux第五周微职位

1.请描述网桥.集线器.二层交换机.三层交换机.路由器的功能.使用场景与区别. 1)集线器: 集线器(Hub)是指将多条以太网双绞线或光纤集合连接在同一段物理介质下的设备,主要功能是对接收到的信号进行放大,以扩大网络的传输距离,工作于OSI(开放系统互联参考模型)参考模型第一层,即"物理层". 集线器是一个多端口的中继器,只负责节点间数据的传递和信号的放大处理,检测冲突但不负责解决阻塞问题,所有端口处于同一个冲突域下.与二层设备如二层交换机区别在于不像交换机一样每个端口分隔冲突域,不具

Linux第五周作业

1.显示当前系统上root.fedora或user1用户的默认shell: egrep "^(root|user1|fedora)" /etc/passwd|cut -d: -f7 2.找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello(): egrep "^[[:alpha:]]+\(\)" /etc/rc.d/init.d/functions # 小括号必须转义,因为()在egrep中有特殊含义. 3.使用

Linux第五周

1.显示/boot/grub/grub.conf中以至少一个空白字符开头的行: [[email protected] ~]# grep '^[[:space:]]\+' /boot/grub/grub.conf          root (hd0,0)         kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/ rhgb quiet         initrd /initrd-2.6.18-128.el5.img 2.显示/etc/rc.d/

Linux第五周学习总结

作者:黎静 一.知识点总结 (一)给MenuOS增加time和time-asm命令 1.更新menu代码到最新版 2.test.c中main函数里,增加MenuConfig() 3.增加对应的两个函数,Time和TimeAsm函数 4.make rootfs自动编译脚本 (二)使用gdb调试跟踪系统调用内核函数sys_time 为处理time函数的系统调用systime设置断点之后,在menuOS中执行time.发现系统停在systime处.继续按n单步执行,会进入schedule函数. sys