计算机体系结构量化研究方法学习(四)


指令集体系结构时程序员或者编译器编写人员能够看到的计算机部分。

指令集体系结构的分类

处理器中内部存储类型是最基本的区别,所以关注这一部分,主要包括栈、累加器或寄存器组。操作数可以显示命名,也可以隐式命名:在栈体系结构中,操作数隐式位于栈的顶部,在累加器体系结构中,操作数隐式为累加器。通用寄存器体系结构只有显示操作数,或者为寄存器或者为存储器位置。
实际上有两种类型的寄存器计算机。一种可以用任意指令来访问存储器,成为寄存器-存储器体系结构,另一类则只能用载入和存储指令访问存储器,称为载入-存储体系结构。第三类将所有操作数都保存在存储器中,称为存储器-存储器体系结构。一些指令集体系结构的寄存器要多于单个累加器,但对这些特殊寄存器,的使用设置了一些限制。此类体系结构有时被称为扩展累加器或专用寄存器计算机。
通用寄存器计算机之所以会出现,主要有两点,第二寄存器快于存储器,第二,对编译器来说,使用寄存器要比使用其他内部存储形式的效率更高。更重要的是寄存器可用于保存变量。当变量被分配到寄存器中,可以降低存储器通信流量、加快程序速度,提高代码密度。
下面是各个的优势和劣势。

存储器寻址

一个体系结构必须定义如歌解释存储器地址以及如何制定这些地址。

解释存储器地址

对字节进行排序,有两种不同的约定方式。
小端字节顺序将地址放在双字的最低有效位置。
大端字节顺序将地址放在双字的最高有效位置。
在许多计算机中,对大于一字节的对象进行寻址时都必须是对齐的。

寻址方式

寻址方式是体系结构如何指定要发访问对象的地址。除了存储器中的位置之外,寻址方式还指定常量和寄存器。在使用存储器位置时,由寻址方式指定的实际存储器地址称为有效地址。
寻址模式能够大幅减少指令数目,他们也会增加构建计算机的复杂度。

位移量寻址方式

在使用位移量类型的寻址方式是,一个主要的问题就是所用位移量的范围。根据所使用的各种位移量的大小,可以决定支持哪些位移量的大小。

立即数或直接操作数寻址方式

在进行算是运算、比较和移动时,如果希望将常量放在寄存器中,可以使用立即数。重点是要知道是对所有的运算都支持立即数还是仅对一部分运算支持。

操作数的类型与大小

操作数的类型有字符、半字、字、单精度浮点、双精度浮点。整数几乎都是用二进制的补码数字表示,

指令集中的操作

大多数指令集体系结构支持的操作符可以入表所示。执行最多的指令是一个指令集中的简单操作。

控制流指令

关于改变控制流的指令,没有非常一致的术语。
我们可以区分4种不同类型的控制流变化:

  • 条件分支(占绝大多数)
  • 跳转
  • 过程调用
  • 过程返回

控制流指令的寻址方式

控制流指令中的目标地址在任何情况下都必须制定。在绝大多数的情况下,这个目标是在指令中明确的,但返回是一个重要例外。指定目标的最常见方法是将被驾到的程序计数器(PC)的位移量。这类成为PC相对指令。采用PC相对寻址还可以是代码的运行不受装载位置的影响,这一特性称为与位置无关。

如果在编译是不知道目标位置,为了实现返回和间接跳转,需要一种不同于PC相对寻址方法,这时,必须要有一种动态指定目标的方法,使目标能在运行时发生变化。这种动态寻址可能非常简单,只需要给猪包含目标地址的寄存器名称就可以。

条件分支选项

由于大多数控制流改变的都是分支,所以决定如何指定分支条件是很重要的。

过程调用选项

过程调用和返回包含包括控制转移,还可能涉及一些装填保存过程;至少必须将返回地址保存在某个地方,有的保存在特殊的连接寄出去你中,有时只操作在GPR中。
在保存寄存器时,有两种基本约定,要么保存在调用位置,要么保存在被调用的过程内部

  • 调用者保存:是指发出调用的过程必须保存它希望再调用之后进行访问的寄存器。
  • ** 被调用者保存**: 被调用过车必须保存它希望使用的寄存器,而调用者不受限制。

指令集编码

上述选择会影响到如何对这些指令进行编码,表示为供计算机执行的二进制形式,这种形式不仅影响到程序经过编译后的大小,还会影响到处理器的实现。处理器必须对这种表示形式进行译码,快速找出操作和操作数。操作在操作码中指定。主要是如何将寻址方式和操作结合在一起。
编码指令的三种基本变体:变长编码、定长编码、混合编码。

RISC中的精简代码

32位定长格式已经成为一种负担,为应对着这一种情况,提供了新的版本,同时拥有16位和32位指令。

编译器的角色

由于所执行的大多数指令都是编译器的输出,所以指令集体系结构基本上就是编译器目标。

编译器的结构

编译器编写人员首要目标是正确性——所有有效程序的编译解结果都必须是正确的。第二个目标是编译后的代码速度。
正确编写编译器是一件很复杂的事情,而所能完成的优化程序主要受这一复杂度的限制。尽管采用多变扫描结构可以帮助降低编译器的复杂性,但也要求编译器必须进行排序。
根据转移类型,可以将先带你编译器执行的优化进下如下分类:

  • 高级优化: 一般对源代码执行并输出结果传送之后的优化扫描;
  • 本地优化: 仅对直行代码段内的代码进行优化
  • 全局优化: 将本地优化扩展到分支范围之外,并引入一组专为优化循环的转换
  • 寄存器分配: 将寄存器与操作数关联在一起
  • 与处理器相关的优化: 尝试充分利用特定的体系结构

寄存器分配

寄存器分配在加快代码速度和使其他优化发挥效果放慢扮演的角色,可以说他是最重要的优化之一。今天的寄存器分配方法以着色问题的技术为基础。

优化对性能的影响

编译器技术对架构师决策的影响

编译器预高级语言之间的互动显著影响着程序利用指令集体系结构方式。这里主要有两个问题:如何对变量进行分配和寻址?需要多少个寄存器才能对变量进行适当分配?

  • 栈用于分配本地变量。
  • 全局数据区用于静态分配所声明的对象
  • 堆用于分配那些不符合栈规则的动态对象。

架构师如何帮助编译器编写人员

大多数程序都具有局部简单性。
编译器编写人员在工作时,通常会遵循他们自己对一条体系结构基础原理的推论:加快常见情况的速度、保证少见情况的正确性。
1、提供正则性,只要可能,指令集的三个要素(操作码、数据类型和寻址方式)应当是正交的。
2、提供原型而非解决方案。
3、简化候选项之间的平衡。指出那种指令序列最为合适。
4、提供一些指令,将编译时的已知量绑定为常量。

谬论和易犯错误

错误:

  1. 设计专门支持高级语言结构的高级指令集功能
  2. 不考虑编译器,仅通过指令集体系结构的创新来缩小代码规模

谬论:

  1. 存在典型程序这样一种东西
  2. 有缺陷的体系结构不可能获得成功(80x86)
  3. 可以设计一种没有缺陷的体系结构
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值