文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>RISC vs CISC 指令密度对比

RISC vs CISC 指令密度对比

时间:2007-04-15  来源:loughsky

首先我们谈论具体实际的. ARM和x86的数据对比我不知道, 但是ARM结构体系本身就有它自己的数据对比. ARM体系除了标准的RISC指令集以外, 还有一套专门的Thumb指令集. 按照ARM公司自己给出的数据, 使用Thumb 指令集的程序代码长度比使用标准指令集的程序代码长度平均缩短35%, 这是第一个精确数据, 虽然它并不完全合乎你的要求(ARM公司声称Thumb 指令集也是RISC编码). 第二个我所可以告诉你的数据是Toshiba公司的数据. Toshiba公司的TLCS-900/L1系列指令集声称对于常用指令每一个Byte可以编码一条指令, 同样的程序所生成的代码总体尺寸为使用RISC指令集的1/3, 这是另一个"相对精确"的数据. 关于代码密度问题我所知道的就有那么多. 其次我们可以谈论抽象空洞的. 首先当然必须是从编译原理谈起. 按照编译原理, 一个抽象指令集可以采用两种表示形式: 三元组表示或是四元组表示, 三元组表示的基本格式如下:
指令 = 操作码 + 源寄存器 + 目的寄存器
四元组表示的基本格式如下:
指令 = 操作码 + 源寄存器1 + 源寄存器2 + 目的寄存器
采用三元组表示还是采用四元组表示, 这是第一个基本分歧。其次我们谈论指令集的正交. 一个正交的三元组指令集采用以下格式:
定长操作码/无歧义 + 定长格式的源寄存器/无歧义 + 定长格式的目的寄存器/无歧义.
非正交的指令集则反之, 一切都是变长的、有歧义的.
第三我们谈论形如 Rx+d 类型的指令. 指令集允不允许 Rx+d 类型指令?
允许则指令集变得很复杂. 标准四元组的指令格式扩展如下:
指令 = 操作码 + 源寄存器1 + 源偏移1 + 源寄存器2 + 源偏移2 + 目的寄存器 + 目的偏移
这是机器指令集的最复杂的表示形式, 全世界没有任何一种实际机器是使用这样一种指令集机器表示形式的, 所以, 严格意义上的CISC机器是没有的. 第四我们谈论的是直接地址指令和直接操作数指令. 没有任何机器不可以运行直接地址指令和直接操作数指令, 但是只要存在直接地址指令或直接操作数指令即不存在正交指令集, 也就是说, 严格意义上的RISC机器是没有的. 现在我们谈论实际的RISC机器. 注意: 我们是在进行抽象的空洞的谈论,所以这个所谓"实际的RISC机器"是个假货.
实际的RISC机器使用32位定长编码, 编码格式使用四元组表示、正交指令集、不允许使用地址偏移, 它的基本形式如下:
RISC指令 = 8位操作码/无歧义 + 8位源寄存器1/无歧义 + 8位源寄存器2/无歧义 + 8位目的寄存器/无歧义 这里定义了一种具有256条不同类型的指令、拥有一个由256个寄存器组成的寄存器组、既不能运行偏移地址指令也不能运行直接地址指令或直接操作数指令的四元组表示的正交指令集, 它就是所谓的"标准RISC机器". 标准RISC机器格式整齐、定义严谨, 但是能力太差. 任何实际的RISC机器都是从标准RISC机器改进而来. 最简单的改进就是改用三元组表示,成为以下形式: RISC指令 = 8位操作码/无歧义 + 8位源寄存器/无歧义 + 8位目的寄存器/无歧义 + 8位空白/无歧义 可以看出这样一种所谓改进纯粹胡闹, 8位空白要么丢掉要么利用起来.丢掉的选择成为以下形式: RISC指令 = 8位操作码/无歧义 + 4位源寄存器/无歧义 + 4位目的寄存器/无歧义 这就是典型的"Thumb RISC指令集", 寄存器组尺寸从64个缩减为16个,相应的编码长度从32位缩减为16位, 指令密度平白无故提高了一倍,但它仍然还是RISC, 因为指令集是定长的、正交的.
遵照这样的思路, 可以看出"Thumb RISC指令集"可以进一步缩减, 直到 缩减为8位, 以下是它的标准形式:
RISC指令 = 4位操作码/无歧义 + 2位源寄存器/无歧义 + 2位目的寄存器/无歧义
这就是所谓的"基本RISC/CISC指令集", 可以看出基本RISC/CISC指令集是标准RISC指令集最精简的形式, 它的指令密度是标准RISC指令密度的4倍, 只有16条指令, 寄存器组尺寸为4个. 这样的RISC/CISC指令集是没用的, 因为它无法组成一个完整的CPU所必须执行的所有指令, 但是现在的问题是, "标准RISC指令集"同样也是没用的, 因为它也无法组成
一个完整的CPU所必须执行的所有指令. 任何严格意义上的RISC都是什么用都没有, 因为从根本上来说它就不能运行.
实际的RISC机器都是从标准RISC机器变形改进而来. 最基本的RISC变形就是保留正交的操作码集合, 但是将正交的操作数定义改成不正交的操作数定义, 这样可以使得机器能够运行形如 指令 = 操作数 + 寄存器 + 直接数或直接地址 这样的指令. 基本的四元组RISC指令集至少具有四种形式, 一种是 RISC指令 = 8位操作码/无歧义 + 8位源寄存器1/有歧义 + 8位源寄存器2/有歧义 + 8位目的寄存器/有歧义 一种是 RISC指令 = 8位操作码/无歧义 + 8位空白/有歧义 + 8位源寄存器2/有歧义 + 8位目的寄存器/有歧义 + 32位直接数或直接地址/无歧义
一种是
RISC指令 = 8位操作码/无歧义 + 8位源寄存器1/有歧义 + 8位空白/有歧义 + 8位目的寄存器/有歧义 + 32位直接数或直接地址/无歧义
一种是
RISC指令 = 8位操作码/无歧义 + 8位源寄存器1/有歧义 + 8位源寄存器2/有歧义 + 8位空白/有歧义 + 32位直接数或直接地址/无歧义
这就是原本意义上的"RISC机器", 它的确切名称是"四元组表示的、正交操作码格式的、变长步长为32位的指令集", 与此对应的是"三元组表示的、非正交操作码格式的、变长步长为8位的指令集", 这就是原本意义上的"CISC机器". 有许许多多各种各样的变种, 比如"三元组表示的、正交操作码格式的、变长步长为16位的指令集"通常也被称作是"RISC机器"
(即Motorola 68000系列).
所以, 对比于RISC指令集, CISC指令集的指令密度从4倍到1/4不等.CISC机器的另一个变种是"超长指令字", 它的指令密度最大可以达到 RISC指令集的5倍, 也就是说, 如果你把"超长指令字机器"也称作"CISC 机器", 那么它是大大优于RISC机器, 但是如果你不指定机器, 仅仅抽象 地谈论"CISC机器的指令密度是RISC机器指令密度的多少倍", 则答案只
能是"从4倍到1/4不等". 如果考虑到寄存器优化等因素, 则即使下判断 说"CISC机器的指令密度跟RISC机器的指令密度相当"也是不错的. 事实 上我的的确确是这样估计, 即"RISC机器的指令密度比CISC机器的指令密 度稍高一点", 因为我相信一个拥有64个寄存器的RISC机器经过优化的代 码长度一定会比一个仅仅拥有8个寄存器的CISC机器的经过优化的代码要 短. 指令密度这个东西很难说, 你如果从"每1K的机器码到底包含多少条 机器指令"这个角度进行比较, 则统计数字显示x86系列平均码长2.5字节, 而RISC机器平均码长至少4字节, 但是你如果从"同样的C语言程序在CISC 上面编译出来是不是比在RISC上面编译出来的长度更短", 那可就不一定. CISC CISC, "指令 = 4位操作码 + 2位源寄存器 + 2位目的寄存器"就是 CISC, 汇编语言的那个麻烦我是早有领教. 同样的函数在一个仅有4个寄 存器的机器上写比在一个有8个寄存器的机器上写, 编译出来的机器代码 长度要长出一倍, 如果从纯经验的角度来说, 我也可以声称"RISC机器的 指令密度比CISC机器的指令密度高一倍", 虽然你不承认, 但那却是事实.
 
相关阅读 更多 +
排行榜 更多 +
机械迷城免费版下载最新版本

机械迷城免费版下载最新版本

冒险解谜 下载
甜瓜游乐场30.5国际版下载

甜瓜游乐场30.5国际版下载

休闲益智 下载
泰坦之路安卓免费下载安装

泰坦之路安卓免费下载安装

角色扮演 下载