文章目录
- 【计算机组成原理2019年真题45题-16分】
- 【第一步:信息提取】
- 【第二步:具体解答】
- 【计算机组成原理2019年真题46题-7分】
- 【第一步:信息提取】
- 【第二步:具体解答】
【计算机组成原理2019年真题45题-16分】
【第一步:信息提取】
1、编址方式:字节
2、int型数据占32位:4B
3、对代码的分析:机器级代码行包括行号、虚拟地址、机器指令和汇编指令。
【第二步:具体解答】
第一小题
(1)计算需要调用函数 f ( 10 ) f(10) f(10)多少次?
只有当n=1时,结束调用f1函数,所以,分别调用f1函数时的参数n的取值为:10、9、8、7、6、5、4、3、2、1,一共10次
(2)执行哪条指令会递归调用f1?
我们看f1的第一行的虚拟地址为0040 1000,所以就看哪一行会跳回这一行,发现是第16行调用了,也就是call f1
第二小题
(1)在上述代码中,哪条指令是条件转移指令?
纯考对汇编的理解看,分别是第12行的jle,第16行的call,第20行的jmp,第30行的ret。
其实本题还是给了一些小提示,也就是这些指令后面的汇编后面加了虚拟地址,对照虚拟地址找到行数,就可以推测是转移指令了
(2)哪几条指令一定会使程序跳转执行?
第16行的call,第20行的jmp,第30行的ret是一定要跳转的,第12行的jle指令含义是,为小于等于是转移,本行的意义是,n≤1时,跳转至0040 1035H
第三小题
(1)根据第16行的call 指令,第17行指令的虚拟地址应是多少?
由信息提取①可知,本计算机使用字节编址,也就是8个bit。
16行的call指令的虚拟地址是:0040 1025H,机器指令是 E8 D6 FF FF FF,因此长度为5个字节
可以得出算数公式:0040 1025H+0005H=0040 102AH,所以第17行指令的虚拟地址应是:0040 102AH
(2)已知第16行的call 指令采用相对寻址方式,该指令中的偏移量应是多少(给出计算过程)?
16行的call指令是一个相对寻址方式,有公式:目标地址=(PC)+偏移量,call的目标地址是0040 1000H
所以,偏移量=目标地址 - (PC) = 0040 1000H - 0040 1025H = FFFF FFD6H
(3)已知第16行的call指令的后4字节为偏移量,M是采用大端方式还是采用小端方式?
我们从第16行的call指令的机器指令可以得到E8 D6 FF FF FF,可以看到低地址数据放在高地址上,高地址数据放在低地址上,所以采用小端方式
第四小题
(1) f ( 13 ) f(13) f(13) =6227020800,但 f 1 ( 13 ) f_1(13) f1(13)的返回值为1932053504,为什么两者不等?
首先我们来对比两个数,实际得到的值比预期值小,说明出现了溢出现象,也就是说由信息提取①可知,int表示32位,而 f ( 13 ) f(13) f(13)的值大于32位int所能表示的值了,所以不一致
(2)要使 f 1 ( 13 ) f_1(13) f1(13)能返回正确的结果,应如何修改f1的源程序?
我们知道了,主要是由于32位所表示的int类型的值不能表示 f 1 ( 13 ) f_1(13) f1(13)的实际值了,所以只需要拓展位数,也就是将int类型改为long long类型即可
第五小题
(1)第19行的imul指令(带符号整数乘)的功能是R[eax]<—R[eax]*R[ecx],当乘法器输出的高、低32位乘积之间满足什么条件时,溢出标志 OF=1?
若乘积的高33位非全0或非全1(为什么是高33位而不是32位呢,因为多出的那一位代表的是数值的正负),就出现了溢出,则溢出标志 OF=1
(2)要使CPU在发生溢出时转异常处理,编译器应在 imul指令后应加一条什么指令?
加一条溢出自陷指令,当OF等于1时启动
总结:
从以上五个小题可以看出来以下信息
-
本题是考察计算机组成原理中指令系统和数据的表示和运算(考察的知识点)还有一部分汇编语言
-
遇到不会做可以找一下题目中暗含的提示,比如本题的除了最后一个ret至另外,其他的跳转指令都加上了地址
-
看题要细致,比如第五小题第一问,给了带符号位整数乘,则第一位是符号位,所以查看的是乘积位高33位
-
实在不会做的,可以蒙一个,比如第五小题第二问。其实给了一个隐含提示,也就是异常处理,CPU的异常处理就是自陷,我答的是中断
【计算机组成原理2019年真题46题-7分】
【第一步:信息提取】
1、主存地址为32位:表示主存大小为4GB
2、页大小为4KB:给了页面大小的同时,给了页面数 4GB/4KB=1M 个页面
3、指令Cache有64行,采用4路组相联映射方式,主存块大小为64B:所以分为16个组。组相联的地址方式:主存字块标记+组地址+字块内地址。所以组地址占4bit;主存块大小为64B,字块内地址占6位
【第二步:具体解答】
(1)第1行的push 指令和第30行的ret 指令是否在同一页中(说明理由)?
第1行的push指令为 0040 1000H;第30行的ret指令为 0040 104AH
由信息提取②可知,一个页面为4KB,占12bit,信息提取①虚拟地址长32bit,所以前20位是页号。
第1行的push指令的页号为为 0040 1H;第30行的ret指令的页号为为 0040 1H,所以在同一页
(2)若指令Cache有64行,采用4路组相联映射方式,主存块大小为64B,则32位主存地址中,哪几位表示块内地址?(3)哪几位表示 Cache组号?(4)哪几位表示标记(tag)信息?
由信息提取③可知,指令Cache有64行,采用4路组相联映射方式,所以分为16个组。组相联的地址方式:主存字块标记+组地址+字块内地址。所以组地址占4bit;主存块大小为64B,字块内地址占6位。所以主存字块标记为22位。
综上所述:低地址6位为块内地址,中间4位为组地址,高22位为标记(tag)信息
(5)读取第16行的call指令时,只可能在指令Cache的哪一组中命中(说明理由)?
16行的call指令的虚拟地址是:0040 1025H,我们从上题可知,中间4位为组地址将虚拟地址转换:0000 0000 0100 0000 0001 0000 0010 0101,取第7~10位,所以为0组命中
总结:
从以上五个小题可以看出来以下信息:
-
主要考察的是存储器系统,具体是Cache-主存的映射方式
-
要分清,给出地址的每个分段分别代表什么意思,从地址出发要不要想当然