深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构

摘要:
新的一年,为了给计算机系统系列添加一些新的元素,LZ将其更改为书的原名《深入理解计算机系统》。Y86指令体系结构Y86是一个指令体系结构,它是计算机系统这本书的作者YY出的指令集。其实两者是非常相似的,毕竟Y86就是根据X86的结构YY出来的。区别就在于,有的时候Y86需要两条指令来达到X86一条指令就可以达成的目的。文章小结本文的难度并不高,只是简单的介绍了一个类X86的指令集结构。

引言

各位猿友们好,计算机系统系列很久没更新了,实在是抱歉之极。新的一年,为了给计算机系统系列添加一些新的元素,LZ将其更改为书的原名《深入理解计算机系统》。这本书非常厚,而且难度较高,LZ看了很久才看了四章。当然,这跟LZ最近很久没翻书有关系,最近公司的事情比较多,可让LZ愁了个愁,尤其是招人的事一直不太顺利,很多工作无法展开,也让LZ的心中一直压着一块大石。

不过事情多了,就意味着责任大了,因此LZ最近经常回家自己研究公司所用的框架,以期了如指掌,可以应付各种随即事件。这耽误了LZ不少功夫,最近看书的激情在慢慢下降,这绝对不是个好事,要好好调整,毕竟艺多不压身,尽管计算机系统的这些知识在平时的用处不大,但是对自身的积累还是有很大好处的,因此建议各位猿友千万不要落下。不过耽误了这么久,说不定已经有猿友将LZ远远抛在身后了。

好了,回归正题,来看看我们的Y86吧。

Y86指令体系结构

Y86是一个指令体系结构(ISA),它是计算机系统这本书的作者YY出的指令集。目的是为了让我们更加清晰的了解ISA,就像你读编译原理,作者会教你做个编译器,是一样的道理。

我们学这个并不是为了设计指令集,因为这种工作几乎不可能发生在我们的身上。还是和编译原理一样,你的工作也不太可能是去写一个编译器,创造一种语言,最多就是写个小例子拿来唬唬你身边的妹子或基友。我们的目的是为了了解CPU处理指令的流程以及它的工作原理,学习它的思想,这对你以后的技术之路说不定会有一些启发。很多时候,这种启发是很重要并且难得的,非神人不能达到。

对于Y86,LZ也没有太多可介绍的,它就是一个ISA的例子,让各位通过它来了解ISA的设计。这一章的内容比较轻松,因为我们已经在第三章了解过X86的汇编指令,所以这里很多内容LZ只是一图代过,更多精彩内容还是要在后面再展现出来。

猿友们看的见的东西

计算机是一个神秘的家伙,它的很多秘密我们都看不到,不过有了ISA的帮忙,我们就可以了解到很多计算机的秘密。比如LZ现在写博文的时候,CPU到底在干什么呢?

理论上来讲,我们在编写一个程序的时候,我们是可以知道CPU的状态的。因为在你观察程序的汇编指令时,你可以知道当程序执行到某个地方,寄存器、存储器以及条件码寄存器等等的状态是如何的。说到底,无论是寄存器,存储器还是条件码寄存器等等,都是汇编指令可以访问的处理器状态。在设计和实现一个处理器的时候,只要我们能保证机器级程序(比如汇编程序)可以正常的访问程序猿可见状态(比如寄存器、存储器),那么就不太需要非得按照ISA真正的方式来表示我们的处理器状态。

对于Y86来说,它的程序猿可见状态就是这几种:寄存器、存储器、条件码、PC、程序状态。

在Y86当中,寄存器依旧是8个,每一个寄存器可以存储一个字,也就是一个32位二进制。条件码是一个一位二进制的寄存器,保存着最近的算术或逻辑运算所造成的影响的信息。PC则是程序计数器,记录当前正在执行的指令的地址。

存储器则是一个很大的字节数组,Y86的程序可以使用虚拟地址(类似于数组的下标)来访问存储器,硬件和操作系统会将虚拟地址翻译为实际的地址。最后一个程序状态(stat),它则代表着程序的运行情况。

以上便是程序猿可见的状态,或者说机器级程序可访问的CPU状态,我们在设计和实现一个处理器的时候,就是设计一系列指令去操作这些状态。

Y86指令集

接下来我们就看看Y86的指令集,这里LZ就直接上图了,这些指令其实都是从X86的指令集YY而来。

深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构第1张

上面的指令相信大家都不会太陌生,LZ这里就不仔细的解释了,下面我们只简单的把每个指令的作用过一遍。

halt:这个指令将会终止指令的执行。

nop:这是一个占位指令,它不做任何事情,后续为了实现流水线,它有一定的作用。

xxmovl:这是一系列的数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数。比如rrmovl指令,则代表将一个寄存器的值,赋给另外一个寄存器。

opl:操作指令,比如加法,减法等等。

jxx:条件跳转指令,根据后面的条件进行跳转。

cmovxx:条件传送指令,后面的xx代表的是条件。特别的是,条件传送只发生在两个寄存器之间,不会将数据传送到存储器。

call与ret:方法的调用和返回指令。一个将返回地址入栈,并跳到目标地址。一个将返回地址入PC,并跳到返回地址。

push与pop:入栈和出栈操作。

指令编码

这里LZ还要说的一点是,在图的右边,是指令所占的字节数或者说编码。一般两个寄存器占用一个字节,存储器则占用四个字节,指令的编码和功能占用一个字节。因此可以看到,比如rrmovl指令,它的字节长度是2,其中第一个字节代表了指令rrmovl,第二个字节代表了两个寄存器。

对于opl、jxx、cmovxx指令来说,都有一个fn标识,占用4个二进制位(半个字节)。这个便是指令的功能部分,这个是由于它们的指令编码一样,但功能有所不同所造成的。比如对于opl,就有加、减、与、异或等操作,那么它们的指令编码第一个字节就分别为十六进制的60、61、62、63。

对于寄存器的表示,是使用4个二进制位表示的,这是一个ID标识。所有的寄存器可以看做是一个寄存器文件,其中的ID标识就类似于它们的地址。对于一些只需要一个寄存器的指令来说,另一个寄存器标识位使用0xF表示。

还有的指令需要一个字的常数,比如irmovl指令,call指令等等。这种指令,将把常数放在最后的四个字节当中,顺序按照大端法或小端法表示(与机器和OS有关)。对于call指令来说,这四个字节就是一个地址,这个地址就是绝对地址,指向了存储器当中的某一个位置,这个位置存储着代码。采用绝对地址是为了描述简单,真实当中,是采取的基于PC的相对地址。

Y86异常

对于Y86来说,程序猿可见的状态中就有stat状态码,它标识了程序执行的状态。Y86需要有能力根据stat去做一些处理。不过为了简单起见,这里除了正常执行之外,都将停止指令的执行。真实当中,会有专门的异常处理程序。

Y86有四种不同的状态码,AOK(正常)、HLT(执行halt指令)、ADR(非法地址)和INS(非法指令)。

Y86程序

书中给出了一个示例程序,来说明X86和Y86的区别,这里LZ就不详细分析这些汇编指令了,这种事情在第三章已经做的很多了,各位猿友可以私底下自己分析一下。其实两者是非常相似的,毕竟Y86就是根据X86的结构YY出来的。区别就在于,有的时候Y86需要两条指令来达到X86一条指令就可以达成的目的。

比如对于X86指令中的 addl $4,%ecx 这样的指令,由于Y86当中的addl指令中不包含立即数,所以Y86需要先将立即数存入寄存器,即使用irmovl指令,然后再使用addl来处理加法运算。

总的来说,Y86就是一个X86的缩减版,它的目的是以简单的结构实现一个处理器,帮助我们了解处理器的设计和实现。有兴趣的猿友可以去观摩一下Y86程序生成的汇编代码,并进行逐一的分析,实际上,这与X86是十分类似的。

文章小结

本文的难度并不高,只是简单的介绍了一个类X86的指令集结构。接下来的内容需要我们了解一下具体的设计是如何进行的,以及如何使用硬件控制语言HCL。后面的内容相对来说会比较难理解,LZ在读的时候也是有点一知半解,尽管现在已经基本摸清了套路,但还是希望各位猿友在看的过程当中最好有自己的理解。

免责声明:文章转载自《深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇k-means 算法Linux之sshkey密钥认证实战下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转】CUDA程序优化要点

CUDA程序优化应该考虑的点:精度:只在关键步骤使用双精度,其他部分仍然使用单精度浮点以获得指令吞吐量和精度的平衡;    目前 GPU 的单精度性能要远远超过双精度性能,整数乘法、求模、求余等运算的指令吞吐量也较为有限。在科学计算中,由于需要处理的数据量巨大,往往采用双精度或者四精度才能获得可靠的结果,目前的 Tesla 架构还不能很好的满足高精度计算的...

解析STM32的库函数

意法半导体在推出STM32微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在STM32开发过程中所涉及到的所有底层操作。通过在程序开发中引入这样的固件开发包,可以使开发人员从复杂冗余的底层寄存器操作中解放出来,将精力专注应用程序的开发上,这便是ST推出这样一个开发包的初衷。 但这对于许多从51/AVR这类单片机的开发转到STM32平台的开发...

深入浅出计算机组成原理学习笔记:第三十一讲

一、引子 上一讲,我带你一起看了三维图形在计算机里的渲染过程。这个渲染过程,分成了顶点处理、图元处理、栅格化、片段处理,以及最后的像素操作。这一连串的过程, 也被称之为图形流水线或者渲染管线。 因为要实时计算渲染的像素特别地多,图形加速卡登上了历史的舞台。通过3dFx的Voodoo或者NVidia的TNT这样的图形加速卡,CPU就不需要再去处理一个个像素点...

Host是如何与EC通信的

第一种方式:遵循ACPI规范完成通信,通过LPC的62h、64h偏移/端口。 此种方式适合host对EC进行读写操作。 EC提供256字节的可被系统读写的RAM空间,EC的资源在该RAM空间映射,通过访问对应偏移(0x00~0xFF),即可操作对应的资源。实际上就是外部RAM的前256字节。EC会将键盘、触摸板、电池、温度传感器等一些设备的状态信息保存在此...

【Zynq UltraScale+ MPSoC解密学习7】Zynq UltraScale+的PMU

一、简单介绍1.1 概念PMU,platform measurement unit,平台管理单元。很多人会将它当做power measurement unit(电源管理单元)的缩写,认为就是管理电源和功耗的。其实PMU除了电源管理功能,还具有其他功能。官方描述如下: 系统启动前的初始化 电源管理 软件测试库执行(可选) 系统错误处理 1.2 总览在...

转载:堆栈溢出(Stack overflow)问题

一,堆栈溢出堆栈溢出就是不顾堆栈中分配的局部数据块大小(在栈中分配的局部数据块大小和局部变量的声明的大小有关),向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据(包括函数的返回地址)。 或者解释为在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址,这样当过程返回时,程序就转而开始执行这段自编的代码了.这东西很像病毒。 基础知识...