4.4 常见问题解答
← 内容总览 13 / 38 下一节 →
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 4.4 常见问题解答
1. 一台计算机中的所有指令都是一样长吗?
答:不一定。有定长指令字和不定长指令字两种指令格式。定长指令字格式机器中的所有指令都一样长,称为规整型指令,目前定长指令字大多是 32 位指令字。不定长指令字格式机器中的指令有长有短,但每条指令的长度一般都是 8 的倍数。所以,一个指令字在存储器中存放时,可能占用多个存储单元;从存储器读出并通过总线传输时,可能分多次进行,也可能一次读多条指令。
2. 每一条指令中都包含操作码吗?
答:是的。每一条指令都必须告诉 CPU 该指令做什么操作,所以必须指定操作码。
3. 每条指令中的地址码个数都一样吗?
答:不一定,有的没有地址码,有的包含一个地址码,有的是两个或三个。地址码个数不一样的主要原因有三个:① 每条指令操作数的个数可能不同。有的指令是双目运算指令,涉及两个源操作数和目的操作数;有的是单目运算,只涉及一个源操作数和目的操作数;还有的指令只是控制操作,不涉及操作数,如停机、复位、空操作等指令。所以每条指令涉及的操作数个数不同。② 每个操作数的寻址方式可能不同。不同的寻址方式给出的地址码个数也不同。③ 地址码的默认方式可能不同。有的操作数或地址码用的是隐含指定方式,在指令中默认,不明显给出,如累加器、栈顶等。综上所述,每条指令的地址码个数可能相差很大。
4. 一条指令中的所有操作数都采用相同的寻址方式吗?
答:不一定。规整型指令集中,一般一条指令只包含一种寻址方式,这样,在指令操作码中就隐含了寻址方式,不需要专门有寻址方式字段。但是,对于不规整型指令集,一条指令中的若干操作数可能存放在不同地方,因而每个操作数可能有各自的寻址方式。
<!-- page: 88 -->
# 5. 指令中要明显给出下一条指令的地址吗?
答:不需要。指令在主存中按执行顺序连续存放。大多数情况下指令被顺序执行,只有遇到跳转指令(如无条件跳转、条件分支、调用和返回等指令)才改变指令执行的顺序。所以,可以用一个专门的计数寄存器存放下一条要执行的指令地址,而不需要在指令中专门给出下一条指令的地址。这个计数器称为程序计数器(PC)或指令指针(IP)。
当顺序执行时,CPU直接通过对PC加“1”来使PC指向下一条顺序执行的指令,这里的“1”是指一条指令的长度,即当前指令所占的存储单元数;当执行到跳转指令时,根据指令执行的结果进行相应的地址运算,把运算得到的跳转目标地址送到PC中,使得执行的下一条指令为需要跳转到的目标指令。
# 6. 一个操作数在内存可能占多个单元,怎样在指令中给出操作数的地址呢?
答:现代计算机大多采用字节编址方式,即一个存储单元只能存放一个字节的信息。一个操作数(如char型、int型、float型、double型)可能是8位、16位、32位或64位等,因此,可能占用1个、2个、4个或8个存储单元。也就是说,一个操作数可能有多个存储地址对应,在指令中给出哪个地址呢?
有两种不同的地址指定方式:大端方式和小端方式。大端方式下,指令中给出的地址是操作数最高有效字节(MSB)所在的地址。小端方式下,指令中给出的地址是操作数最低有效字节(LSB)所在的地址。
# 7. 地址码位数与地址空间大小和编址单位的关系是什么?
答:指令中的地址码如果是存储单元地址,那么,地址码的位数与地址空间大小和编址单位的长度有关。编址单位的长度就是存储单元的宽度,也就是最小的寻址单位。存储器可以按字节编址(8位),也可以按字编址(如16位、32位等)。地址空间大小和编址单位确定后,地址码的位数就被确定了。例如,若地址空间大小为4GB,编址单位是字节,则存储单元地址就是32位(因为 $4\mathrm{GB} = 2^{32}\mathrm{B}$);若按字(假定一个字为32位)编址,则存储单元地址就是30位(因为 $4\mathrm{GB} = 2^{32}\mathrm{B} = 2^{30} \times 4\mathrm{B}$)。
# 8. 累加器型指令有什么特点?
答:累加器型指令的一个源操作数和目操作数总是在累加器中,是隐含指定的,所以指令中不需要给出累加器的编号。因而,累加器型指令的指令字相对来说较短,但由于每次运算结果都只能放到累加器中,可能会增加一些将累加器数据存入存储单元的指令,而使程序所含指令数增加。
# 9. 栈型指令有什么特点?
答:与栈有关的操作有入栈(PUSH)、出栈(POP)和运算类操作。运算类指令分单目运算和双目运算,总是从栈顶取操作数,运算后的结果自动放到栈顶。所以,指令中不需要给出操作数地址,因此,栈型指令的指令字较短。但是,因为所有的操作数都只能在栈顶,所以,完成同样一个程序的操作步骤会增加,使得程序所含指令数增加。
栈指令的访存次数,取决于采用的是软栈还是硬栈。如果是软栈(栈区由内存实现),对于双目运算,需要访问4次内存:取指、取源数1、取源数2、存结果。如果是硬栈(栈区由寄存器实现),则只需取指令时访问一次内存。
# 10. 通用寄存器型指令有什么特点?
答:通用寄存器型指令是相对于累加器型指令和栈型指令而言的,指令中的操作数和
<!-- page: 89 -->
运算的结果既不是隐含在累加器中,也不是隐含在栈中,而是在CPU中提供了多个通用寄存器,操作数和结果可以放在这些寄存器中,指令必须明显地指出操作数和结果在哪个寄存器或哪个存储单元中,要给出寄存器的编号或存储单元地址。目前,大多数指令系统采用通用寄存器型指令风格。
## 11. 装入/存储型指令有什么特点?
答:装入/存储型指令是用在规整型指令系统中的一种通用寄存器型指令风格。为了规整指令格式,使指令具有相同的长度,规定只有装入(Load)指令和存储指令(Store)才能访存,而运算指令不能直接访存,只能从寄存器取数进行运算,运算的结果也只能送到寄存器。因为寄存器编号较短,而存储单元地址位数较长,通过某种方式可以使运算指令和访存指令的长度一致。
这种装入/存储型风格的指令系统最大的特点是指令格式规整,指令长度一致,一般为32位。由于只有Load/Store指令才能访问内存,程序中可能会包含许多装入指令和存储指令,而且与一般的通用寄存器型指令风格相比,其程序中包含的指令数会更多。
## 12. 指令寻址方式和数据寻址方式有什么不同?
答:在程序执行过程中,需要取指令和操作数,确定指令存放位置的过程称为指令寻址方式,确定操作数存放位置的过程称为数据寻址方式。指令寻址和数据寻址其复杂度是不一样的。
指令寻址:指令基本上按执行顺序存放在存储器中,执行过程中,指令总是从存储单元被取到指令寄存器IR中。顺序执行时,用指令计数器PC+“1”来得到下一条指令的地址;跳转执行时,通过跳转指令的寻址方式,计算出跳转目标地址,然后送到PC中即可。跳转目标地址的形成方式主要有三种,即立即寻址(直接地址)、相对寻址(相对地址)和间接寻址(间接地址)。
数据寻址:开始时,数据被存放在存储器中,在指令执行过程中,存储器中的数据可能被装入CPU的寄存器中,寄存器数据可能被存储到存储器中或者特定的栈区;还有的操作数可能是I/O端口中的内容,或本身就包含在指令中(即立即数)。另外,运行的结果也可能被送到CPU的寄存器、栈、I/O端口或存储单元中,所以,数据的寻址涉及对寄存器、存储单元、栈、I/O端口、立即数等的访问。此外,操作数可能是某个数组的元素,或者是结构(struct)或联合(union)类型数据中的成员分量。综上所述,数据的寻址比指令的寻址要复杂得多。
## 13. 如何指定指令的寻址方式?
答:CPU根据指令约定的寻址方式对地址码的有关信息进行解释,以找到下一条要执行的指令或指令所需的操作数。有的指令设置专门的寻址方式字段,显式说明采用何种寻址方式,有的指令通过操作码隐含寻址方式。
规整型指令系统一般在一条指令中只包含一种寻址方式,这样,就可在指令操作码中隐含寻址方式,不需要专门有寻址方式字段。但是,对于不规整型指令系统,一条指令中的若干操作数可能存放在不同的地方,因而,每个操作数可能有各自的寻址方式字段。
## 14. 指令的操作数可能存放在机器的哪些地方?
答:指令的操作数可能存放在内存单元、寄存器、栈和I/O端口中,或者直接存在于指令本身中。①操作数在存储单元中,指令必须以某种方式给出存储单元的地址。又可分为
<!-- page: 90 -->
几种情况:对单个独立的操作数进行处理;对一个数组中的若干连续元素或一个数组元素进行处理;对一个表格或表格中的某个元素进行处理;等等,这些不同的情况需要提供不同的寻址方式进行操作数的访问。②操作数在寄存器中,指令中只要直接给出寄存器的编号即可。③操作数在栈区,若有专门的栈指令,则指令中不需要给出操作数的地址,数据的地址隐含地由栈指针给出。④操作数在I/O端口中,当某个I/O接口中的寄存器内容要和CPU中的寄存器内容交换时,要用I/O指令,在I/O传送指令中需提供I/O端口号。⑤操作数是指令中的立即数,此时,操作数是指令的一部分,直接从指令中的立即数字段取操作数。
## 15. 有哪些常用的数据寻址方式?
答:数据寻址方式可以归为4类:①立即寻址。指令中的立即数字段,可以作为操作数,也可以作为直接跳转地址。取到ALU运算前,可能要对其进行扩展。②直接寻址类。指令中直接给出操作数所在的寄存器编号、I/O端口号或存储单元地址。如直接寻址方式、寄存器寻址方式。③间接寻址类。操作数在存储单元中,而操作数的地址存放在寄存器或另一个存储单元中,指令中给出操作数的地址所在的寄存器编号或存储单元地址。如间接寻址方式、寄存器间接寻址方式。④偏移寻址类。指令通过某种方式给出一个形式地址和一个基地址(在某个寄存器中),经过相应的计算(基地址加形式地址)得到操作数所在的存储单元地址。偏移寻址有变址、相对和基址寻址方式三种。
## 16. 直接寻址的操作数要几次访存?
答:一次。只要根据指令中给出的直接地址进行一次存储访问,取出来的就是操作数。
## 17. 间接寻址的操作数要进行几次存储访问?
答:至少两次。先根据指令中给出的间接地址进行一次存储访问,取出来的是操作数所在的存储单元地址;再根据操作数所在的存储单元地址访存一次,取出来的才是操作数。所以,一共有两次访存。如果是多级间接地址,则要多次访存。
## 18. 寄存器寻址的操作数要几次访存?
答:不需要访存。从指定寄存器中取出的就是操作数。
## 19. 寄存器间接寻址的操作数要几次访存?
答:一次。先从指令给出的寄存器中取出操作数所在的存储单元地址,再根据操作数所在的存储单元地址访存一次,得到的就是操作数。
## 20. 什么是变址寻址方式?
答:变址寻址方式下,指令中的地址码给出一个形式地址,并且隐含或明显地指定一个寄存器作为变址寄存器,变址寄存器的内容(变址值)和形式地址相加,得到操作数的有效地址,根据有效地址到内存访问,去取操作数或写运算结果。
变址寻址方式的应用很广泛。最基本的使用场合是用在对数组元素的访问。指令将数组的首地址指定为形式地址,变址寄存器的内容是数组元素的下标,随着下标的变化,可以访问数组中不同的元素。所以变址寄存器的内容是变化的,反映的是所访问的数据到数组首地址的距离,称为变址值。这种应用场合下,形式地址的位数较长,而变址值位数少。变址寻址方式的指令一般包含在一个循环体内。每次进入循环时,变址值都增或减一个定长值,这个定长值等于数组元素的长度。
## 21. 什么是基址寻址方式?
答:基址寻址方式下,指令中的地址码给出一个形式地址,作为位移量,并且隐含或明
<!-- page: 91 -->
显地指定一个寄存器作为基址寄存器,基址寄存器的内容和形式地址相加,得到操作数的有效地址,根据有效地址到内存访问,去取操作数或写运算结果。
基址寻址有两个典型应用:第一个典型应用是程序重定位,在多道程序运行的系统中,每个用户程序在一个逻辑地址空间里编写程序。装入运行时,由操作系统给用户程序分配主存空间,每个用户程序有一个基地址,存放在基址寄存器中,在程序执行时,通过基址寄存器的值加上指令中的形式地址就可以形成实际的主存单元地址。第二个典型应用是扩展有限长度指令的寻址空间,即在运行时将某个存储区的首地址或程序段的首地址装入基址寄存器,而形式地址给出要访问的单元相对于该首地址的距离(即偏移量),因此指令中只要用较短的地址码来表示偏移量。访问操作数时,用基址寄存器的值和偏移量相加,得到操作数所在的存储单元地址。只要基址寄存器的内容更改到另外的一个存储地址,则操作数的地址空间就移到另一个存储区间。因而,可以访问到整个地址空间,以实现短地址访问大空间的目的。
22. 变址寻址和基址寻址的区别是什么?
答:变址寻址方式和基址寻址方式的有效地址形成过程类似。但是,基址寻址方式与变址寻址方式在两方面不同:①具体应用的场合不同。变址寻址面向用户,可用于访问字符串、数组、表格等成批数据或其中的某些元素;基址寻址面向系统,用于解决程序的重定位问题和短地址访问大空间的问题。②使用方式不同。变址寻址时,指令中提供的形式地址是一个基准地址,位移量由变址寄存器给出;基址寻址时,指令中给出的形式地址为位移量,而基址寄存器中存放的是基准地址。不过,这里所讲的使用方式并不是绝对的,实际中可能会有不同的应用场合和使用方式。
23. 什么是相对寻址方式?
答:相对寻址方式的有效地址形成方法是:指令中的形式地址给出一个位移量 $D$,而基准地址由程序计数器(PC)提供,即有效地址为 $\mathrm{EA} = (\mathrm{PC}) + D$。位移量给出的是相对于当前指令所在存储单元的距离,位移量可正、可负。也就是说,要找的可以在当前指令前 $D$ 个单元处的信息,也可以是当前指令后 $D$ 个单元处的信息。
24. 相对寻址方式用在哪些场合?
答:相对寻址方式用在两种场合:①公共子程序的浮动。因为公共子程序可能被许多用户程序调用,因而会随着用户程序装入内存不同的地方运行。为了让公共子程序能在不同的内存区正确运行,一般在公共子程序内部采用相对寻址方式,以保证指令的操作数总在相对于指令距离一定的单元内。这样,不管子程序浮动到哪里,指令和数据的相对位置不变。例如,现行指令的地址为 $2000\mathrm{H}$,指令中给出的形式地址为 $05\mathrm{H}$,说明操作数在当前指令后面第 $05\mathrm{H}$ 个单元处,即 $2005\mathrm{H}$ 处。当程序向后浮动了 $1000\mathrm{H}$,使当前指令的地址为 $3000\mathrm{H}$ 时,此时公共子程序中的指令、数据以及相对位置都不变,指令中给出的相对地址还是 $05\mathrm{H}$,操作数还是应该在当前指令后面的第 $05\mathrm{H}$ 个单元处,所以应该在 $3005\mathrm{H}$ 处,因此,指令取到的还是同一个数据。②跳转目标地址的寻址。当需要转到当前指令的前面或后面第 $n$ 条指令执行时,可以用相对寻址方式。此时,得到的跳转地址是一个相对地址。
25. 相对寻址方式中如何确定相对位置?
答:相对寻址方式中,相对位置的确定比较复杂。必须注意两方面的问题:①位移量的问题。位移量位数有限,在进行有效地址计算时需要扩展。一般位移量用补码表示,所以
<!-- page: 92 -->
应采用补码扩展填充方式(即符号扩展方式)。②基准地址问题。相对寻址的基本思路是把相对于当前指令前面或者后面第 $n$ 个单元作为操作数或目标转移指令的地址。但在具体实现时,不同机器对“当前指令”的含义有不同的理解。有的机器在计算相对地址时,PC中存放的还是当前正在执行的指令的地址,但有的机器PC加“1”的操作在取指令的同时完成,所以在计算相对地址时,PC中已经是下一条指令的地址。因此,不同的机器在计算相对地址时可能有细微的差别。
26. 栈寻址方式中如何对栈进行操作?
答:栈是一块特殊的存储区。采用“先进后出”的方式进行访问。栈底固定不动,栈顶浮动,用一个专门的寄存器SP来作为栈顶指针。从栈生长的方向来分,可以有“自顶向下”和“自底向上”两种,它们在进、出栈时对栈指针的修改是不同的。若每个栈中的元素只占一个内存单元,则修改指针时,通过“+1”或“-1”实现;若占多个内存单元,则应该加上或减去相应的值。
假定栈指针指向的总是栈顶处非空元素,则应该按以下方式修改栈指针。①对于“自底向上”生成的栈,进栈时先修改栈指针:(SP)+1→SP,然后再压入数据;出栈时先将数据弹出,然后再修改栈指针:(SP)-1→SP。②对于“自顶向下”生成的栈,进栈时先修改栈指针:(SP)-1→SP,然后再压入数据;出栈时先将数据弹出,然后再修改栈指针:(SP)+1→SP。
假定栈指针指向的总是栈顶处的空元素,则应该按以下方式修改栈指针。①对于“自底向上”生成的栈,进栈时先压入数据,然后再修改栈指针:(SP)+1→SP;出栈时先修改栈指针:(SP)-1→SP,然后再将数据弹出。②对于“自顶向下”生成的栈,进栈时先压入数据,然后再修改栈指针:(SP)-1→SP;出栈时先修改栈指针:(SP)+1→SP,然后再将数据弹出。
27. 返回指令要不要有地址字段?
答:不一定。子程序(过程)的最后一条指令一定是返回指令。一般返回地址保存在栈中,所以返回指令中不需要明显给出返回地址,直接从栈顶取地址作为返回地址。如果有些计算机不采用栈保存返回地址,而是存放到其他不确定的地方,则返回指令中必须有一个地址码,用来指出返回地址或指出返回地址的存放位置。
28. 跳转指令和调用(转子)指令的区别是什么?
答:跳转指令有无条件跳转指令和条件跳转指令(又称分支指令)。这种跳转指令用于改变程序执行的顺序,跳转后不再返回来执行,所以无须保存返回地址。而调用指令是一种子程序调用指令,子程序执行结束时,必须返回到调用指令后面的指令执行。所以调用指令执行时,除了和跳转指令一样要计算跳转的目标地址外,还要保存返回地址。一般将调用指令后面那条指令的地址作为返回地址保存到栈中或特定寄存器中。
4.5 单项选择题
1. 寄存器中的值有时是地址,有时是数据,它们在形式上没有差别,只有通过( )才能识别它是数据还是地址。
<!-- page: 93 -->
A. 寄存器编号
B. 判断程序
C. 指令操作码或寻址方式位
D. 时序信号
2. 单地址双目运算类指令中,除地址码指明的一个操作数以外,另一个操作数通常采用()。
A. 栈寻址方式
B. 立即寻址方式
C. 间接寻址方式
D. 隐含指定方式
3. 某计算机为定长指令字结构,采用扩展操作码编码方式,指令长度为16位,每个地址码占4位,三地址指令15条,二地址指令8条,一地址指令127条,则剩下的零地址指令最多有( )条。
A. 15
B. 16
C. 31
D. 32
4. 在计算机系统中,描述系统运行状态的部件是()。
A. 程序计数器
B. 累加器
C. 通用寄存器
D. 程序状态字寄存器
5. 下列有关标志寄存器的叙述中,错误的是()。
A. 可用标志寄存器存放执行指令得到的各种标志信息
B. 可通过指令直接访问标志寄存器并修改其值
C. 条件转移指令根据标志寄存器中的标志位确定PC的值
D. 不需像通用寄存器那样对标志寄存器进行编号
6. 以下给出的4种指令类型中,执行时间最长的指令类型是()。
A. R-R型
B. R-S型
C. S-S型
D. R-I型
7. 假定指令地址码给出的是操作数的存储地址,则该操作数采用的是( )寻址方式。
A. 立即
B. 直接
C. 基址
D. 相对
8. 假定指令地址码给出的是操作数本身,则该操作数采用的是( )寻址方式。
A. 立即
B. 直接
C. 基址
D. 相对
9. 假定指令地址码给出的是操作数所在的寄存器的编号,则该操作数采用的是( )寻址方式。
A. 直接
B. 间接
C. 寄存器直接
D. 寄存器间接
10. 寄存器间接寻址方式的操作数存放在( )中。
A. 通用寄存器
B. 存储单元
C. 程序计数器
D. 堆栈
11. 若指令地址码为 $D$ ,则相对寻址方式下操作数的有效地址为()。
A. $D$
B. $\mathbf{M}[D]$
C. $\mathrm{R}[D]$
D. $\mathrm{PC} + D$
12. 若变址寄存器编号为 $X$ ,形式地址为 $D$ ,则变址寻址方式的有效地址为()。
A. $\mathrm{R}[X] + D$
B. $\mathrm{R}[X] + \mathrm{R}[D]$
C. $\mathrm{M}[\mathrm{R}[X] + D]$
D. $\mathrm{M}[\mathrm{R}[X] + \mathrm{M}[D]]$
13. 假定采用相对寻址方式的跳转指令占两个字节,第一字节是操作码,第二字节是相对位移量(用补码表示)。取指令时,每次CPU从存储器取出一个字节,并自动完成 $\mathrm{PC} + 1\rightarrow$ PC。假设执行到某跳转指令时(取指令前)PC的内容为200CH,该指令的跳转目标地址为1FB0H,则该跳转指令第二字节的内容应为()。
<!-- page: 94 -->
A. 5CH
B. 5EH
C. A2H
D. A4H
14. 假设某指令的一个操作数采用变址寻址方式,变址寄存器中的值为 124,指令中给出的形式地址为 B000H,地址 B000H 中的内容为 C000H,则该操作数的有效地址为( )。
A. B124H
B. C124H
C. B07CH
D. C07CH
15. 假设某计算机采用小端方式存储,按字节编址。一维数组 $a$ 有 100 个元素,其类型为 float,存放在地址 C000 1000H 开始的连续区域中,则最后一个数组元素的 MSB 所在的地址应为( )。
A. C000 1396H
B. C000 1399H
C. C000 118CH
D. C000 118FH
16. 假设某条指令的一个操作数采用一次间接寻址方式,指令中给出的地址码为 1200H,地址 1200H 中的内容为 12FCH,地址 12FCH 中的内容为 38B8H,地址 38B8H 中的内容为 88F9H,则该操作数的有效地址为( )。
A. 1200H
B. 12FCH
C. 38B8H
D. 88F9H
17. 假设某条指令的一个操作数采用寄存器间接寻址方式,假定指令中给出的寄存器编号为 8,8 号寄存器的内容为 1200H,地址 1200H 中的内容为 12FCH,地址 12FCH 中的内容为 38B8H,地址 38B8H 中的内容为 88F9H,则该操作数的有效地址为( )。
A. 1200H
B. 12FCH
C. 38B8H
D. 88F9H
18. 某计算机按字节编址,采用大端方式存储信息。其中,某指令的一个操作数的机器数为 ABCD 00FFH,该操作数采用基址寻址方式,指令中形式地址(用补码表示)为 FF00H,当前基址寄存器的内容为 C000 0000H,则该操作数的 LSB(即 FFH)存放的地址是( )。
A. C000 FF00H
B. C000 FF03H
C. BFFF FF00H
D. BFFF FF03H
19. 某计算机按字节编址,采用小端方式存储信息。其中,某指令的一个操作数为 16 位,该操作数采用基址寻址方式,指令中形式地址(用补码表示)为 FF00H,当前基址寄存器的内容为 C000 0000H,则该操作数的 MSB 存放的地址是( )。
A. C000 FF00H
B. C000 FF01H
C. BFFF FF00H
D. BFFF FF01H
20. 输入/输出指令的功能是( )。
A. 在主存与 CPU 的通用寄存器之间进行数据传送
B. 在主存和 I/O 端口之间进行数据传送
C. 在 CPU 的通用寄存器和 I/O 端口之间进行数据传送
D. 在 I/O 端口和 I/O 端口之间进行数据传送
21. 通常将在部件之间进行数据传送的指令称为传送指令。以下有关各类传送指令功能的叙述中,错误的是( )。
A. 出栈/入栈指令(push/pop)完成 CPU 和栈顶之间的数据传送
B. 访存指令(load/store)完成 CPU 和存储单元之间的数据传送
C. I/O 指令(in/out)完成 CPU 和 I/O 端口之间的数据传送
D. 寄存器传送指令(move)完成 CPU 和寄存器之间的数据传送
22. 下列有关 RISC 特征的描述中,错误的是( )。
A. 指令格式规整,寻址方式少
B. 采用硬连线控制和指令流水线
<!-- page: 95 -->
C. 配置的通用寄存器数目不多
D. 运算类指令的操作数不访存
23. 假定编译器对 C 源程序中的变量和 MIPS 中寄存器进行了以下对应:变量 $f, g, h, i$ 和 $j$ 分别分配给寄存器 $\$ \mathrm{s}0, \$ \mathrm{s}1, \$ \mathrm{s}2, \$ \mathrm{s}3$ 和 $\$ \mathrm{s}4$,并将一条 C 赋值语句编译后生成如下汇编代码序列。
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1
请问这条 C 赋值语句是( )。
A. $f = (g + i) - (h + j)$
B. $f = (g + j) - (h + i)$
C. $f = (g + h) - (i + j)$
D. $f = (i + j) - (g + h)$
24. 以下有关调用指令(转子指令)的叙述中,错误的是( )。
A. 与高级语言源程序中的过程调用相对应,一次过程调用对应一条调用指令
B. 指令执行时必须保留返回地址,调用指令随后一条指令的地址是返回地址
C. 嵌套调用时返回地址通常保存在栈中,非嵌套调用时可保存在特定寄存器中
D. 指令执行时将无条件跳转到目标地址处,跳转目标地址无须在指令中明显给出
25. 栈是一块采用( )方式进行数据存取的存储区,在大多数系统(如 MIPS)中,栈位于高端地址空间,向低地址方向动态增长。
A. 顺序访问
B. 随机访问
C. 先进先出
D. 先进后出
26. 以下有关栈和栈帧的叙述中,错误的是( )。
A. 栈区由若干栈帧组成,每个栈帧对应一个过程或子程序
B. CPU 中必须有一个专门的栈指针寄存器,用来存放栈顶位置
C. 访存指令不能访问栈中信息,必须提供专门的入栈和出栈指令
D. 过程返回时,应通过修改栈指针寄存器将对应栈帧从栈中退出
【参考答案】
1. C 2. D 3. B 4. D 5. B 6. C 7. B 8. A 9. C 10. B
11. D 12. A 13. C 14. C 15. D 16. B 17. A 18. D 19. D 20. C
21. D 22. C 23. C 24. D 25. D 26. C
【部分题目的答案解析】
第1题
CPU 在执行指令时,会根据指令中的操作码字段和寻址方式字段对寄存器中的内容进行解释,例如,若是基址寻址方式,则基址寄存器中的内容是一个基地址;若是寄存器直接寻址方式,则寄存器中的内容是操作数。答案为选项 C。
第2题
所谓操作数为隐含指定方式,是指操作数的地址不在指令中明显给出,而是将操作数存放在一个默认的地方,如累加器中。CPU 执行指令时,总是到默认的特定的地方去取操作数。显然,单地址双目运算类指令中的一个操作数只能采用隐含指定方式。答案为选项 D。
第3题
指令长度为16位,每个地址码占4位,对于三地址指令,地址码占12位,操作码占4
<!-- page: 96 -->
位,最多 16 种编码,15 条指令用掉 15 种编码 $0000 \sim 1110$,还剩一种编码 1111;对于二地址指令,高 4 位操作码一定是 1111,低位的地址码占 8 位,剩下的中间操作码还有 4 位,最多可以有 16 种编码,8 条指令用掉 8 种编码 $11110000 \sim 11110111$;对于一地址指令,高 5 位操作码一定为 11111,低 4 位为地址码,剩下的中间操作码还有 7 位,最多可以有 128 种编码,127 条指令用掉 127 种编码 $11111000000 \sim 11111111110$,还剩一种编码 $111111111111$;对于零地址指令,其高 12 位操作码一定为 $111111111111$,因此,还有 4 位未编码,故剩下的零地址指令最多有 16 条。答案为选项 B。
← 内容总览 13 / 38 下一节 →