20144303 第六周 半周学习总结

20144303 半周学习总结

第四章 处理器体系结构

一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构(ISA),不同的处理器家族有不同的ISA。

现代处理器的工作方式可能跟ISA隐含的计算模型大相径庭。ISA模型看上去应该是顺序指令执行,然而,与一个时刻只执行一条指令相比,通过同时处理多条指令的不同部分,能提高处理器的性能。

HCL:硬件控制语言

4.1 Y86指令集体系结构

1、Y86指令集:

Y86指令的更多细节:

  • IA32的movl指令分成了4个不同的指令:irmovl、rrmovl、mrmovl和rmmovl
  • 两个存储器传送指令中的存储器引用方式是最简单的基址和偏移量形式。在地址计算中,我们不支持第二变址寄存器和任何寄存器值的伸缩。
  • 同IA32一样,不允许从一个存储器地址直接传送到另一个存储器地址。另外,也不允许将立即数传送到存储器。
  • 有4个整数操作指令:addl、subl、andl、xorl。
  • 6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg。
  • 7个跳转指令:jmp、jle、jl、je、jne、jge、jg
  • call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回
  • halt指令停止指令的执行。IA32中有一个与之相当的hlt。

2、指令编码:

每条指令的第一个字节表示指令的类型。这个字节分为两个部分,每部分4位。高4位是代码部分,第4位是功能部分。

功能值只有在一组相关指令共用一个代码时才有用。

Y86指令集的功能码:

所有整数采用小端法编码。当指令按照反汇编格式书写时,这些字节就以相反的顺序出现。

指令集的一个重要性质就是字节编码必须有唯一的解释。

3、Y86异常:

在更完整的设计中,处理器就会经常调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。异常处理程序可以被配置成不同的结果。

创建Y86唯一的工具就是汇编器。

YIS(指令集模拟器),它的目的是模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为。

4、Y86指令的详情

pushl指令会把栈指针减4,并且讲一个寄存器值写入存储器中。因此,执行pushl的时候,处理器的行为是不确定的,因为要入栈的寄存器会被同一条指令修改。通常有两种约定:

  1. 压入%esp的原始值
  2. 压入减去4的%esp的值

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

1、逻辑门

逻辑门是数字电路的基本计算元素。他们产生的输出,等于他们输入位值的某个布尔函数。

AND &&
OR ||
NOT !

逻辑门符号与C语言符号不同,是因为逻辑门只对单个位的数进行操作,而不是整个字。

逻辑门总是活动的。一旦一个门的输入变化了,在很短时间内,输出就会相应的发生变化。

将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。构建这些网有两条限制:

  • 两个或多个逻辑门的输出不能连接在一起,否则他们可能会使线上的信号矛盾,可能会导致下一个不合法的电压或电路故障。
  • 这个网必须是无环的。也就是不能形成一个回路。

HCL表达式和C语言中表达式的区别:

  • 因为组合电路是由一系列逻辑门组成,它的属性是输出会持续的响应输入的变化,如果电路的输入变化了,在一定的延迟之后,输出也会相应的变化。相比之下,C表达式只会在程序执行过程中被遇到时才进行求值。
  • C的逻辑表达式允许参数是任意整数,0表示FALSE,其他的任何值都表示TRUE。而逻辑门只有0、1.
  • C的逻辑表达式有个属性就是他们可能只被部分求值。如果一个AND或者OR操作结果只用对第一个参数求值就能确定,就不用在对第二个参数求职了。而组合逻辑没有部分求值这条规则,逻辑门只是简单的响应输入的变化。

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

执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。

在HCL中,我们将所有字级的信号都声明为int,不指定字的大小

在HCL中,多路复用函数是用情况表达式来描述的。每种情况i都有一个布尔表达式select和一个整数表达式expr。前者表示什么时候该选择这种情况,后者表示得到的值

算术/逻辑单元(ALU)是一种很重要的组合电路。这个电路有3个输入:标号为A和B的两个数据输入,以及一个控制输入。

3、存储器和周期:

时钟寄存器:简称寄存器。存储单个位或字。时钟信号控制寄存器加载输入值

随机访问存储器:简称存储器。存储多个字,用地址来选择该读或该写哪个字。

寄存器文件有两个读端口(A和B),还有一个写端口W。这样一个多端口随机访问存储器允许同时进行多个读和写的操作。每个端口都有一个地址输入,表明该选择哪个程序寄存器。

例题分析和问题:

4.1:

这道题是要把指令序列转换成字节编码。做法就是先根据图4-2找出每个指令对应的字节编码,然后按照其格式和规定,参照图4-3中功能码和4-4中寄存器名字对应的数字,完成每行指令的转换。

比如:第2行的 irmovl $15,%ebx

先看irmovl对应的格式,应该是30FrBV,所以,只要知道rB和V对应的字节编码即可,根据图4-4查得%ebx是3,V对应$15。这里要注意的就是在把15转换成16进制数的时候,先把它写成16进制数,然后在前面补0,补成4字节的数。所以$15就是0000000f,然后再采用小顶端法,把字节以相反的顺序出现,就是0f000000。
所以,第二行命令对应的字节编码就是30f30f000000.

这样算出来第二行的指令需要6个字节,起始地址位0x100,所以到第三行对应的地址就是0x106。用这种方法类推,第四行的地址是0x108。同样使用小顶端法,所以最后一行jmp loop的字节编码就是7007010000.

4.2:

这道题和4.1相当于是反过程,根据字节编码来判断命令。
以A为例:先看第一个数字,是3,所以就应该是irmovl V,rB这一类型。对应可知rB是%ebx,V的16进制数表示是fcffffff,转换成10进制是-4。所以,这段字节编码对应的指令是irmovl $-4,%ebx。

用这种方法类推,可以发现C中的f0和E中的a0f0是不合法值。

4.5:

这道题没看懂。

问题1:第四行指令,mrmovl 8(%ebp),%ecx和第五行指令,mrmovl 12(%ebp),%edx。这两行代码中的8、12分别指的是什么?

有同学告诉我是因为int *start占8个字节,int count占4个字节,不知道是不是这个原因?

问题2:Loop部分的代码。为什么$4,%ebx指的是start++?

问题3:(已经解决)一开始觉得已经有了count这个计数的参数,为什么还要start?后来询问同学后明白,start++指的是指针的移动,不是简单的计数加。

4.6:

不是很理解

4.10:

int middle=[

(A<=C&&A>=B)||(A<=B&&A>=C)  : A;

(B<=A&&B>=C)||(B<=C&&B>=A)  : B;  

 1: C;

]

不知道有没有问题?

总结:

这几天学习了4.1和4.2的知识,把涉及到例题都仔细研究了,遇到的问题我会在接下来的几天通过看书或者是请教同学来解决。后面的内容以及问题的解决情况会在下一篇博客中写清楚。再接再厉!

posted @ 2016-10-20 22:05  20144303石宇森  阅读(213)  评论(2编辑  收藏  举报