第四章MIPS指令系统和汇编语言1.考研预测:出题特点总结本章是对统考408内容来说,本章是新增的章节。此外北航961大纲中制定了要考MIPS指令集,从15年961真题来看MIPS是重中之重。但是今年计组并没有指定具体的教材,但大纲明确要求掌握MIPS指令集,所以还是建议考生将《计算机组成与设计:硬件/软件接口》中文版(原版第三版或第四版)作为本章的参考书籍。本章大致内容是MIPS的基础知识,难度并不大。考生应该将重点放在MIPS指令集的基础上,考察C语言中的语句转换为对应的MIPS指令,所以需要熟练掌握C语言中一些语句对应的MIPS指令实现。本章出题很大可能就是C语言和MIPS汇编语言之间的转换,也可能涉及到第五章CPU指令流水线等内容。2.考研知识点系统整理:梳理考点,各个击破3.1指令系统概述机器指令要素操作码:指明进行的何种操作源操作数地址:参加操作的操作数的地址,可能有多个。目的操作数地址:保存操作结果的地址。下条指令的地址:指明下一条要运行的指令的位置,一般指令是按顺序依次执行的,所以绝大多数指令中并不显式的指明下一条指令的地址,也就是说,指令格式中并不包含这部分信息。只有少数指令需要显示指明下一条指令的地址。指令执行周期操作数区别操作数的位置:存储器、寄存器和输入输出端口操作数的类型:数值类型、逻辑型数、字符和地址操作数的存储方式大端(big-endian)次序:最高有效字节存储在地址最小位置小端(little-endian)次序:最低有效字节存储在地址最小举例:inta=0x12345678;地址数值地址数值A+012A+078A+134A+156A+256A+234A+378A+312大端存储小端存储3.2指令格式一台计算机指令格式的选择和确定要涉及多方面的因素,如指令长度、地址码结构以及操作码结构等,是一个很复杂的问题,它与计算机系统结构、数据表示方法、指令功能设计等都密切相关。指令的基本格式一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如下:操作码字段地址码字段其中操作码指明了指令的操作性质及功能,地址码则给出了操作数的地址。指令的长度是指一条指令中所包含的二进制代码的位数,指令长度与机器字长没有固定的关系,它可以等于机器字长,也可以大于或小于机器字长。通常,把指令长度等于机器字长的指令称为单字长指令;指令长度等于半个机器字长的指令称为半字长指令;指令长度等于两个机器字长的指令称为双字长指令。在一个指令系统中,若所有指令的长度都是相等的,称为定长指令字结构。定长结构指令系统控制简单,但不够灵活。若各种指令的长度随指令功能而异,就称为变长指令字结构。现代计算机广泛采用变长指令字结构,变长结构指令系统灵活,但指令的控制较复杂。计算机执行一条指令所需要的全部信息都必须包含在指令中。对于一般的双操作数运算类指令来说,除去操作码之外,地址码字段中应包含以下信息:第一操作数地址。第二操作数地址。操作结果存放地址。这些信息可以在指令中明显的给出,称为显地址;也可以依照某种事先的约定,用隐含的方式给出,称为隐地址。所以,从地址结构的角度可以分为三地址指令、二地址指令、一地址指令和零地址指令。(1)三地址指令三地址指令格式为:OPA1A2A3其中A1为第一操作数地址,A2为第二操作数地址,A3为操作结果存放地址。这条指令的含义:(A1)OP(A2)→A3式中OP表示双操作数运算指令的运算符号,如“+”或“–”等。(2)二地址指令如果让第一操作数地址同时兼作存放结果的地址(目的地址),这样即得到了二地址指令,其格式为:OPA1A2其中A1为目的操作数地址,A2为源操作数地址。指令的含义:(A1)OP(A2)→A1。(3)一地址指令一地址指令顾名思义只有一个显地址,它的指令格式为:OPA1一地址指令只有一个地址,那么另一个操作数来自何方呢?指令中虽未明显给出,但按事先约定,这个隐含的操作数就放在一个专门的寄存器中。因为这个寄存器在连续性运算时,保存着多条指令连续操作的累计结果,故称为累加寄存器(AC)。指令的含义:(AC)OP(A1)→AC(4)零地址指令零地址指令格式中只有操作码字段,没有地址码字段,其格式为:OP零地址的运算类指令仅用在堆栈计算机中的。堆栈计算机没有一般计算机中必备的通用寄存器,因此堆栈就成为提供操作数和保存运算结果的唯一场所。通常,参加运算的两个操作数隐含地从堆栈顶部(栈顶和次栈顶单元)弹出,送到运算器中进行运算,运算的结果再隐含地压入堆栈中。对于同一个问题,用三地址指令编写的程序最短,但指令长度(程序存储量)最长;而用二、一、零地址指令来编写程序,程序的长度一个比一个长,但指令的长度一个比一个短。定长操作码指令格式如果某个计算机全部指令的操作码字段的位数和位置都是固定的,就称为定长操作码指令。这是一种最简单的编码方法,为了能表示整个指令系统中的全部指令,指令的操作码字段应当具有足够的位数。假定指令系统共有m条指令,指令中操作码字段的位数为N位,则有如下关系式:m≤2N,所以N≥log2m定长操作码对于简化硬件设计,减少指令译码的时间是非常有利的,在字长较长的大、中型计算机及超级小型计算机上广泛采用。例如,IBM370机中不论指令的长度为多少位,其操作码字段一律都是8位。8位操作码允许容纳256条指令,而实际上在IBM370机中仅有183条指令,存在着极大的信息冗余,这种信息冗余的编码也称为非法操作码。扩展操作码指令格式如果某个计算机全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上,就称为变长操作码指令。这种方式能够有效地压缩指令中操作码字段的平均长度,在字长较短的小、微型计算机上广泛采用。显然,操作码字段的位数和位置不固定将增加指令译码和分析的难度,使控制器的设计复杂化。最常见的变长操作码指令采用扩展操作码法。因为如果指令长度一定,则地址码与操作码字段的长度是相互制约的。为了解决这一矛盾,让操作数地址个数多的指令(三地址指令)的操作码字段短些,操作数地址个数少的指令(一或零地址指令)的操作码字段长些,这样既能充分地利用指令的各个字段,又能在不增加指令长度的情况下扩展操作码的位数,使它能表示更多的指令。3.3指令的寻址方式所谓寻址,指的是寻找操作数的地址或下一条将要执行的指令地址。讨论寻址方式首先要搞清楚编址的概念。通常,指令中的地址码字段将指出操作数的来源和去向,而操作数则存放在相应的存储设备中。在计算机中需要编址的设备主要有CPU中的通用寄存器、主存储器和输入输出设备等3种。要对寄存器、主存储器和输入输出设备等进行访问,首先必须对它们进行编址。就像一个大楼有许多房间,首先必须给每一个房间编上一个唯一的号码,人们才能据此找到需要的房间一样。指令格式中每个地址码的位数是与主存容量和最小寻址单位(即编址单位)有关联的。主存容量越大,所需的地址码位数就越长。对于相同容量来说,如果以字节为最小寻址单位,地址码的位数就需要长些,但是可以方便地对每一个字符进行处理;如果以字为最小寻址单位(假定字长为16位或更长),地址码的位数可以减少,但对字符操作比较困难。例如:某机主存容量为220个字节,机器字长32位,若最小寻址单位为字节(按字节编址),其地址码应为20位;若最小寻址单位为字(按字编址),其地址码只需18位。有效地址的概念寻址方式是根据指令中给出的地址码字段寻找有效地址的方式。我们把指令中地址码字段给出的地址称为形式地址(用字母A表示),这个地址有可能不能直接用来访问主存。例如,IBMPC/XT机的主存容量可达1MB,而指令中的地址码字段最长仅16位,仅能直接访问主存的一小部分,而无法访问到整个主存空间。就是在字长很长的大型机中,即使指令中能够拿出足够的位数来作为访问整个主存空间的地址,为了灵活方便地编制程序,也需要对地址进行必要的变换。有效地址是指能够直接访问主存的地址(用字母EA表示),形式地址经过某种寻址方式的转换才能变为有效地址。数据寻址和指令寻址寻址可以分为指令寻址和数据寻址。寻找下一条将要执行的指令地址称为指令寻址,寻找操作数的地址称为数据寻址。指令寻址比较简单,它又可以细分为顺序寻址和跳跃寻址。而数据寻址方式种类较多,其最终目的都是寻找所需要的操作数。顺序寻址可通过程序计数器加1,自动形成下一条指令的地址;跳跃寻址则需要通过程序转移类指令实现。跳跃寻址的转移地址形成方式有3种:直接(绝对)、相对和间接寻址,它与数据寻址方式中的直接、相对和间接寻址是相同的,只不过寻找到的不是操作数的有效地址而是转移的有效地址而已。常见寻址方式每台计算机的指令系统都有自己的一套寻址方式,不同计算机的寻址方式的名称和含义并不统一,下面介绍大多数计算机常用的几种基本寻址方式。(1)立即寻址立即寻址是一种特殊的寻址方式,指令中在操作码字段后面的部分不是通常意义上的操作数地址,而是操作数本身,也就是说数据就包含在指令中,只要取出指令,也就取出了可以立即使用的操作数,这样的数称为立即数,其指令格式为:OP立即数这种方式的特点是:在取指令时,操作码和操作数被同时取出,不必再次访问主存,从而提高了指令的执行速度。但是,因为操作数是指令的一部分,不能被修改,而且立即数的大小受到指令长度的限制,所以这种寻址方式灵活性最差。(2)寄存器寻址寄存器寻址指令的地址码部分给出某一个通用寄存器的编号Ri,这个指定的寄存器中存放着操作数。其寻址过程如图所示,图中的IR表示指令寄存器,它的内容是从主存中取出的指令。操作数S与寄存器Ri的关系为:S=(Ri)。这种寻址方式具有两个明显的优点:从寄存器中存取数据比从主存中快得多;由于寄存器的数量较少,其地址码字段比主存单元地址字段短得多。(3)直接寻址指令中地址码字段给出的地址A就是操作数的有效地址,即形式地址等于有效地址:EA=A。由于这样给出的操作数地址是不能修改的,与程序本身所在的位置无关,所以又叫做绝对寻址方式。下图为直接寻址的示意图。操作数S与地址码A的关系为:S=(A)。这种寻址方式不需作任何寻址运算,简单直观,也便于硬件实现,但地址空间受到指令中地址码字段位数的限制。(4)间接寻址间接寻址意味着指令中给出的地址A不是操作数的地址,而是存放操作数地址的主存单元的地址,简称操作数地址的地址。通常在指令格式中划出一位作为直接或间接寻址的标志位,间接寻址时标志位@=1。间接寻址中又有一级间接寻址和多级间接寻址之分。在一级间接寻址中,首先按指令的地址码字段先从主存中取出操作数的有效地址,即EA=(A),然后再按此有效地址从主存中读出操作数,如图(a)所示。操作数S与地址码A的关系为:S=((A))。多级间接寻址为取得操作数需要多次访问主存,即使在找到操作数有效地址后,还需再访问一次主存才可得到真正的操作数,如图(b)所示。对于多级间接寻址来说,在寻址过程中所访问到的每个主存单元的内容中都应设有一个间址标志位。通常将这个标志放在主存单元的最高位。当该位为“1”,表示这一主存单元中仍然是间接地址,需要继续间接寻址;当该位为“0”,表示已经找到了有效地址,根据这个地址可以读出真正的操作数。间接寻址要比直接寻址灵活得多,它的主要优点如下:扩大了寻址范围,可用指令中的短地址访问大的主存空间;可将主存单元作为程序的地址指针,用以指示操作数在主存中的位置。当操作数的地址需要改变时,不必修改指令,只需修改存放有效地址的那个主存单元的内容就可以了。但是,间接寻址在取指之后至少需要两次访问主存才能取出操作数,降低了取操作数的速度。尤其是在多级间接寻址时,寻找操作数要花费相当多的时间,甚至可能发生间址循环。(5)寄存器间接寻址为了克服间接寻址中访存次数多的缺点,可采用寄存器间接寻址,即指令中的地址码给出某一通用寄存器的编号,在被指定的寄存器中存放操作数的有效地址,而操作数则存放在主存单元中,其寻址过程如图所示。操作数S与寄存器号Ri的关系为:S=((Ri))。这种寻址方式的指令较短,并且在取指后只需一次访存便可得到操作数,因此指令执行速