欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOC文档下载
    分享到微信 分享到微博 分享到QQ空间

    计算机系统第三章答案.doc

    • 资源ID:710397       资源大小:176KB        全文页数:11页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    计算机系统第三章答案.doc

    1、习 题3 参考答案:(1)后缀:w,源:基址+比例变址+偏移,目:寄存器(2)后缀:b,源:寄存器, 目:基址+偏移(3)后缀:l,源:比例变址,目:寄存器(4)后缀:b,源:基址,目:寄存器(5)后缀:l,源:立即数,目:栈(6)后缀:l,源:立即数,目:寄存器(7)后缀:w,源:寄存器,目:寄存器(8)后缀:l,源:基址+变址+偏移,目:寄存器4参考答案:(1)源操作数是立即数0xFF,需在前面加$(2)源操作数是16位,而长度后缀是字节b,不一致(3)目的操作数不能是立即数寻址(4)操作数位数超过16位,而长度后缀为16位的w(5)不能用8位寄存器作为目的操作数地址所在寄存器(6)源操作

    2、数寄存器与目操作数寄存器长度不一致(7)不存在ESX寄存器(8)源操作数地址中缺少变址寄存器5参考答案:表3.12 题5用表src_typedst_type机器级表示charintmovsbl %al, (%edx) intcharmovb %al, (%edx)intunsignedmovl %eax, (%edx)shortintmovswl %ax, (%edx)unsigned charunsignedmovzbl %al, (%edx)charunsignedmovsbl %al, (%edx)intintmovl %eax, (%edx)6参考答案:(1)xptr、yptr和zpt

    3、r对应实参所存放的存储单元地址分别为:Rebp+8、Rebp+12、Rebp+16。(2)函数func的C语言代码如下: void func(int *xptr, int *yptr, int *zptr)int tempx=*xptr;int tempy=*yptr;int tempz=*zptr;*yptr=tempx;*zptr = tempy;*xptr = tempz;7参考答案:(1)Redx=x(2)Redx=x+y+4(3)Redx=x+8*y(4)Redx=y+2*x+12(5)Redx=4*y(6)Redx=x+y8参考答案:(1)指令功能为:RedxRedx+MReax=

    4、0x00000080+M0x8049300,寄存器EDX中内容改变。改变后的内容为以下运算的结果:00000080H+FFFFFFF0H0000 0000 0000 0000 0000 0000 1000 00001111 1111 1111 1111 1111 1111 1111 00001 0000 0000 0000 0000 0000 0000 0111 0000+因此,EDX中的内容改变为0x00000070。根据表3.5可知,加法指令会影响OF、SF、ZF和CF标志。OF=0,ZF=0,SF=0,CF=1。(2)指令功能为:RecxRecx-MReax+Rebx=0x0000001

    5、0+M0x8049400, 寄存器ECX中内容改变。改变后的内容为以下运算的结果:00000010H-80000008H0000 0000 0000 0000 0000 0000 0001 00000111 1111 1111 1111 1111 1111 1111 10000 1000 0000 0000 0000 0000 0000 0000 1000+因此,ECX中的内容改为0x80000008。根据表3.5可知,减法指令会影响OF、SF、ZF和CF标志。OF=1,ZF=0,SF=1,CF=10=1。(3)指令功能为:RbxRbx or MReax+Recx*8+4,寄存器BX中内容改变

    6、。改变后的内容为以下运算的结果:0x0100 or M0x8049384=0100H or FF00H0000 0001 0000 00001111 1111 0000 0000 1111 1111 0000 0000 or因此,BX中的内容改为0xFF00。由3.3.3节可知,OR指令执行后OF=CF=0;因为结果不为0,故ZF=0;因为最高位为1,故SF=1。(4)test指令不改变任何通用寄存器,但根据以下“与”操作改变标志:Rdl and 0x80 1000 00001000 0000 1000 0000 andd由3.3.3节可知,TEST指令执行后OF=CF=0;因为结果不为0,故

    7、ZF=0;因为最高位为1,故SF=1。(5)指令功能为:MReax+RedxMReax+Redx*32,即存储单元0x8049380中的内容改变为以下运算的结果:M0x8049380*32=0x908f12a8*32,也即只要将0x908f12a8左移5位即可得到结果。 1001 0000 1000 1111 0001 0010 1010 10005=0001 0001 1110 0010 0101 0101 0000 0000因此,指令执行后,单元0x8049380中的内容改变为0x11e25500。显然,这个结果是溢出的。但是,根据表3.5可知,乘法指令不影响标志位,也即并不会使OF=1。

    8、(6)指令功能为:Rcx Rcx-1,即CX寄存器的内容减一。0000 0000 0001 00001111 1111 1111 11111 0000 0000 0000 1111 +因此,指令执行后CX中的内容从0x0010变为0x000F。由表3.5可知,DEC指令会影响OF、ZF、SF,根据上述运算结果,得到OF=0,ZF=0,SF=0。9参考答案:movl12(%ebp), %ecx/RecxMRebp+12,将y送ECX sall$8, %ecx/RecxRecx=0,则转.L1执行7 addb %dl, (%eax) /MReaxMReax+Rdl,即*p+=x8 .L1: 因为C

    9、语言if语句中的条件表达式可以对多个条件进行逻辑运算,而汇编代码中一条指令只能进行一种逻辑运算,并且在每条逻辑运算指令生成的标志都是存放在同一个EFLAGS寄存器中,所以,最好在一条逻辑指令后跟一条条件转移指令,把EFLAGS中标志用完,然后再执行另一次逻辑判断并根据条件进行转移的操作。(2)按照书中图3.22给出的“if () goto ”语句形式写出汇编代码对应的C语言代码如下:1 void comp(char x, int *p)2 3 if (p!=0) 4 if (x0)5 *p += x;6 13参考答案:1 int func(int x, int y)2 3 int z = x*

    10、y ;4if ( xx ) 6z = x+y ;7else 8z = x-y ;9 else if ( x=16 )10 z = x &y ;11return z;12 14参考答案:(1)每个入口参数都要按4字节边界对齐,因此,参数x、y和k入栈时都占4个字节。1 movw 8(%ebp), %bx/RbxMRebp+8,将x送BX2 movw 12(%ebp), %si/RsiMRebp+12,将y送SI3 movw16(%ebp), %cx/RcxMRebp+16,将k送CX4 .L1:5 movw %si, %dx/RdxRsi,将y送DX6 movw %dx, %ax/RaxRdx,

    11、将y送AX7 sarw $15, %dx/RdxRdx15,将y的符号扩展16位送DX8 idiv %cx/RdxRdx-axRcx的余数,将y%k送DX/RaxRdx-axRcx的商,将y/k送AX9 imulw %dx, %bx/RbxRbx*Rdx,将x*(y%k) 送BX10 decw %cx/RcxRcx-1,将k-1 送CX11 testw %cx, %cx/Rcx and Rcx,得OF=CF=0,负数则SF=1,零则ZF=112 jle .L2/若k小于等于0,则转.L213 cmpw %cx, %si/Rsi - Rcx,将y与k相减得到各标志14 jg .L1/若y大于k,

    12、则转.L115 .L2:16 movswl %bx, %eax/ ReaxRbx,将x*(y%k) 送AX(2)被调用者保存寄存器有BX、SI,调用者保存寄存器有AX、CX和DX。在该函数过程体前面的准备阶段,被调用者保存的寄存器EBX和ESI必须保存到栈中。(3)因为执行第8行除法指令前必须先将被除数扩展为32位,而这里是带符号数除法,因此,采用算术右移以扩展16位符号,放在高16位的DX中,低16位在AX中。15参考答案: 1 int f1(unsigned x)2 3 int y = 0 ;4while ( x!=0 ) 5y =x ;6 x=1 ;7 8return y&0x1 ;9

    13、函数f1的功能返回:( x x1 x2 .) & 0x1,因此f1用于检测x的奇偶性,当x中有奇数个1,则返回为1,否则返回0。16参考答案: 函数sw只有一个入口参数x,根据汇编代码的第25行指令知,当x+37时转标号.L7处执行,否则,按照跳转表中的地址转移执行,x与跳转目标处标号的关系如下:x+3=0:.L7 x+3=1:.L2 x+3=2:.L2 x+3=3:.L3 x+3=4:.L4 x+3=5:.L5 x+3=6:.L7x+3=7:.L6由此可知,switch (x) 中省略的处理部分结构如下: case -2:case -1:/ .L2标号处指令序列对应的语句break; cas

    14、e 0: / .L3标号处指令序列对应的语句break;case 1:./ .L4标号处指令序列对应的语句break;case 2: / .L5标号处指令序列对应的语句break;case 4:/ .L6标号处指令序列对应的语句break; default:/ .L7标号处指令序列对应的语句17参考答案:根据第2、3行指令可知,参数a是char型,参数p是指向short型变量的指针;根据第4、5行指令可知,参数b和c都是unsigned short型,根据第6行指令可知,test的返回参数类型为unsigned int。因此,test的原型为: unsigned int test(char a

    15、, unsigned short b, unsigned short c, short *p);18参考答案:每次执行pushl指令后,Resp=Resp-4,因此,第2行指令执行后Resp=0xbc00001c。 (1)执行第3行指令后,Rebp=Resp=0xbc00001c。到第12条指令执行结束都没有改变EBP的内容,因而执行第10行指令后,EBP的内容还是为0xbc00001c。执行第13行指令后,EBP的内容恢复为进入函数funct时的值0xbc000030。 (2)执行第3行指令后,Resp=0xbc00001c。执行第4行指令后Resp= Resp-40=0xbc00001c-

    16、0x28=0xbbfffff4。因而执行第10行指令后,未跳转到scanf函数执行时,ESP中的内容为0xbbfffff4-4=0xbbfffff0;在从scanf函数返回后ESP中的内容为0xbbfffff4。执行第13行指令后,ESP的内容恢复为进入函数funct时的旧值,即Resp=0xbc000020。 (3)第5、6两行指令将scanf的第三个参数&y入栈,入栈的内容为Rebp-8=0xbc000014;第7、8两行指令将scanf的第二个参数&x入栈,入栈的内容为Rebp-4=0xbc000018。故x和y所在的地址分别为0xbc000018和0xbc000014。ESP从scan

    17、f返回的地址0xbc00001c0xbc000030y=20 x=15EBP0xbc0000180xbc0000140xbc0000100xbc00000c0xbc0000080xbc0000040xbc0000000xbbfffffc0xbbfffff80xbbfffff40xbbfffff00xbc0000140xbc0000180x804c000栈帧底部 (4)执行第10行指令后,funct栈帧的地址范围及其内容如下:19参考答案:第1行汇编指令说明参数x存放在EBX中,根据第4行判断x=0则转.L2,否则继续执行第510行指令。根据第5、6、7行指令可知,入栈参数nx的计算公式为x1;

    18、根据第9、10、11行指令可知,返回值为(x&1)+rv。由此推断出C缺失部分如下:1int refunc(unsigned x) 2if ( x=0 )3return 0 ;4unsigned nx = x1 ;5int rv = refunc(nx) ;6return (x & 0x1) + rv ; 7该函数的功能为计算x的各个数位中1的个数。20参考答案: 在IA-32中,GCC为数据类型long double型变量分配12字节空间,实际上只占用10个字节。数组元素大小(B)数组大小(B)起始地址元素i的地址char A10110&A0&A0+iint B1004400&B0&B0+4

    19、ishort *C5420&C0&C0+4ishort *D6424&D0&D0+4ilong double E1012120&E0&E0+12ilong double *F10440&F0&F0+4i21参考答案:表达式类型值汇编代码Sshort *ASleal (%edx), %eax S+ishort *AS+2*ileal (%edx, %ecx, 2), %eax SishortMAS+2*imovw (%edx, %ecx, 2), %ax &S10short *AS+20leal 20(%edx), %eax &Si+2short *AS+2*i+4leal 4(%edx, %e

    20、cx, 2), %eax &Si-Sint(AS+2*i-As)/2=imovl %ecx, %eax S4*i+4shortMAS+2*(4*i+4)movw 8(%edx, %ecx, 8), %ax *(S+i-2)shortMAS+2*(i-2)movw -4(%edx, %ecx, 2), %ax 22参考答案:根据汇编指令功能可以推断最终在EAX中返回的值为:Ma+28*i+4*j+Mb+20*j+4*i,因为数组a和b都是int型,每个数组元素占4B,因此,M=5, N=7。23参考答案:执行第11行指令后,aijk的地址为a+4*(63*i+9*j+k),所以,可以推断出M=9,N=63/9=7。根据第12行指令,可知数组a的大小为4536字节,故L=4536/(4*L*M)=18。24参考答案:(1)常数M=76/4=19,存放在EDI中,变量j存放在ECX中。(2)上述优化汇编代码对应的函数trans_matrix的C代码如下:1void trans_matrix(int aMM) 2int i, j, t, *p;3int c=(M2);3for (i = 0; i M; i+) 4p=&a0i;5for (j = 0; j M; j+) 6


    注意事项

    本文(计算机系统第三章答案.doc)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开