计算机系统第三章答案_第1页
计算机系统第三章答案_第2页
计算机系统第三章答案_第3页
计算机系统第三章答案_第4页
计算机系统第三章答案_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、在ESX寄存器(8)源操作数地址中缺少变址寄存器.参考答案:表题5用表src_typedst_type机器级表示charintmovsbl%al,(%edx)intcharmovb%al,(%edx)intunsignedmovl%eax,(%edx)shortintmovswl%ax,(%edx)unsignedcharunsignedmovzbl%al,(%edx)charunsignedmovsbl%al,(%edx)intintmovl%eax,(%edx).参考答案:xptr、yptr和zptr对应实参所存放的存储单元地址分别为:Rebp+8、Rebp+12、Rebp+16。(2)函

3、数func的C语言代码如下:voidfunc(int*xptr,int*yptr,int*zptr)inttempx=*xptr;inttempy=*yptr;inttempz=*zptr;*yptr=tempx;*zptr=tempy;*xptr=tempz;.参考答案:Redx=xRedx=x+y+4Redx=x+8*yRedx=y+2*x+12Redx=4*yRedx=x+y.参考答案:(1)指令功能为:RedxRedx+MReax=0 x00000080+M0 x8049300,寄存器EDX中内容改变。改变后的内容为以下运算的结果:00000080H+FFFFFFF0H00000000

4、000000000000000010000000+11111111111111111111111111110000100000000000000000000000001110000因此,EDX中的内容改变为0 x00000070。根据表可知,加法指令会影响ORSF、ZF和CF标志。OF=QZF=0,SF=0,CF=1。(2)指令功能为:RecxRecx-MReax+Rebx=0 x00000010+M0 x8049400,寄存器ECX中内容改变。改变后的内容为以下运算的结果:00000010H-H00000000000000000000000000010000+0111111111111111

5、1111111111111000010000000000000000000000000001000因此,ECX中的内容改为0 x。根据表可知,减法指令会影响OF、SF、ZF和CF标志。OF=1,ZF=0,SF=1,CF=1?0=1。(3)指令功能为:Rbx-RbxorMReax+Recx*8+4,寄存器BX中内容改变。改变后的内容为以下运算的结果:0 x0100orM0 x8049384=0100HorFF00H0000000100000000o11111111000000001111111100000000因此,BX中的内容改为0 xFF00。由节可知,OR指令执行后OF=CF=0因为结果不

6、为0,故ZF=0;因为最高位为1,故SF=1otest指令不改变任何通用寄存器,但根据以下“与操作改变标志:Rdland0 x8010000000and1000000010000000由节可知,TEST指令执行后OF=CF=0因为结果不为0,故ZF=0;因为最高位为1,故SF=1。(5)指令功能为:MReax+Redx-MReax+Redx*32,即存储单元0 x8049380中的内容改变为以下运算的结果:M0 x8049380*32=0 x908f12a8*32,也即只要将0 x908f12a8左移5位即可得到结果。100100001000111100010010101010005=0001

7、0001111000100101010100000000因此,指令执行后,单元0 x8049380中的内容改变为0 x11e25500。显然,这个结果是溢出的。但是,根据表可知,乘法指令不影响标志位,也即并不会使OF=1o(6)指令功能为:Rcx-Rcx-1,即CX寄存器的内容减一。0000000000010000+111111111111111110000000000001111因此,指令执行后CX中的内容从0 x0010变为0 x000F。由表可知,DEC指令会影响ORZF、SF,根据上述运算结果,得到OF=QZF=0,SF=0o.参考答案:movl12(%ebp),%ecx11执行5te

8、stb$0 x80,%dl11执行7addb%dl,(%eax)1:因为C语言if语句中的条件表达式可以对多个条件进行逻辑运算,而汇编代码中一条指令只能进行一种逻辑运算,并且在每条逻辑运算指令生成的标志都是存放在同一个EFLAGSW存器中,所以,最好在一条逻辑指令后跟一条条件车t移指令,把EFLAG计标志用完,然后再执行另一次逻辑判断并根据条件进行转移的操作。(2)按照书中图给出的“if()goto”语句形式写出汇编代码对应的C语言代码如下:voidcomp(charx,int*p)if(p!=0)if(x0)*p+=x;.参考答案:intfunc(intx,inty)intz=x*y; TO

9、C o 1-5 h z if(xx)z=x+y;elsez=x-y;elseif(x=16)z=x&y;returnz;.参考答案:(1)每个入口参数都要按4字节边界对齐,因此,参数x、y和k入栈时都占4个字节。1 movw 8(%ebp), %bx5 movw %si, %dx13 cmpw %cx, %si15 .L2:16 movswl %bx, %eax返回0。16.参考答案:1:2211& 0 x1 ,因此 f1用于检测x的奇偶性,当x中有奇数个1,则返回为1,否则函数sw只有一个入口参数x,根据汇编代码的第25行指令知,当x+37时转标号.L7处执行,否则,按照跳转表中的地址转移执

10、行,x 与跳转目标处标号的关系如下:x+3=0:x+3=1:x+3=2:x+3=3:x+3=4:x+3=5:x+3=6:x+3=7:由此可知,.L7.L2.L2.L3.L4.L5.L7.L6switch (x)中省略的处理部分结构如下:case -2:case -1:2 标号处指令序列对应的语句break;case 0:3标号处指令序列对应的语句break;.4标号处指令序列对应的语句break;5标号处指令序列对应的语句break;case4:6标号处指令序列对应的语句break;default:7标号处指令序列对应的语句参考答案:根据第2、3行指令可知,参数a是char型,参数p是指向sh

11、ort型变量的指针;根据第4、5行指令可知,参数b和c都是unsignedshort型,根据第6行指令可知,test的返回参数类型为unsignedint。因此,test的原型为:unsignedinttest(chara,unsignedshortb,unsignedshortc,short*p);参考答案:每次执行pushl指令后,Resp=Resp-4,因此,第2行指令执行后Resp=0 xbc00001c。(1)执行第3行指令后,Rebp=Resp=0 xbc00001c。到第12条指令执行结束都没有改变EBP的内容,因而执行第10行指令后,EBP的内容还是为0 xbc00001c。执

12、行第13行指令后,EBP的内容恢复为进入函数funct时的值0 xbc000030。(2)执行第3行指令后,Resp=0 xbc00001c。执行第4行指令后Resp=Resp-40=0 xbc00001c-0 x28=0 xbbfffff4。因而执行第10行指令后,未跳转到scanf函数执行时,ESP中的内容为0 xbbfffff4-4=0 xbbfffff0;在从scanf函数返回后ESP中的内容为0 xbbfffff4。执行第13行指令后,ESP的内容恢复为进入函数funct时的旧值,即Resp=0 xbc000020。(3)第5、6两行指令将scanf的第三个参数&y入栈,入栈的内容为

13、Rebp-8=0 xbc000014;第7、8两行指令将scanf的第二个参数&x入栈,入栈的内容为Rebp-4=0 xbc000018。故x和y所在的地址分别为0 xbc000018和0 xbc000014。(4)执行第10行指令后,funct栈帧的地址范围及其内容如下:0 xbc00001c0 xbc0000300 xbc000018x=150 xbc000014y=200 xbc0000100 xbc00000c0 xbc0000080 xbc0000040 xbc0000000 xbbfffff0 xbc0000140 xbbfffff0 xbc0000180 xbbfffff0 x8

14、04c0000 xbbfffff从scanf返回的地EBpEBP栈帧底部ESP.参考答案:第1行汇编指令说明参数x存放在EBX中,根据第4行判断x=0则转.L2,否则继续执行第510行指令。根据第5、6、7行指令可知,入栈参数nx的计算公式为x1;根据第9、10、11行指令可知,返回值为(x&1)+rv。由此推断出C缺失部分如下:intrefunc(unsignedx)if(x=0) TOC o 1-5 h z return0;unsignednx=x1;intrv=refunc(nx);return(x&0 x1)+rv;7该函数的功能为计算x的各个数位中1的个数。.参考答案:在IA-32中

15、,GCa数据类型longdouble型变量分配12字节空间,实际上只占用10个字节。数组元素大小(B)数组大小(B)起始地址元素i的地址charA10110&A0&A0+iintB1004400&B0&B0+4ishort*C5420&C0&C0+4ishort*D6424&D0&D0+4ilongdoubleE1012120&E0&E0+12ilongdouble*F10440&F0&F0+4i.参考答案:表达式类型值汇编代码Sshort*Aleal(%edx),%eaxS+ishort*A+2*ileal(%edx,%ecx,2),%eaxSishortMAS+2*imovw(%edx,%

16、ecx,2),%ax&S10short*AS+20leal20(%edx),%eax&Si+2short*A+2*i+4leal4(%edx,%ecx,2),%eax&Si-Sint(As+2*i-As)/2=imovl%ecx,%eaxS4*i+4shortMAs+2*(4*i+4)movw8(%edx,%ecx,8),%ax*(S+i-2)shortMA+2*(i-2)movw-4(%edx,%ecx,2),%ax.参考答案:根据汇编指令功能可以推断最终在EAX中返回的值为:Ma+28*i+4*j+Mb+20*j+4*i,因为数组a和b都是int型,每个数组元素占4B,因此,M=5,N=7

17、。.参考答案:执行第11行指令后,ai皿k的地址为a+4*(63*i+9*j+k),所以,可以推断出M=9N=63/9=7。根据第12行指令,可知数组a的大小为4536字节,故L=4536/(4*L*M)=18。.参考答案:(1)常数M=76/4=19,存放在EDI中,变量j存放在ECX中。(2)上述优化汇编代码对应的函数trans_matrix的C代码如下:voidtrans_matrix(intaMM)inti,j,t,*p;intc=(M2);for(i=0;iM;i+)p=&a0i;for(j=0;j=np-;np-p=&(np-;np-next=np;.参考答案:表达式EXPRTYP

18、E类型汇编指令序列uptr-intmovl(%eax),%eaxmovl%eax,(%edx)uptr-shortmovw4(%eax),%axmovw%ax,(%edx)&uptr-short*leal6(%eax),%eaxmovw%eax,(%edx)uptr-short*movl%eax,(%edx)uptr-uptr-shortmovl4(%eax),%ecxmovl(%eax,%ecx,2),%eaxmovl%eax,(%edx)*uptr-charmovl8(%eax),%eaxmovb(%eax),%almovb%al,(%edx).参考答案:S1: s c 0S2: i s

19、0S3: c s 0S4: s c 0S5: c s 0S6: c s 0.参考答案:id248总共12字节,按4字节边界对齐cd467总共8字节,按4字节边界对齐id248总共12字节,按4字节边界对齐6总共8字节,按2字节边界对齐ide481216总共24字节,按4字节边界对齐(Linux下double型按4字节对齐)d3640总共44字节,按4字节边界对齐Windows平台要求不同的基本类型按照其数据长度进行对齐。每个成员的偏移量如下:cdisplgv08162024283240结构总大小为48字节,因为其中的d和g必须是按8字节边界对齐,所以,必须在末尾再加上4个字节,即44+4=48

20、字节。变量长度按照从大到小顺序排列,可以使得结构所占空间最小,因此调整顺序后的结构定义如下:structdoubled;longlongg;inti;char*p;longl;void*v;shorts;charc;test;dgiplvsc08162024283234结构总大小为34+6=40字节。.参考答案:(1)执行第7行和第10行指令后栈中的信息存放情况如下图所示。其中gets函数的入口参数为buf数组首地址,应等于getline函数的栈帧底部指针EBP的内容减0 x14,而getline函数的栈帧底部指针EBP的内容应等于执行完getline中第2行指令(push%ebp)后ESP的

21、内容,此时,Resp=0 xbffc07f0-4=0 xbffc07ec,故buf数组首地址为Rebp-0 x14=Resp-0 x14=0 xbffc07ec-0 x14=0 xbffc07d8。08413938EBPf飞736353433323130464544434241393813736353433323130ESP bf fc 07 d8b)执行第10行后的栈返回P的地址EBP在P中旧值被调用者保卜存寄存器在J P中的旧值buf7 bu肥 buf0gets入口参数(2)当执行到getline的ret指令时,假如程序不发生段错误,则正确的返回地址应该是0 x80485c8,发生段错误是因为执行getline的ret指令时得到的返回地址为0 x8413938,这个地址所在存储段可能是不可执行的数据段,因而发生了段错误(segmentationfault)。(3)执行完第10行汇编指令后,被调用者保存寄存器EBXESI和EDI在P中的内容已被破坏,同时还破坏了EBP在P中的内容。getline的C代码中ma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论