前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >博主精心收集的计组重点知识点(一)

博主精心收集的计组重点知识点(一)

作者头像
Regan Yue
发布2021-09-16 10:51:19
1.2K0
发布2021-09-16 10:51:19
举报
文章被收录于专栏:ReganYue's BlogReganYue's Blog

1.一台计算机中的所有指令都是一样长吗?

答:不一定。有定长指令字机器和不定长指令字机器两种。定长指令字机器中所有指令都一样长,称为规整型指令,目前定长指令字大多是32位指令字。不定长指令字机器的指令有长有短,但每条指令的长度一般都是8的倍数。所以,一个指令字在存储器中存放时,可能占用多个存储单元;从存储器读出并通过总线传输时,可能分多次进行,也可能一次读多条指令。

2.每一条指令中都包含操作码吗?

答:是的。每一条指令都必须告诉CPU该指令做什么操作,所以必须指定操作码。

3.每条指令中的地址码个数都一样吗?

答:不一定,有的没有地址码,有的包含一个地址码,有的是两个或三个。地址码个数不一样的主要原因有三个:(1)每条指令操作码的个数可能不同。有的指令是双目运算指令,涉及到两个源操作数和目操作数,有的是单目运算,只涉及到一个源操作数和目操作数,还有的指令只是控制操作,不涉及到操作数,如:停机、复位、空操作等指令。所以每条指令涉及到的操作数个数不同。(2)每个操作数的寻址方式可能不同。不同的寻址方式给出的地址码个数也不同。(3)地址码的缺省方式可能不同。有的操作数或地址码用的是隐含指定方式,在指令中缺省,不明显给出,如:累加器,堆栈等。

综上所述,每条指令的操作码个数可能相差很大。

4.指令中的所有操作数都采用相同的寻址方式吗?

答:不一定。规整型指令一般在一条指令中只包含一种寻址方式,这样,在指令操作码中就隐含了寻址方式,不需要专门有寻址方式字段。但是对于不规整型指令,一条指令中的若干操作数可能存放在不同地方,因而每个操作数可能有各自的寻址方式。

5.指令中要明显给出下一条指令的地址吗?

答:不需要。指令在主存中按执行顺序连续存放。大多数情况下指令被顺序执行,只有遇到转移指令(如,无条件转移、条件分支、调用和返回等指令)才改变指令执行的顺序。所以,可以用一个专门的计数器,来存放下一条要执行的指令地址,而不需要在指令中专门给出下一条指令的地址。这个计数器称为程序计数器PC或指令指针IP。

当顺序执行时,CPU直接通过对PC加“1”来使PC指向下一条顺序执行的指令;当执行到转移指令时,根据指令执行的结果进行相应的地址运算,把运算得到的转移目标地址送到PC中,使得执行的下一条指令为转移到的目标指令。

6.一个操作数在内存可能占多个单元,怎样在指令中给出操作数的地址呢?

答:现代计算机都是采用字节编址方式,即一个内存单元只能存放一个字节的信息。一个操作数(如:char型、int型、float型、double型)可能是8位、16位、32位或64位等,因此,可能占用1个、2个、4个或8个内存单元。也就是说,一个操作数可能有多个内存地址对应,在指令中给出哪个地址呢?

有两种不同的地址指定方式:大端方式和小端方式。

大端方式(Big Endian):指令中给出的地址是操作数最高有效字节(MSB) 所在的地址。

小端方式(Little Endian):指令中给出的地址是操作数最低有效字节(LSB) 所在的地址。

7.地址码位数与主存容量和编址单位的关系是什么?

答:指令中的地址码如果是主存单元的地址,那么,地址码的位数与主存的容量和编址单位的长度有关。编址单位的长度就是主存单元的宽度,也就是最小的寻址单位。内存可以按字节编址(8位),也可以按字编址(如:16位,32位等)。主存的容量和编址单位确定后,地址码的位数就被确定了。例如,若主存容量为4GB,编址单位是字节,则主存单元的地址就是32位(因为,4GB= 232B);若按字(假定一个字为32位)编址,则主存单元的地址就是30位(因为,4GB= 232B= 230x4B)。

8.累加器型指令有什么特点?

答:累加器型指令的一个源操作数和目操作数总是在累加器中,是隐含指定的,所以指令中不需要给出累加器的编号。因而,累加器型指令的指令字相对来说较短,但由于每次运算结果都只能放到累加器中,可能会增加一些从累加器取数的指令而使程序变长。

9.堆栈型指令有什么特点?

答:与堆栈有关的操作有:入栈(PUSH)、出栈(POP)和运算类操作。运算类指令分单目运算和双目运算,总是从栈顶取操作数,运算后的结果自动放到栈顶。所以,指令中不需要给出操作数地址,因此,堆栈指令是零地址指令,指令字较短。但因为所有的操作数都只能在栈顶,所以,会增加很多入栈指令而使得程序变长。

堆栈指令的访存次数,取决于采用的是软堆栈还是硬堆栈。如果是软堆栈(堆栈区由内存实现)的话,对于双目运算,需要访问四次内存:取指、取源数1、取源数2、存结果。如果是硬堆栈(堆栈区由寄存器实现)的话,则只需取指令时访问一次内存。

10.通用寄存器型指令有什么特点?

答:通用寄存器型指令,是相对于累加器型指令和堆栈型指令而言的,指令中的操作数和运算的结果既不是隐含在累加器中,也不是隐含在堆栈中。而是在CPU中提供了多个通用寄存器,操作数和结果可以放在这些寄存器中,指令必须明显地指出操作数和结果在哪个寄存器或哪个主存单元中,要给出寄存器的编号或主存单元地址。目前大多数指令系统采用通用寄存器型指令风格。

11.装入/存储型指令有什么特点?

答:装入/存储型指令是用在规整型指令系统中的一种通用寄存器型指令风格。为了规整指令格式,使指令具有相同的长度,规定只有装入/存储(Load/Store)指令才能访问内存,而运算指令不能直接访问内存,只能从寄存器取数进行运算,运算的结果也只能送到寄存器。因为,寄存器编号较短,而主存地址位数较长,通过某种方式可以使运算指令和访存指令的长度一致。

这种装入/存储型风格的指令系统最大的特点是指令格式规整,指令长度一致,一般为32位。由于只有Load/Store指令才能访问内存,程序中可能会包含许多装入指令和存储指令,与一般通用寄存器型指令风格相比,其程序长度会更长。

12.指令寻址方式和数据寻址方式有什么不同?

答:程序被启动时,程序所包含的指令和数据都被装入到内存中。在程序指令过程中,需要取指令和操作数,确定指令存放位置的过程称为指令寻址方式,确定操作数存放位置的过程称为数据寻址方式。指令寻址和数据寻址其复杂度是不一样的。

指令寻址:指令基本上按执行顺序存放在主存中,执行过程中,指令总是从内存单元被取到指令寄存器IR中。顺序执行时,用指令计数器PC+“1”来得到下一条指令的地址;跳转执行时,通过转移指令的寻址方式,计算出目标地址,送到PC中即可。目标转移地址的形成方式主要有三种:立即寻址(直接地址)、相对寻址(相对地址)和间接寻址(间接地址)。

数据寻址:开始时,数据被存放在内存中,但在指令执行过程中,内存的数据可能被装入到CPU的寄存器中,或者内存的堆栈区中;还有的操作数可能是I/O端口中的内容,或本身就包含在指令中(即:立即数)。另外,运行的结果也可能要被送到CPU的寄存器中、堆栈中、I/O端口或内存单元中,所以,数据的寻址要涉及到对寄存器、内存单元、堆栈、I/O端口、立即数的访问。此外,操作数可能是某个一维或二维数组的元素,因此,还要考虑如何提供相应的寻址方式,以方便地在内存找到数组元素。综上所述,数据的寻址比指令的寻址要复杂得多。

13.如何指定指令的寻址方式?

答:CPU根据指令约定的寻址方式对地址码的有关信息进行解释,以找到下条要执行的指令,或指令所需的操作数。有的指令设置专门的寻址方式字段,显式说明采用何种寻址方式,有的指令通过操作码隐含寻址方式。

规整型指令一般在一条指令中只包含一种寻址方式,这样,就可在指令操作码中隐含寻址方式,不需要专门有寻址方式字段。但是对于不规整型指令,一条指令中的若干操作数可能存放在不同的地方,因而每个操作数可能有各自的寻址方式字段。

14.指令的操作数可能存放在机器的哪些地方?

答:指令的操作数可能存放在以下五个地方:

(1)内存单元:指令必须以某种方式给出内存单元的地址。又可分为以下几种情况:对单个独立的操作数进行处理;对一个数组中的若干个连续元素或一个数组元素进行处理;对一个表格或表格中的某个元素进行处理,等等。这些不同的情况需要提供不同的寻址方式进行操作数的访问。

(2)寄存器:指令中只要直接给出寄存器的编号即可。

(3)堆栈区:指令中不需要给出操作数的地址,数据的地址隐含地由堆栈指针给出。

(4)I/O端口:当某个I/O接口中的寄存器内容要和CPU中的寄存器内容交换时,要用I/O指令。在I/O传送指令中,需提供I/O端口号。

(5)指令中(立即数):操作数是指令的一部分,直接从指令中的立即数字段取操作数。

15.有哪些常用的数据寻址方式?

答:数据寻址方式可以归为以下几类:

(1)立即寻址:指令中的立即数字段,可以作为操作数,也可以作为直接转移地址。取到ALU运算前,可能要对其进行扩展。

(2)直接寻址类:指令中直接给出操作数所在的寄存器编号、I/O端口号或主存单元地址。如:直接寻址方式、寄存器寻址方式。

(3)间接寻址类:操作数在主存单元中,而操作数的地址存放在寄存器或另一个主存单元中,指令中给出操作数的地址所在的寄存器编号或主存单元地址。如:间接寻址方式、寄存器间接寻址方式。

(4)偏移寻址类:指令通过某种方式给出一个形式地址和一个基地址(往往在某个寄存器中),经过相应的计算(基地址加形式地址)得到操作数所在的内存单元地址。如:变址寻址方式、相对寻址方式、基址寻址方式等。

16.取直接寻址的操作数要访问几次内存?

答:一次。只要根据指令中给出的内存单元地址访问一次内存,取出来的就是操作数。

17.取间接寻址的操作数要访问几次内存?

答:至少两次。先根据指令中给出的内存单元地址访问一次内存,取出来的是操作数的地址;再根据操作数的地址去内存访问一次,取出来的才是操作数。所以,一共访问两次内存。如果是多级间接地址的话,可能还要访问内存。

18.取寄存器寻址的操作数要访问几次内存?

答:不需要访问内存。从指定寄存器中取出的就是操作数。

19.取寄存器间接寻址的操作数要访问几次内存?

答:一次。先从指令给出的寄存器中取出操作数地址,再根据操作数地址到内存访问,得到的就是操作数。

20.什么是变址寻址方式?

答:变址寻址方式下,指令中的地址码给出一个形式地址,并且隐含或明显地指定一个寄存器作为变址寄存器,变址寄存器的内容(变址值)和形式地址相加,得到操作数的有效地址,根据有效地址到内存访问,去取操作数或写运算结果 。

变址寻址方式的应用很广泛。最基本的使用场合是用在对数组元素的访问。指令将数组的首地址指定为形式地址,变址寄存器的内容是数组元素的下标,随着下标的变化,可以访问数组中不同的元素。所以变址寄存器的内容是变化的,反映的是所访问的数据到数组首地址的距离,称为变址值。这种应用场合下,形式地址的位数较长,而变址值位数少。变址寻址方式的指令一般包含在一个循环体内。每次进入循环时,变址值都增或减一个定长值,这个定长值等于数组元素的长度。

21.什么是基址寻址方式?

答:基址寻址方式下,指令中的地址码给出一个形式地址,作为位移量,并且隐含或明显地指定一个寄存器作为基址寄存器,基址寄存器的内容和形式地址相加,得到操作数的有效地址,根据有效地址到内存访问,去取操作数或写运算结果。

基址寻址的典型应用有两个:一个是程序重定位,在多道程序运行的系统中,每个用户程序在一个逻辑地址空间里编写程序。装入计算机运行时,由操作系统给用户程序分配主存空间,每个用户程序有一个基地址,存放在基址寄存器中,在程序执行时,通过基址寄存器的值加上指令中的形式地址就可以形成实际的主存单元地址。第二个应用是扩展有限长度指令的寻址空间。即在运行时将某个主存区间的首地址或程序段的首地址装入基址寄存器,而形式地址给出要访问的单元相对于该首地址的距离(即偏移量),因此指令中只要用较短的地址码来表示偏移量。访问操作数时,用基址寄存器的值和偏移量相加,得到操作数的内存单元地址。只要基址寄存器的内容更改到另外的一个主存地址,则操作数的地址空间就移到另一个主存区间。因而可以访问到主存的整个地址空间,以实现短地址访问大空间的目的。

22.变址寻址和基址寻址的区别是什么?

答:变址寻址方式和基址寻址方式的有效地址形成过程类似。但是,基址寻址方式与变址寻址方式在以下方面不同:(1)具体应用的场合不同。变址寻址面向用户,可用于访问字符串、数组、表格等成批数据或其中的某些元素。基址寻址面向系统,用于解决程序的重定位问题和短地址访问大空间的问题。(2)使用方式不同。变址寻址时,指令中提供的形式地址是一个基准地址,位移量由变址寄存器给出;而基址寻址时,指令中给出的形式地址为位移量,而基址寄存器中存放的是基准地址。不过,这里所讲的使用方式并不是绝对的,在实际的计算机设计中,可能会有不同的应用场合和使用方式。

23.什么是相对寻址方式?

答:相对寻址方式的有效地址形成方法如下:指令中的形式地址给出一个位移量D。而基准地址由程序计数器PC提供。即:有效地址EA=(PC)+ D。位移量给出的是相对于当前指令所在内存单元的距离,位移量可正、可负。也就是说,要找的可以在当前指令前D个单元处的信息,也可以是当前指令后D个单元处的信息。

24.相对寻址方式用在哪些场合?

答:相对寻址方式用在以下两种场合:

(1)公共子程序的浮动。因为公共子程序可能被许多用户程序调用,因而会随着用户程序装入到内存不同的地方运行。为了让公共子程序能在不同的内存区正确运行,一般在公共子程序内部采用相对寻址方式,以保证指令的操作数总在相对于指令的距离一定的单元内。这样,不管子程序浮动到哪里,指令和数据的相对位置不变。例如,现行指令的地址为2000H,指令中给出的形式地址为05H,说明操作数在当前指令后面第05H个单元处,即2005H处。当程序向后浮动了1000H,使当前指令的地址为3000H时,此时公共子程序中的指令、数据以及相对位置都不变,指令中给出的相对地址还是05H,操作数还是应该在当前指令后面的第05H个单元处,所以应该在3005H处,因此,指令取到的还是同一个数据。

(2)转移目标地址的寻址。当需要转到当前指令的前面或后面第n条指令执行时,可以用相对寻址方式。此时,得到的转移地址是一个相对地址。

25.相对寻址方式中如何确定相对位置?

答:相对寻址方式中,相对位置的确定比较复杂。必须注意两个方面的问题:(1)位移量的问题。位移量位数有限,在进行有效地址计算时需要扩展。一般位移量用补码表示,所以应采用补码扩展填充方式(即:符号扩展方式)。(2)基准地址问题。相对寻址的基本思路是把相对于当前指令前面或者后面第n个单元作为操作数或目标转移指令的地址。但在具体实现时,不同机器对“当前指令”的含义有不同的理解。有的机器在计算相对地址时,PC中存放的还是当前正在执行的指令的地址,但有的机器PC加“1”的操作在取指令的同时完成,所以在计算相对地址时,PC中已经是下一条指令的地址。因此,不同的机器在计算相对地址时可能有一点细微的差别。

26.堆栈寻址方式中如何对堆栈进行操作?

答:堆栈是一块特殊的存储区。采用“先进后出”的方式进行访问。栈底固定不动,栈顶浮动,用一个专门的寄存器(SP)来作为栈顶指针。从堆栈生长的方向来分,可以有“自顶向下”和“自底向上”两种堆栈,它们在进、出栈时对栈指针的修改是不同的。

假定栈指针指向的总是栈顶处非空元素,则应该按以下方式修改栈指针:

对于“自底向上”生成的堆栈,进栈时先修改栈指针:(SP)-1→SP,然后再压入数据;出栈时先将数据弹出,然后再修改栈指针(SP)+1→SP。对于“自顶向下”生成的堆栈,进栈时先修改栈指针:(SP)+1→SP,然后再压入数据;出栈时先将数据弹出,然后再修改栈指针(SP)-1→SP。

假定栈指针指向的总是栈顶处的空元素,则应该按以下方式修改栈指针:

对于“自底向上”生成的堆栈,进栈时先压入数据,然后再修改栈指针:(SP)-1→SP;出栈时先修改栈指针:(SP)+1→SP,然后再将数据弹出。对于“自顶向下”生成的堆栈,进栈时先压入数据,然后再修改栈指针:(SP)+1→SP;出栈时先修改栈指针:(SP)-1→SP,然后再将数据弹出。

若每个栈中的元素只占一个内存单元,则修改指针时,通过“+1”或“-1”实现;若占多个内存单元,则应该加上或减去相应的值。

27.返回指令要不要有地址字段?

答:不一定。子程序的最后一条指令一定是返回指令。一般返回地址保存在堆栈中,所以返回指令中不需要明显给出返回地址,直接从栈顶取地址作为返回地址。如果有些计算机不采用堆栈保存返回地址,而是存放到其他不确定的地方,则返回指令中必须有一个地址码,用来指出返回地址或指出返回地址的存放位置。

28.转移指令和转子(调用)指令的区别是什么?

答:转移指令有无条件转移指令和条件转移指令(也叫分支指令)。这种转移指令用于改变程序执行的顺序,转移后不再返回来执行,所以无需保存返回地址。而转子指令是一种子程序调用指令,子程序执行结束时,必须返回到转子指令后面的指令执行。所以转子指令执行时,除了和转移指令一样要计算跳转的目标地址外,还要保存返回地址。一般将转子指令后面那条指令的地址作为返回地址保存到堆栈中。址保存到堆栈中。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档