⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter2.htm

📁 see mips run,mips学习最好的资料
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<BR>通过一些运行时的支持。在编译的时刻,编译器选择好一些变量(MIPS公司的汇编器 
<BR>缺省选择那些8或更少存储字节的变量),并将它们放在一起到一个大小不超过64K字 
<BR>节的内存区间。运行系统然后初始化一个寄存器--$28,或者说gp,来指向这个区域 <BR>的中间位置。 
<BR>对这些数据的加载和存储可以通过对gp寄存器相对位置的一个加载或存储来完成。 
<BR><BR><BR>*更多类型的跳转条件:汇编器通过对两个寄存器的算术测试来合成一系列的条件跳 <BR>转。 
<BR><BR>*简单或不同形式的指令:一元操作,例如,not和neg,是通过nor或sub与永远值是 
<BR>零的寄存器$0来实现的。你还可以用两个操作数的方式来表示一个三个操作数的指 <BR>令。汇编器将会把结果存回到第一个指定的寄存器中。 
<BR><BR>*隐藏跳转延迟槽:在正常的情况下,汇编器将不会让你接触到延迟槽。SGI汇编器 
<BR>非常灵巧,可以识别指令序列寻找有用的指令并将其放入到延迟槽中。一个汇编directive <BR>.set noreorder可以用来防止这一点。 
<BR><BR>*隐含加载延迟:汇编器会检测是否一个指令试图使用一个前面刚加载的数据结果。 <BR>如果有这样的情况,将会对代码进行移动。在早期的MIPS 
CPU中(没有加载数据互锁 <BR>),系统将会插入一个空指令nop。 
<BR><BR>*没对齐的移动:不对齐的数据加载和存储指令将会正确地存取半字和字数目,虽然 <BR>目标地址是非对齐的。 
<BR><BR>*其他流水线矫正:一些指令(例如那些使用乘法器的指令)需要额外的限制--例如乘 
<BR>法器的输入寄存器在结果输出之后的第3条指令时才能复位并重新使用。你可能不想 <BR>知道这方面太多的细节,汇编器会替你把补丁填好。 
<BR><BR>*其他的优化:一些MIPS指令(特别是浮点)需要花费很多的指令来产生计算结果,而 
<BR>且在这期间CPU是互锁的,因此你不需要考虑这些延迟对你程序正确性的影响。但是 
<BR>SGI的汇编器在这方面非常勇敢,会将代码挪来挪去从而提高运行速度。你有可能不 <BR>喜欢这一点。 
<BR><BR>纵队,如果你想将汇编源代码(没有用.set noreorder的代码)与在内存中的指令对 <BR>应起来,你需要帮助。请使用一个反汇编工具。 
<BR><BR><BR>2.7 MIPS I 到 MIPS IV: 64位(和其他)的扩展 
<BR><BR>MIPS体系结构自从诞生以来就一直在演变,最为显著的为从32位到64位。这个扩展 
<BR>非常干净利索,以致在介绍MIPS体系结构时我们几乎可以按照64位的体系结构来描 
<BR>述,32位的结构当作是其的子集。本书没有这样做,因为如下几个原因。第一,MIPS并 
<BR>不是一开始就是64位的。如果一开始就按照64位来描述,可能会使得你迷惑。第二, 
<BR>MIPS提供给工业界的一个经验就是一个体系结构如何能够平滑的扩展。第三,本书 
<BR>的材料其实是为32位MIPS而准备的,当时MIPS还没有包含其64位扩展。 
<BR><BR>因此,我们介绍的方法是混合的。通常我们会先介绍32位下的□c能,当介绍到细节 
<BR>的时候,就会既包括32位又包括64位。在以后我们将用ISA作为指令集的缩写。 <BR><BR>当MIPS ISA演化时,原来32位 MIPS CPU 
(包括R2000, R3000 和其相应的产品) ISA都 <BR>相应的称为 MIPS I。另一个广泛使用的,含有许多重要改进并从而在R4000及其后 
<BR>续产品上提供了完整64位ISA的指令集,我们称之为MIPS III。 
<BR><BR>MIPS的一个优点是,在用户层次(当你在一个工作站上写程序时,你可见的所有代码 <BR>),每个MIPS 
ISA都是其前一个的超集,没有任何遗漏,只有增加新的功能。 <BR><BR>MIPS II出现过。但其第一个实现R6000马上就被MIPS III 
R4000取代了。除了MIPS <BR>III的64位的整数运算, MIPS II非常接近于一个MIPS III的子集。MIPS II ISA最 
<BR>近又回来了,随着对32位的MIPS CPU 实现的要求的增加。 
<BR><BR>如我们已经描述过的,不同的ISA层次定义和描述了相应ISA层的内容。除去其他内 
<BR>容,这些ISA至少定义了在一个保护的操作系统中一个用户程序所要使用的所有的, 
<BR>包含浮点运算的指令。如从指令系统出发,ISA定义和描述了整数,浮点数和浮点控 <BR>制寄存器。 
<BR><BR>每一个ISA定义都非常小心的将CPU控制寄存器(协处理器0),最近将所有的CPU控制 
<BR>寄存器都排除在外。我不知道这有什么帮助,虽然这可以创造更多的MIPS CPU咨询 
<BR>业的工作机会,由於ISA中隐含了很多信息。例如,如果你想要了解如何对R5000的 <BR>cache编程的话,“MIPS 
IV指令集”的书是没有任何帮助的。 <BR><BR>在实践中,协处理器0也伴随这正式的ISA一起演化着。与ISA的版本类似,协处理器 
<BR>0有两个主要的版本:一个是与R3000(MIPS CPU中最大家族MIPS 1的祖先),另一个 <BR>是第一个MIPS III CPU, 
R4000。我将称这两个CPU家族为R3000式的和R4000式的。 <BR>以后的CPU,如R5000何R10000都保留了R4000式的协处理器构造。 
<BR><BR>2.7.1 迈向64位 <BR><BR>1990年MIPS R4000的问世,MIPS成为第一个64位的RISC芯片。MIPS III的指令集提 
<BR>供64位的整数寄存器。所有的通用寄存器是64位大小的。有一些CPU控制寄存器也是 
<BR>64位的。另外,所有的操作都产生64位的结果,虽然一些从32位的指令集继承过来 
<BR>的指令对64位的数据没有任何影响。对那些不能兼容的扩展到64位来处理64位的操 <BR>作数的32位指令,MIPS III指令集提供了新的增加的指令。 
<BR><BR>在MIPS III中,FPA有独立的64位长的FP寄存器,因此你不再需要一对32位的寄存器 
<BR>来存放一个双精度的浮点运算值。这个扩展是不兼容的,因此人们可以通过设置一 <BR>个控制寄存器的模式开关来使得这些寄存器的行为与MIPS I 
一样从而使得旧软件也 <BR>可以使用。 <BR><BR>2.7.2 谁需要64位? 
<BR><BR>到1996年,32位CPU已经不能提供足够的地妒7d空间给一些大的应用程序。专家们认 
<BR>为程序的大小在指数倍的增长,每18个月就翻一番。随着这个增长速度,对地址空 <BR>间的要求将是每年要增加3/4个bit。真正的32位机器(68020, 
i386)是在1984年取代 <BR>16/20位的机器的。因此32位机器将会在2002年左右变的嫌小了。如果从这个数据让 
<BR>我们觉得MIPS1991年的动作太超前了,或许是对的--MIPS的最大支持者SGI直到1995年 <BR>才推出其64位的操作系统。 
<BR><BR>MIPS技术早期的发展来源于操作系统的研究兴趣,希望通过使用较大的虚拟地址空 
<BR>间从而使得一个对象(object)可以在一段时间内通过其虚拟地址来命名。 MIPS CPU 
<BR>绝不是在操作系统发展中最有威望的机构。Intel占据世界市场的32位CPU等待了11年 <BR>直到Windows 
95操作系统将32位运算带入了巨大的市场。 <BR><BR>64位体系结构的一个特点是计算机可以一次处理更多的位,这可以使得一些要处理 
<BR>大量数据的应用程序,如图形和图像,得到加快。对於多媒体指令的扩充,如Intel的 
<BR>MMX,士不是有必要还不是很明朗。Intel的MMX不仅提供宽广的数据通道,还能满足 <BR>同时处理在其数据通道上一个字节或16位数据。 
<BR><BR>到了1996年,任何一个声称具有长远目标的体系结构都需要相应的64位的实现。或 <BR>许早点实现64位计算不是一个坏事。 
<BR><BR>采用一个平面一维的线性地址空间和将通用寄存器作为指针是MIPS体系结构的特点。 
<BR>这意味着64位寻址和64位寄存器是相伴的。即使不考虑宽的64位地妒7d,增加了宽 
<BR>度的寄存器与ALU对一些处理大量数据的程序,如图形或高速通讯程序也是非常有用 <BR>的。 
<BR><BR>MIPS体系结构(和其他一些RISC体系结构)带来的一个希望是体系结构朝64位的发展 
<BR>使得地址的段式结构(x86和PowerPC体系结构的特点)变得再没有任何必要。 <BR><BR>2.7.3 关于64位与CPU 
模式转换:数据位於寄存器中 <BR><BR>在将一个CPU扩充到一个新的领域时,通常“标准”的做法是象很久以前DEC公司将 
<BR>其PDP-11挪到VAX上和Intel公司从80286升到i286和i386:他们在新的处理器中定义 
<BR>一个模式转换控制,当模式控制启动时,使得处理器运行得象其前代产品一样。 
<BR><BR>但是模式切换是一种组合起来的一种方法。在一个没有微代码的机器中,这种模式 <BR>切换是很难实现的。因此R4000采用了一种不同的方法: 
<BR><BR>* 所有的MIPS II 指令集都保留。 <BR>* 只要你仅仅运行MIPS II指令,你的程序就是与MIPS II处理器是100%兼容的。每 
<BR>一个MIPS III的64位寄存器的低32位存放着相应的在MIPS II CPU时其寄存器的值。 <BR><BR>*尽可能的定义MIPS 
II指令,从而使得保持兼容性并且可用在64位指令中。 <BR><BR>在这里,重要的决定(当你清楚这个问题后,就是一个简单的问题)是,但我们将64位 
<BR>CPU运行在32位兼容状态下时,寄存器高32位将存放什么值?有很多种选择,但只有 <BR>少数几个是简单明了得。 
<BR><BR>我们可以简单的决定寄存器高32位是没定义的。当你将CPU运行在32位兼容模式下时, 
<BR>寄存器的高32位可以含有任何旧的垃圾值。这个方法实现很简单但不能满足上述第 
<BR>三点:我们将需要32位和64位各自的测试和条件转移指令(用来测试寄存器是否相等 <BR>或通过检查最高位来负数)。 
<BR><BR>第二种方案相对吸引人一点,当CPU运行在32位时,寄存器高32位保持为0。这种方 
<BR>法同样要求提供各自的对负数的测试指令和对负数的比较指令。另外,一个64位的 
<BR>异或("nor")指令用在两个高32位为0的值时,不能自然的产生一个高位为0的值。 
<BR><BR>第三种,也是最好的一种方法是将寄存器的高32位与第31位一样。如果(当仅仅运行 
<BR>32位指令时)我们确信每个寄存器存放着正确的低32位值并且高32位是第31位的复制, 
<BR>那么所有的64位比较和测试指令与其32位的相应指令就都是这个兼容的。所有的位 
<BR>操作逻辑指令也同样(任何对位31操作正确的,对位32到63也同样适用)。 
<BR><BR>这个正确的方法可以这样来加以描述,将寄存器的低32位进行带符号扩展到64位。 <BR>这种方法与寄存器中的值是带符号的还是不带符号的无关。 
<BR><BR>按照这个方案,MIPS III需要新的64位简单数值计算指令(32位的addu指令,当遇到 
<BR>32位溢出时,将会把溢出的结果存放在低32位,并将第31位扩充至高32位---这与64位 <BR>加法是不一样的!)。MIPS 
III还需要新的64位的存取和移位指令。在需要一个新的 <BR>64位指令时,其指令助记符增加一个“d“,比如daddu, dsub, dmult和ld等。 
<BR><BR>略微不是很明显的是32位的加载指令lw。在64位下,lw更精确的意思是加载一个带 
<BR>符号的字(word),因此一个用在64位下的新的指令lwu被引入。lwu意味着高32位是 <BR>用0来扩展。 
<BR>需要增加的指令的数目是由支持现有的MIPS II CPU种类的需要和(比如,按照一个 
<BR>常数来移位)支持使用不同的指令操作码(op-code)如何避免在32位下固定的只有5位 <BR>的移位数。 
<BR><BR>所有的MIPS指令都详细的列在了第八章。 <BR><BR>2.7.4 MIPS III的其他一些发明 
<BR>同步64位的广泛扩展提供了一个机会来增加一些非常有用的指令(与64位数值计算操 <BR>作无关的)。 <BR><BR>多处理器操作 
<BR><BR>64位MIPS提供了一对指令--加载关联(load linked)和条件存储(store conditional)。 
<BR>它们用来实现软件的semaphore,可用在共享内存的多处理器系统中。它们的功能与 
<BR>最近的CISC体系结构提供的原子性的RMW(读-改-写)指令和锁指令是一样的。但是, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -