大学课程《计算机系统结构》复习题1、假定某计算机存储器按字节编址,CPU从存储器中读出一个4字节信息D=32343538H,该信息的内存地址为0000F00CH,按小端方式存放,请回答下列问题。(1)该信息D占用了几个内存单元?这几个内存单元的地址及其内容各是什么?(2)若D是一个32位无符号数,则其值是多少?(3)若D是一个32位补码表示的带符号整数,则其值是多少?(4)若D是一个IEEE754单精度浮点数,则其值是多少?(5)若D是一个用8421码表示的无符号整数,则其值是多少?(6)若D是一个字符串,每个字节的低7位表示对应字符的ASCII码,则对应字符串是什么?(7)若D是两个汉字的国标码,则这两个汉字在GB2312字符集码表中分别位于哪一行和哪一列?(8)若D中前3个字节分别是一个像素的R、G、B分量的颜色值,则其值各是多少?【分析解答】将32343538H展开为二进制表示为00110010001101000011010100111000B。(1)因为存储器按字节编址,所以4个字节占用4个内存单元,其地址分别是0000F00CH、0000F00DH、0000F00EH、0000F00FH。由于采用小端方式存放,所以,最低有效字节38H存放在0000F00CH中,35H存放在0000F00DH中,34H存放在0000F00EH中,32H存放在0000F00FH。(2)无符号数。值为229+228+225+221+220+218+213+212+210+28+25+24+23。(3)补码整数。符号为0,表示其为正数,其值与无符号数的值一样。(4)IEEE754单精度浮点数。根据IEEE754单精度浮点数格式可知,符号位s=0,为负数;阶码e=01100100B=100,故阶码的值为100–127=–27;尾数小数部分f=0.01101000011010100111000,所以,其值为1.01101000011010100111B×2-27。(5)8421码整数。32343538H各位表示对应十进制数32343538,所以,其值为32343538。(6)ASCII码字符串。各字节的低7位分别为0110010、0110100、0110101、0111000,所以,对应的字符串为“2458”。(7)汉字。对国标码每个字节各自减20H,得到两个汉字的区位码,分别为1214H和1518H,也即,第一个汉字在GB2312字符集码表中位于第18(12H)行、第20(14H)列,第二个汉字位于第21(15H)行、第24(18H)列。(8)颜色值。该像素的R、G、B分量的颜色值分别为00110010B=50,00110100B=52,00110101B=53。1.某字长为8位的计算机中,x和y为无符号整数,已知x=68,y=80,x和y分别存放在寄存器A和B中。请回答下列问题(要求最终用十六进制表示二进制序列)。(1)寄存器A和B中的内容分别是什么?(2)若x和y相加后的结果存放在寄存器C中,则寄存器C中的内容是什么?运算结果是否正确?此时,零标志ZF是什么?加法器最高位的进位C是什么?(3)若x和y相减后的结果存放在寄存器D中,则寄存器D中的内容是什么?运算结果是否正确?此时,零标志ZF是什么?加法器最高位的进位C是什么?(4)无符号整数加/减运算时,加法器最高位进位C的含义是什么?它与进/借位标志CF的关系是什么?(5)无符号整数一般用来表示什么信息?为什么通常不对无符号整数的运算结果判断溢出?【分析解答】(1)x=68=01000100B=44H;y=80=01010000B=50H。所以,寄存器A和B中的内容分别是44H和50H。(2)x+y=01000100+01010000=(0)10010100=94H,所以,寄存器C中的内容为94H,对应的真值为148,运算结果正确。因为结果不为0,所以ZF=0;加法器最高位的进位C为0。(3)x–y=x+[–y]补=01000100+10110000=(0)11110100=F4H,所以,寄存器D中的内容为F4H,对应的真值为244,运算结果不正确,这是因为相减结果为负数造成的。因为结果不为0,所以ZF=0;加法器最高位的进位C为0。(4)在加法器中进行无符号整数加法运算时,若加法器最高位进位C=1,则表示实际结果大于最大可表示数255;在加法器中进行无符号整数减法运算时,若加法器最高位进位C=1,则表示被减数大于减数,反之被减数小于减数。因此,在无符号数相加时,CF就等于C,表示进位;在无符号数相减时,通常将最高进位C取反来作为借位标志CF,也即,无符号整数相减时,CF=C,CF=1表示有借位。(5)无符号整数一般用来表示地址(指针)信息,当两个地址相加结果大于最大地址而取低位地址时,相当于取模,也即采用地址循环运算。因此通常不需要判断其运算结果是否溢出,即不考虑溢出标志OF。2.假设某字长为8位的计算机中,带符号整数采用补码表示,x=–68,y=–80,x和y分别存放在寄存器A和B中。请回答下列问题(要求最终用十六进制表示二进制序列)。(1)寄存器A和B中的内容分别是什么?(2)若x和y相加后的结果存放在寄存器C中,则寄存器C中的内容是什么?运算结果是否正确?此时,溢出标志OF、符号标志SF和零标志ZF各是什么?加法器最高位的进位C是什么?(3)若x和y相减后的结果存放在寄存器D中,则寄存器D中的内容是什么?运算结果是否正确?此时,溢出标志OF、符号标志SF和零标志ZF各是什么?加法器最高位的进位C是什么?(4)若将加法器最高位的进位C作为进位标志CF,则能否直接根据CF的值对两个带符号整数的大小进行比较?【分析解答】(1)[–68]补=[–1000100]补=10111100B=BCH。[–80]补=[–1010000]补=10110000B=B0H。所以,寄存器A和B中的内容分别是BCH和B0H。(2)[x+y]补=[x]补+[y]补=10111100+10110000=(1)01101100=6CH,最高位前面的一位1被丢弃,因此,寄存器C中的内容为6CH,对应的真值为+108,结果不正确。溢出标志位OF可采用以下任意一条规则判断得到。规则1:若两个加数的符号位相同,但与结果的符号位相异,则溢出;规则2:若最高位上的进位和次高位上的进位不同,则溢出。通过这两个规则都判断出结果溢出,溢出标志位OF为1,说明寄存器C中的内容不是正确的结果。x+y的正确结果应是–68+(–80)=–148,而运算的结果为108,两者不等。其原因是因为x+y的值(即–148)小于8位补码可表示的最小值(即–128),也即结果发生了溢出;结果的第一位(最高位)0为符号标志位SF,表示结果为正数。因为溢出标志为1,所以符号标志实际上也是错的;因为结果不为0,所以零标志ZF=0;加法器最高位向前面的进位C为1。(3)[x–y]补=[x]补+[–y]补=10111100+01010000=(1)00001100=0CH,最高位前面的一位1被丢弃,因此,寄存器D中的内容为0CH,对应的真值为+12,结果正确。两个加数的符号位相异一定不会溢出,因此溢出标志OF为0,说明寄存器D中的内容是真正的结果;结果的第一位(最高位)0为符号标志位SF,表示结果为正数;因为结果不为0,所以零标志ZF=0;加法器最高位向前面的进位C为1。(4)若将加法器最高位的进位C作为进位标志位CF,则无法直接根据CF的值判断两个带符号整数的大小,因此带符号加减运算中不考虑CF标志。3.某计算机标志寄存器包含四个标志位:CF–进/借位标志;OF–溢出标志;SF–符号标志;ZF–零标志。请说明在无符号数和带符号整数两种情况下,以下各种比较运算的逻辑判断表达式。(1)等于;(2)大于;(3)小于;(4)大于等于;(5)小于等于。【分析解答】要比较两个数的大小,通常对这两个数先做减法,根据相减的结果生成相应的标志位,最后根据标志位判断大小。在无符号数相减时,一般不考虑SF和OF标志;在带符号整数相减时,一般不考虑CF标志。假设被减数的机器数为X,减数的机器数为Y,则在加法器中计算两数的差时,计算公式为:X–Y=X+(–Y)补。以下举两个例子来说明。假定X=1001,Y=1100,则在4位加法器中执行以下运算:1001–1100=1001+0100=(0)1101。若是无符号数比较,则是9和12相比,显然,ZF=0,CF=1;若是带符号整数(补码表示),则是–7和–4比较,显然,ZF=0,OF=0,SF=1。假定X=1001,Y=0100,则在4位加法器中执行以下运算:1001–0100=1001+1100=(1)0101。若是无符号数比较,则是9和4相比,显然,ZF=0,CF=0;若是带符号整数,则是–7和4比较,显然,ZF=0,OF=1,SF=0。以下分别说明无符号数和带符号整数两种情况下各种比较运算的逻辑判断表达式。a.无符号数情况(1)等于:相减后结果为零,即F=ZF。(2)大于:没有借位且相减后不为0,即F=CF+ZF(3)小于:有借位且相减后不为0,即F=CF•ZF(4)大于等于:没有借位或相减后结果为0,即F=CF+ZF(5)小于等于:有借位或相减后结果为0,即F=CF+ZFb.带符号整数情况(1)等于:相减后结果为零,即F=ZF。(2)大于:相减后结果不为0,并且,不溢出时为正,溢出时为负。即F=ZF•(SF⊕OF)(3)小于:相减后结果不为0,并且,不溢出时为负,溢出时为正。即F=ZF•(SF⊕OF)(4)大于等于:相减后结果为0,或者,不溢出时为正,溢出时为负。即F=ZF+(SF⊕OF)(5)小于等于:相减后结果为0,或者,不溢出时为负,溢出时为正。即F=ZF+(SF⊕OF)4.以下是一个计算阶乘的C语言递归过程,请按照MIPS过程调用协议写出该递归过程对应的MIPS汇编语言程序,要求目标代码尽量短(提示:乘法运算可用乘法指令“mulrd,rs,rt”来实现)。intfact(intn){if(n1)return(1);elsereturn(n*fact(n-1));}【分析解答】(1)过程fact有一个输入参数n,按MIPS过程调用协议,n应在$a0中,返回参数应存放在$v0中。过程内没有局部变量,故无需在其栈帧中保留局部变量所用空间;需递归调用fact过程,所以必须在其栈帧中保留返回地址$ra。过程体内全部使用临时寄存器$t0~$t9,因而无需在其栈帧中保存通用寄存器。因为是递归调用,所以需在栈帧中保留输入参数。因而,该过程的栈帧中要保存的信息有返回地址$ra、帧指针$fp和输入参数$a0,其栈帧空间大小为4×3=12B。fact:addi$sp,$sp,-12#generatestackframesw$ra,8($sp)#save$raonstacksw$fp,4($sp)#save$fponstackaddi$fp,$sp,0#set$fpsw$a0,0($fp)#save$a0(n)onstackslti$t0,$a0,1#if(n1)$t0=1else$t0=0bne$t0,$zero,exit1#if(n1)gotoexit1addi$a0,$a0,-1#n=n-1jalfact#callfactlw$t1,0($fp)#restorenmul$v0,$t1,$v0#$v0=n*fact(n-1)jexitexit1:addi$v0,$zero,1#$v0=1exit:lw$ra,8($sp)#restore$ralw$fp,4($sp)#restore$fpaddi$sp,$sp,12#freestackframejr$ra#returntocaller5.假设MIPS指令系统中有一条I-型带符号整数比较指令“bgtrs,rt,Imm16”,其功能为:若R[rs]R[rt]则PC=PC+4+Imm16×4否则PC=PC+4若ALU能产生ZF(零)、SF(符号)和OF(溢出)三个标志的输出,