• 深入理解计算机系统学习笔记


    1 Y86-64 指令集体系结构

    定义一个指令集体系结构(例如Y86-64)包括定义各种状态单元、指令集和它们的编码、一组编程规范和异常事件处理

    1.1 程序员可见的状态

    为程序员可见状态:Y86-64 程序中的每条指令都会读取或修改处理器状态的某些部分。

    Y86-64 的状态类似于X86-64。有15 个程序寄存器:%rax、%rcx、%rdx、%rbx、%rsp、%rbp、%rsi、%rdi 和 %r8 到 %r14。这里省略了x86-64的寄存器%r15以简化指令的编码。

    每个程序寄存器存储一个64位的字。寄存器%rsp被入栈、出栈、调用和返回指令作为栈指针。除此之外,寄存器没有固定的含义或固定值。

    有3个一位的条件码: ZF、SF 和 OF,它们保存着最近的算术或逻辑指令所造成影响的有关信息。

    程序计数器(PC) 存放当前正在执行指令的地址。内存从概念上来说就是一个很大的字节数组,保存着程序和数据。

    1.2 Y86-64指令

    下面是 Y86-64 指令的一些细节。

     x86-64 的 movq 指令分成了 4个不同的指令:irmovq、 rrmovq、mrmovq 和 rmmovq,分别显式地指明源和目的的格式。源可以是立即数(i)、寄存器(r)或内存(m)。指令名字的第一个字母就表明了源的类型。目的可以是寄存器(r)或内存(m)。指令名字的第二个字母指明了目的的类型。在决定如何实现数据传送时,显式地指明数据传送的这4种类型是很有帮助的。

    两个内存传送指令中的内存引用方式是简单的基址和偏移量形式。在地址计算中,我们不支持第二变址寄存器(second index register)和任何寄存器值的伸缩(scaling)。

    同X86-64—样,我们不允许从一个内存地址直接传送到另一个内存地址。 另外,也不允许将立即数传送到内存。

    有4个整数操作指令,如图中的OPq。它们是 addq、 subq、 andq 和 xorq。它们只对寄存器数据进行操作,而X86-64 还允许对内存数据进行这些操作。这些指令会设置3个条件码 ZF、SF 和OF(零、符号和溢出)。

    7个跳转指令是 jmp、 jle、 jl、 je、 jne、 jge 和 jg。根据分支指令的类型和条件代码的设置来选择分支。分支条件和 X86-64 的一样。

    有 6 个条件传送指令: cmovle、cmovl、cmove、 cmovne、cmovge 和 cmovg。这些指令的格式与寄存器-寄存器传送指令 rrmovq 一样,但是只有当条件码满足所需要的约束时,才会更新目的寄存器的值。

    call 指令将返回地址入栈,然后跳到目的地址。ret 指令从这样的调用中返回。

    pushq 和 popq 指令实现了人栈和出栈,就像在 x86-64 中一样。

    halt 指令停止指令的执行。x86-64 中有一个与之相当的指令 hit。x86-64 的应用程序不允许使用这条指令,因为它会导致整个系统暂停运行。对于 Y86-64 来说,执行 halt 指令会导致处理器停止,并将状态码设置为 HLT。 c0268dec102e4807b0eb4446d2913626.jpg

    1.3指令编码

    指令的字节级编码。每条指令需要1~10 个字节不等,这取决于需要哪些字段。每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位: 髙 4 位是代码(code)部分,低 4 位是功能(function)部分。

    74286e6f60a7467694f321e294c235e6.jpg

     如图所示,15 个程序寄存器中每个都有一个相对应的范围在0到0xE 之间的寄存器标识(register ID)。Y86-64中的寄存器编号跟 x86-64 中的相同。程序寄存器存在CPU 中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID作为地址的随机访问存储器。在指令编码中以及在我们的硬件设计中,当需要指明不应访问任何寄存器时,就用ID值0xF 来表示。

    指令集的一个重要性质就是字节编码必须有唯一的解释。任意一个字节序列要么是一个唯一的指令序列的编码,要么就不是一个合法的字节序列。Y86-64 就具有这个性质,因为每条指令的第一个字节有唯一的代码和功能组合,给定这个字节,我们就可以决定所有其他附加字节的长度和含义。这个性质保证了处理器可以无二义性地执行目标代码程序。即使代码嵌人在程序的其他字节中,只要从序列的第一个字节开始处理,我们仍然可以很容易地确定指令序列。

    1.4Y86-64异常

    对于Y86-64,当遇到这些异常的时候,我们就简单地让处理器停止执行指令。在更完整的设计中,处理器通常会调用一个异常处理程序(exception handler), 这个过程被指定用来处理遇到的某种类型的异常。

    1.5—些Y86-64指令的详情

    大多数Y86-64指令是以一种直接明了的方式修改程序状态的,所以定义每条指令想要达到的结果并不困难。不过,两个特别的指令的组合需要特别注意一下。pushq 指令会把栈指针减 8, 并且将一个寄存器值写入内存中。因此,当执行 pushq%rsp 指令时,处理器的行为是不确定的,因为要人栈的寄存器会被同一条指令修改。通常有两种不同的约定:1)压人%rsp 的原始值,2)压入减去8的%rsp的值。

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

    在硬件设计中,用电子电路来计算对位进行运算的函数,以及在各种存储器单元中存储位。大多数现代电路技术都是用信号线上的高电压或低电压来表示不同的位值。在当前的技术中,逻辑1是用1.0 伏特左右的高电压表示的,而逻辑0是用 0.0 伏特左右的低电压表示的。要实现一个数字系统需要三个主要的组成部分:计算对位进行操作的函数的组 合逻辑、存储位的存储器单元,以及控制存储器单元更新的时钟信号。

    2.1 逻辑门

    逻辑门是数字电路的基本计算单元。它们产生的输出,等于它们输人位值的某个布尔函数。下图是布尔函数 AND、OR 和 NOT 的标准符号,C 语言中运算符的逻辑门下面是对应的 HCL 表达式:AND 用 && 表示,OR 用||表示,而 NOT 用!表示。

    c0b5d5c8dd344c0d8b1a260225420694.jpg

    逻辑门总是活动的(active)。一旦一个门的输人变化了,在很短的时间内,输出就会相应地变化。

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

    将很多的逻辑门组合成一个网,就能构建计算块(computational block ), 称为组合电路(combinational circuits)。如何构建这些网有几个限制:

    每个逻辑门的输人必须连接到下述选项之一:1)一个系统输入(称为主输人),2)某个存储器单元的输出,3)某个逻辑门的输出。

    两个或多个逻辑门的输出不能连接在一起。否则它们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障。

    这个网必须是无环的。也就是在网中不能有路径经过一系列的门而形成一个回路,这样的回路会导致该网络计算的函数有歧义。

     

     

  • 相关阅读:
    Java笔记:Java线程Dump分析
    记一次 .NET 某电力系统 内存暴涨分析
    absl教程(五):Synchronization library
    window mysql-8.0.34 zip解压包安装
    【2022版】Spring面试题整理(含答案解析)
    pandas 学习 第15篇:分组 groupby
    MATLAB嵌套if语句||MATLAB switch语句
    1122 Hamiltonian Cycle
    活动聊天机器人如何革新活动行业
    基于springboot实现漫画网站管理系统项目【项目源码+论文说明】计算机毕业设计
  • 原文地址:https://blog.csdn.net/2301_79022588/article/details/136435619