X86的孪生兄弟,Y86指令体系结构

X86的孪生兄弟,Y86指令体系结构

前言

为啥我的排版还是这么丑?排版如人啊,唉.说实话,上一章的内容我没搞明白,先不管了,先放一下,个人比较喜欢鲸吞的学习方式.

正文

Y86指令体系结构

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

我们学这个并不是为了设计指令集,因为这种工作几乎不可能发生在我们身上还是和编译原理一样,你的工作也不太可能写一个编译器,常遭一种语言,最多就是写个小例子拿来唬唬你身边的妹子.我们的目的是为了了解CPU处理器指令以及它的工作流程,学习他的思想,这对以后你的技术之路说不定有些启发.有可能你收到了启发,就领悟了一个终极技能呢?对吧

程序员看得见的东西

计算机是一个神秘的东西,他的很多密码我们都看不到,不过有了ISA的帮忙,我们就可以了解很多计算机的秘密.比如你在写博客的时候,你的CPU到底在干嘛.

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

对于Y86来说,他的程序员可见状态就是如下几种:寄存器,存储器,条件码,PC,程序状态

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

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

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

Y86指令集

下面这个图是Y86指令集,这些指令其实都是从X86指令集上意淫来的.

上面的指令大家应该不陌生吧,下面咱们简单的把每个指令的作用过一遍:


名字


作用


halt


这个指令将会终止指令的执行


nop


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


xxmovl


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


opl


操作指令,比如加法,减法等等


jxx


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


cmovxx


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


call与ret


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


push和pop


入栈和出栈操作

指令编码

在图的右边,是指令所占的字节数或者说编码.一般两个寄存器占用一个字节,存储器则占用四个字街,指令的编码和功能占用一个字节.因此可以看到,比如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(正常),HTL(执行halt指令),ADR(非法地址)和INS(非法指令).

Y86程序

Y86和X86的区别在于,有的时候Y86需要两条指令来达到X86一条指令就可以达成的目的.

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

总的来说,Y86就是X86的一个缩减版,他的目的就是以简单的结构来实现一个处理器,帮助我们了解处理器的设计和实现.

小小的结一下

本次主要介绍了一下X86的指令集结构.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 14:34:06

X86的孪生兄弟,Y86指令体系结构的相关文章

Android图表库MPAndroidChart(十)——散点图的孪生兄弟气泡图

Android图表库MPAndroidChart(十)--散点图的孪生兄弟气泡图 起泡图和散点图如出一辙,但是个人认为要比散点图好看一点,我们来看下实际的演示效果 这个和散点图的实现很相似,我们一起来看下 一.基本实现 先看下我的xml <com.github.mikephil.charting.charts.BubbleChart android:id="@+id/mBubbleChart" android:layout_width="match_parent&quo

【5min+】传说中的孪生兄弟? Memory and Span

系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等. 5min+不是超过5分钟的意思,"+"是知识的增加.so,它是让您花费5分钟以下的时间来提升您的知识储备量. 正文 在上一篇文章:<闪电光速拳? .NetCore 中的Span> 中我们提到了在.net core 2.x 所新增的一个类型:Span. 它与咱们传统使

为什么X86汇编中的mov指令不支持内存到内存的寻址?

在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了???这个问题在stack overflow有个解释不错: The answer involves a fuller understanding of RAM. Simply stated, RAM can only be in two states, read mode or write mode.

策略模式的孪生兄弟——对状态模式的深度复习总结

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 和策略模式的比较 状态模式概念和例子 应用场景 责任链模式和状态模式对比 一种代码优化的思路 java.util.Iterator里也有状态模式的影子 状态模式的优缺点 有限状态机及其应用 前面有总结——策略模式,之前早就觉得策略和状态设计模式有一些相似…… 接口的常用用法都有什么?策略设计模式复习总结 我知道策略模式是对象的行为模式,其实就是对一系列级别平等的算法的封装,它不关心算法实现,让客户端去动态的

孪生兄弟状态模式与策略模式有什么区别,究竟该如何选择

都说状态模式和策略模式很像,它们的 UML 类图一样.这也说明,单纯从代码角度来讲,它们的本质一样,其实都是多态的应用.但它们实际所代表的的事物特征是有本质区别的,选择哪个设计模式,代表了你看待业务场景的角度.从合理角度地对业务进程抽象,选择恰当的设计模式,才能让代码有更好的结构. 这篇文章重点说说我对状态模式和策略模式区别的理解,以及如何选择. 一.策略模式 关于策略模式,我之前写过一篇笔记,不过是 C# 写的.策略模式解决了代码逻辑分支较多,对不同的分支,采取不同措施的问题.不熟悉策略模式的

20145205 《信息安全系统设计基础》第6周学习总结

教材学习内容总结 ISA ISA是IndustryStandardArchitecture的缩写ISA插槽是基于ISA总线(IndustrialStandardArchitecture,工业标准结构总线)的扩展插槽,其颜色一般为黑色,比PCI接口插槽要长些,位于主板的最下端.其工作频率为8MHz左右,为16位插槽,最大传输率16MB/sec,可插接显卡,声卡,网卡已及所谓的多功能接口卡等扩展插卡.其缺点是CPU资源占用太高,数据传输带宽太小,是已经被淘汰的插槽接口. ISA是8/16bit的系统

反汇编基本原理与x86指令构造

反汇编基本原理与x86指令构造 概要:旨在讲述程序的二进制代码转换到汇编.即反汇编的基本原理.以及 x86 架构的 CPU 的指令构造,有这个基础后就能够自己编写汇编程序了,也能够将二进制代码数据转换成汇编助记指令.当然,把本文当作手冊的阅读指导也是能够的.本文还讲述了 DEBUG 工具的部分功能.32位平台下有一个 DEBUG32 版本号能够配合 DOSBOX 工具执行在 Windos 7 这些 NT 系统上,DEBUG 要使用 MSDOS 5.0 版本号中的.这是一个十分实用的工具,它同一时

如何实现对ARM汇编指令的调试?

学习ARM汇编语言时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在x86平台上执行ARM指令,可以使用qemu模拟器执行ARM汇编指令,具体的调试方法,一起来看看吧. 一.准备ARM汇编程序 首先,我们构造一段简单的ARM汇编程序作为测试代码main.s. .globl _start _start: mov R0,#0 swi 0x00900001 以上汇编指

处理器体系结构

Y86指令集体系结构 4.1.1 程序员可见的状态: Y86程序中的每条指令都会读取或者修改处理器状态的某些部分. 这里的“程序员”既可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器. Y86的处理器类似于IA32.有八个程序寄存器:%eax.%edx.%ebx.%esi.%edi.%esp和%ebp. 存储器: 从概念来说就是一个很大的字节数组,保存着程序和数据.Y86程序用虚拟地址来引用存储器位置.硬件和操作系统软件联合起来将虚拟地址翻译成实际或者物理地址,指明数据实际保存在存储器