在学习#pragma pack(1)
时候,了解到对于一些RISC处理器, 结构体在#pragma pack(1)
情况下会比和非#pragma pack(1)
情况下产生更多的汇编指令,如:Intel Itanium,Alpha AXP,MIPS R4000,PowerPC 600,SuperH-3。
内存中的两个数相乘
右图是代表通用存储方案的图。主存储器(Main Memory) 分为(行)1:(列)1 到 (行)6:(列)4编号的位置。执行单元(Execution Unit)负责执行所有计算。指行单元负责执行所有计算,但是执行单元只能对已加载到六个寄存器(A,B,C,D,E,F)之一中的数据进行操作。假设我们要查找两个数字的乘积:一个存储在位置2:3,另一个存储在位置5:2,然后将乘积又存储在位置2:3。
CISC方法
CISC体系结构的主要目标是以尽可能较少行数的汇编语言代码完成一项任务,这是通过构建能够理解和执行一系列操作的处理器硬件来实现的。对于这种特定任务,CISC处理器将会准备一个特定的指定(叫“MULT”),在执行的时候,该指令将两个值加载到单独的寄存器中,在执行单元中将操作数相乘,然后将乘积存储在适当的寄存器中。因此,将两个数相乘的整个任务可以用一条指令完成:
MULT 2:3, 5:2
MULT就是所谓的“复杂指令”,它直接操作计算机的内存,并且不需要程序员显示调用任何加载函数或者存储函数。它与高级语言中的命令非常相似,例如,如果让a代表2:3的值,b代表5:2的值,则此指令与C语句“a=a*b”相同。
该系统的主要有点之一就是编译器只需要做很少的工作即可将高级语言语句转换为汇编语言,由于代码长度较短,因此需要很少的RAM来存储指令,重点是直接在硬件中构建复杂的指令。
RISC方法
RISC处理器仅使用可以在一个时钟周期内执行的简单指令,因此,上述“MULT”命令可以分为三个独立的命令:LOAD(将数据从存储体移动到寄存器);PROD(用于查找位于寄存器内的两个操作数的乘积);STORE(用于将数据从寄存器移动到内存中)。为了实现CISC方法描述的步骤,程序员需要写四行汇编代码:
LOAD A, 2:3
LOAD B, 5:2
PROD A, B
STORE 2:3, A
起初,这似乎是为了完成操作效率更低的方法,因为有更多行的代码,所以需要更多的RAM来存储汇编级指令。编译器还必须执行更多工作才能将高级语句转换为这种形式的代码。
然而,RISC策略也带来了一些非常重要的优势,因为每条指令只需要一个时钟周期(clock cycle)即可执行,因此整个程序将以与多周期“MULT”命令大致相同的时间执行。与复杂指令相比,这些RISC“精简指令”需要更少的硬件空间晶体管,从而为通用寄存器留出更多空间。由于所有指令均在统一的时间(即一个时钟)内执行,因此可以进行流水线操作。
分开LOAD和STORE指令实际上减少了计算机必须执行的工作量。执行CISC样式的MULT命令后,处理器会自动擦除寄存器,如果一个操作数需要用于其他计算,则处理器必须将数据从存储库重新加载到寄存器中。在RISC中,操作数将留在寄存器中,知道在其位置加载另一个值为止。
性能方程
下面方程式通常用于表示计算机的性能:
CISC方法试图将每个程序的指令数量减至最少,从而牺牲了每个指令的周期数。RISC则相反,以每个程序的指令数为代价,减少了每个指令的周期。
RISC障碍
尽管基于RISC的处理有很多优势,但是RISC芯片花了十多年的时间才在商业领域立足,这主要是由于缺乏软件支持。
尽管Apple的Power Macintosh产品线采用基于RISC的芯片并且Windows NT与RISC兼容,但是Windows 3.1 和Windows 95 的设计都考虑了CISC处理器。许多公司不愿意冒着风险利用新兴的RISC技术。如果没有商业利益,处理器开发商就无法大批量生产RISC芯片,以使其价格具有竞争力。
另一个重大挫折就是Intel的出现,尽管他们的额CISC芯片变得越来越笨拙且难以开发,但Intel仍有资源进行开发并生产强大的处理器。尽管RISC芯片可能会超过Intel在特定领域的女里,但差异还不足以说服购买者改变技术。
RISC的整体优势
今天,Intel X86可以说是唯一保留CISC架构的芯片,这主要是由于计算机技术其他领域的进步。RAM的价格已大大降低。1977年1MB的DRAM成本约为6。编译器技术也变得越来越复杂,因此RISC对RAM的使用以及对软件的重视已成为理想的选择。
区别
CISC
注重硬件
包含多时钟复杂指令
内存到内存:LOAD和STORE是指令的一部分
代码量少,每秒高周期
晶体管用来存储复杂的指令RISC
注重软件
单时钟,只有精简的指令
寄存器到寄存器:LOAD和STORE是各自独立的指令
代码量大,每秒低周期
需要更多的晶体管在内存寄存器上