2022年计算机系统第三章答案剖析

上传人:痛*** 文档编号:121076975 上传时间:2022-07-18 格式:PDF 页数:11 大小:121.21KB
收藏 版权申诉 举报 下载
2022年计算机系统第三章答案剖析_第1页
第1页 / 共11页
2022年计算机系统第三章答案剖析_第2页
第2页 / 共11页
2022年计算机系统第三章答案剖析_第3页
第3页 / 共11页
资源描述:

《2022年计算机系统第三章答案剖析》由会员分享,可在线阅读,更多相关《2022年计算机系统第三章答案剖析(11页珍藏版)》请在装配图网上搜索。

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

2、6)源操作数寄存器与目操作数寄存器长度不一致(7)不存在ESX 寄存器(8)源操作数地址中缺少变址寄存器5参考答案:表 3.12 题 5 用表src_type dst_type 机器级表示char int movsbl%al,(%edx)int char movb%al,(%edx)int unsigned movl%eax,(%edx)short int movswl%ax,(%edx)unsigned char unsigned movzbl%al,(%edx)char unsigned movsbl%al,(%edx)int int movl%eax,(%edx)6参考答案:(1)xpt

3、r、yptr 和 zptr 对应实参所存放的存储单元地址分别为: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;精选学习资料 -名师归纳总结-第 1 页,共 11 页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

4、=x+y 8参考答案:(1)指令功能为:Redx Redx+MReax=0 x00000080+M0 x8049300,寄存器 EDX 中内容改变。改变后的内容为以下运算的结果:00000080H+FFFFFFF0H 因此,EDX 中的内容改变为0 x00000070。根据表 3.5 可知,加法指令会影响OF、SF、ZF 和 CF 标志。OF=0,ZF=0,SF=0,CF=1。(2)指令功能为:Recx Recx-MReax+Rebx=0 x00000010+M0 x8049400,寄存器ECX 中内容改变。改变后的内容为以下运算的结果:00000010H-80000008H 因此,ECX 中

5、的内容改为0 x80000008。根据表 3.5 可知,减法指令会影响OF、SF、ZF 和 CF 标志。OF=1,ZF=0,SF=1,CF=10=1。(3)指令功能为:Rbx Rbx or MReax+Recx*8+4,寄存器 BX 中内容改变。改变后的内容为以下运算的结果:0 x0100 or M0 x8049384=0100Hor FF00H 因此,BX 中的内容改为0 xFF00。由 3.3.3 节可知,OR 指令执行后OF=CF=0;因为结果不为0,故 ZF=0;因为最高位为1,故 SF=1。(4)test 指令不改变任何通用寄存器,但根据以下“与”操作改变标志:Rdl and 0 x

6、80由 3.3.3 节可知,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 位即可得到结果。1001 0000 1000 1111 0001 0010 1010 10005=0001 0001 1110 0010 0101 0101 0000 0000 因此,指令执行后,单元0 x8049380 中的内容改变为0 x

7、11e25500。显然,这个结果是溢出的。但是,根据表 3.5 可知,乘法指令不影响标志位,也即并不会使OF=1。1000 0000 1000 0000 1000 0000 and0000 0001 0000 0000 1111 1111 0000 0000 1111 1111 0000 0000 or 0000 0000 0000 0000 0000 0000 0001 0000 0111 1111 1111 1111 1111 1111 1111 1000 0 1000 0000 0000 0000 0000 0000 0000 1000+0000 0000 0000 0000 0000

8、0000 1000 0000 1111 1111 1111 1111 1111 1111 1111 0000 1 0000 0000 0000 0000 0000 0000 0111 0000+精选学习资料 -名师归纳总结-第 2 页,共 11 页(6)指令功能为:Rcx R cx-1,即 CX 寄存器的内容减一。因此,指令执行后CX 中的内容从0 x0010 变为 0 x000F。由表 3.5 可知,DEC 指令会影响OF、ZF、SF,根据上述运算结果,得到OF=0,ZF=0,SF=0。9参考答案:movl 12(%ebp),%ecx/Recx MRebp+12,将 y 送 ECX sall

9、$8,%ecx /Recx Recx=0,则转.L1 执行7 addb%dl,(%eax)/MReax MReax+Rdl,即*p+=x 8.L1:因为 C 语言 if 语句中的条件表达式可以对多个条件进行逻辑运算,而汇编代码中一条指令只能进行一种逻辑运算,并且在每条逻辑运算指令生成的标志都是存放在同一个EFLAGS 寄存器中,所以,最好在一条逻辑指令后跟一条条件转移指令,把 EFLAGS 中标志用完,然后再执行另一次逻辑判断并根据条件进行转移的操作。(2)按照书中图3.22 给出的“if()goto”语句形式写出汇编代码对应的C 语言代码如下:1 void comp(char x,int*p

10、)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*y;4 if(xx)6 z=x+y;7 else 8 z=x-y;9 else if(x=16)10 z=x&y;11 return z;12 14参考答案:(1)每个入口参数都要按4 字节边界对齐,因此,参数x、y 和 k 入栈时都占4 个字节。1 movw 8(%ebp),%bx /Rbx MRebp+8,将 x 送 BX 2 movw 12(%ebp),%si/Rsi MRebp+12,将 y 送 SI 3 movw 16(%ebp),%cx/R

11、cx MRebp+16,将 k 送 CX 4.L1:精选学习资料 -名师归纳总结-第 4 页,共 11 页5 movw%si,%dx/Rdx Rsi,将 y 送 DX 6 movw%dx,%ax/Rax Rdx,将 y 送 AX 7 sarw$15,%dx/Rdx Rdx15,将 y 的符号扩展16 位送 DX 8 idiv%cx/Rdx Rdx-ax Rcx 的余数,将y%k 送 DX/Rax Rdx-ax Rcx 的商,将y/k 送 AX 9 imulw%dx,%bx/Rbx Rbx*Rdx,将 x*(y%k)送 BX 10 decw%cx/Rcx Rcx-1,将 k-1 送 CX 11

12、testw%cx,%cx/Rcx and Rcx,得 OF=CF=0,负数则SF=1,零则 ZF=1 12 jle.L2 /若 k 小于等于0,则转.L2 13 cmpw%cx,%si/Rsi-Rcx,将 y 与 k 相减得到各标志14 jg.L1 /若 y 大于 k,则转.L1 15.L2:16 movswl%bx,%eax/Reax Rbx,将 x*(y%k)送 AX(2)被调用者保存寄存器有BX、SI,调用者保存寄存器有AX、CX 和 DX。在该函数过程体前面的准备阶段,被调用者保存的寄存器EBX 和 ESI 必须保存到栈中。(3)因为执行第8 行除法指令前必须先将被除数扩展为32 位,

13、而这里是带符号数除法,因此,采用算术右移以扩展 16 位符号,放在高16 位的 DX 中,低 16 位在 AX 中。15参考答案:1 int f1(unsigned x)2 3 int y=0;4 while(x!=0)5 y=x;6 x=1;7 8 return y&0 x1;9 函数 f1 的功能返回:(x x1 x2 .)&0 x1,因此 f1 用于检测x 的奇偶性,当x 中有奇数个1,则返回为 1,否则返回0。16参考答案:函数 sw 只有一个入口参数x,根据汇编代码的第25 行指令知,当x+37 时转标号.L7 处执行,否则,按照跳转表中的地址转移执行,x 与跳转目标处标号的关系如下

14、:x+3=0:.L7 x+3=1:.L2 x+3=2:.L2x+3=3:.L3x+3=4:.L4x+3=5:.L5x+3=6:.L7 x+3=7:.L6 由此可知,switch(x)中省略的处理部分结构如下:case-2:case-1:/.L2 标号处指令序列对应的语句break;case 0:精选学习资料 -名师归纳总结-第 5 页,共 11 页/.L3 标号处指令序列对应的语句break;case 1:./.L4 标号处指令序列对应的语句break;case 2:/.L5 标号处指令序列对应的语句break;case 4:/.L6 标号处指令序列对应的语句break;default:/.L

15、7 标号处指令序列对应的语句17参考答案:根据第 2、3 行指令可知,参数a 是 char 型,参数 p 是指向 short 型变量的指针;根据第4、5 行指令可知,参数b 和 c 都是 unsigned short 型,根据第6 行指令可知,test 的返回参数类型为unsigned int。因此,test的原型为:unsigned int test(char a,unsigned short b,unsigned short c,short*p);18参考答案:每次执行pushl 指令后,Resp=Resp-4,因此,第2 行指令执行后Resp=0 xbc00001c。(1)执行第3 行指

16、令后,Rebp=Resp=0 xbc00001c。到第 12 条指令执行结束都没有改变EBP 的内容,因而执行第 10 行指令后,EBP 的内容还是为0 xbc00001c。执行第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中的

17、内容为0 xbbfffff4。执行第 13 行指令后,ESP 的内容恢复为进入函数funct 时的旧值,即 Resp=0 xbc000020。(3)第 5、6 两行指令将scanf 的第三个参数&y 入栈,入栈的内容为Rebp-8=0 xbc000014;第 7、8 两行指令将 scanf的第二个参数&x 入栈,入栈的内容为Rebp-4=0 xbc000018。故 x 和 y 所在的地址分别为0 xbc000018和 0 xbc000014。(4)执行第 10 行指令后,funct 栈帧的地址范围及其内容如下:19参考答案:第 1 行汇编指令说明参数x 存放在 EBX 中,根据第4 行判断 x

18、=0 则转.L2,否则继续执行第510 行指令。根据第 5、6、7 行指令可知,入栈参数nx 的计算公式为x1;根据第9、10、11 行指令可知,返回值为(x&1)+rv。由此ESP 从 scanf返回的地址0 xbc00001c0 xbc000030 y=20 x=15EBP 0 xbc0000180 xbc0000140 xbc0000100 xbc00000c0 xbc0000080 xbc0000040 xbc0000000 xbbfffffc0 xbbfffff80 xbbfffff40 xbbfffff00 xbc000014 0 xbc000018 0 x804c000 栈帧底部

19、精选学习资料 -名师归纳总结-第 6 页,共 11 页推断出 C 缺失部分如下:1 int refunc(unsigned x)2 if(x=0)3 return 0;4 unsigned nx=x1;5 int rv=refunc(nx);6 return(x&0 x1)+rv;7 该函数的功能为计算x 的各个数位中1 的个数。20参考答案:在 IA-32 中,GCC 为数据类型long double 型变量分配12 字节空间,实际上只占用10 个字节。数组元素大小(B)数组大小(B)起始地址元素 i 的地址char A10 1 10&A0&A0+iint B100 4 400&B0&B0+

20、4 ishort *C5 4 20&C0&C0+4 ishort *D6 4 24&D0&D0+4 ilong double E10 12 120&E0&E0+12 ilong double*F10 4 40&F0&F0+4 i21参考答案:表达式类型值汇编代码S short*ASleal(%edx),%eax S+i short*AS+2*ileal(%edx,%ecx,2),%eax Si short MAS+2*i movw(%edx,%ecx,2),%ax&S10 short*AS+20 leal 20(%edx),%eax&Si+2 short*AS+2*i+4 leal 4(%ed

21、x,%ecx,2),%eax&Si-S int(AS+2*i-As)/2=imovl%ecx,%eax S4*i+4 short M AS+2*(4*i+4)movw 8(%edx,%ecx,8),%ax*(S+i-2)short MAS+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),所以,可以推断出

22、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 代码如下:1 void trans_matrix(int aMM)2 int i,j,t,*p;3 int c=(M2);3 for(i=0;i M;i+)4 p=&a0i;5 for(j=0;j s.x=np-s.y;np-p=&(np-s.x);np-next=np;26参考答案:表达式 EXPR TYPE 类型汇编指令

23、序列uptr-s1.x int movl(%eax),%eax movl%eax,(%edx)uptr-s1.y short movw 4(%eax),%ax movw%ax,(%edx)&uptr-s1.z short*leal 6(%eax),%eax movw%eax,(%edx)uptr-s2.a short*movl%eax,(%edx)uptr-s2.auptr-s2.b short movl 4(%eax),%ecx movl(%eax,%ecx,2),%eax movl%eax,(%edx)*uptr-s2.p char movl 8(%eax),%eax movb(%eax)

24、,%al movb%al,(%edx)27参考答案:(1)S1:s c i d 0 2 4 8 总共 12 字节,按4 字节边界对齐(2)S2:i s c d 0 4 6 7 总共 8 字节,按4 字节边界对齐(3)S3:c s i d 0 2 4 8 总共 12 字节,按4 字节边界对齐(4)S4:s c 0 6 总共 8 字节,按2 字节边界对齐(5)S5:c s i d e 0 4 8 12 16 总共 24 字节,按4 字节边界对齐(Linux 下 double 型按 4 字节对齐)(6)S6:c s d 0 36 40 总共 44 字节,按4 字节边界对齐28参考答案:Windows

25、 平台要求不同的基本类型按照其数据长度进行对齐。每个成员的偏移量如下:c d i s p l g v 0 8 16 20 24 28 32 40 精选学习资料 -名师归纳总结-第 8 页,共 11 页结构总大小为48 字节,因为其中的d 和 g 必须是按8 字节边界对齐,所以,必须在末尾再加上4 个字节,即 44+4=48 字节。变量长度按照从大到小顺序排列,可以使得结构所占空间最小,因此调整顺序后的结构定义如下:struct double d;long long g;int i;char *p;long l;void *v;short s;char c;test;d g i p l v s

26、c 0 8 16 20 24 28 32 34 结构总大小为34+6=40 字节。29参考答案:(1)执行第 7 行和第 10 行指令后栈中的信息存放情况如下图所示。其中 gets函数的入口参数为buf 数组首地址,应等于getline 函数的栈帧底部指针EBP 的内容减0 x14,而 getline 函数的栈帧底部指针EBP 的内 容 应 等 于 执 行 完getline中 第2 行 指 令(push%ebp)后ESP 的 内 容,此 时,Resp=0 xbffc07f0-4=0 xbffc07ec,故 buf 数组首地址为Rebp-0 x14=Resp-0 x14=0 xbffc07ec-

27、0 x14=0 xbffc07d8。(2)当执行到getline 的 ret 指令时,假如程序不发生段错误,则正确的返回地址应该是0 x80485c8,发生段错误是因为执行getline 的 ret 指令时得到的返回地址为0 x8413938,这个地址所在存储段可能是不可执行的数据段,因而发生了段错误(segmentation fault)。(3)执行完第10 行汇编指令后,被调用者保存寄存器EBX、ESI 和 EDI 在 P 中的内容已被破坏,同时还破坏了 EBP 在 P 中的内容。(4)getline 的 C 代码中 malloc 函数的参数应该为strlen(buf)+1,此外,应该检查

28、malloc 函数的返回值是否为 NULL。30参考答案:x86-64 过程调用时参数传递是通过通用寄存器进行的,前三个参数所用寄存器顺序为RDI、RSI、RDX。abc 的 4 种合理的函数原型为:viod abc(int c,long*a,int*b);viod abc(unsigned c,long*a,int*b);a)执行第 7 行后的栈ESP EBP EBP 在 P中旧值08 04 85 c8返回 P 的地址bf fc 08 0000 00 00 0800 00 00 1000 00 00 05被 调 用 者 保存 寄 存 器 在P 中的旧值buf7 buf4buf3 buf0b)

29、执行第 10 行后的栈ESP EBP EBP在 P中旧值08 41 39 38返回 P 的地址37 36 35 34 33 32 31 3046 45 44 4342 41 39 38 被 调 用 者 保存 寄 存 器 在P 中的旧值buf7 buf4buf3 buf033 32 31 3037 36 35 34gets入口参数bf fc 07 d8 精选学习资料 -名师归纳总结-第 9 页,共 11 页 viod abc(long c,long*a,int*b);viod abc(unsigned long c,long*a,int*b);根据第 3、4 行指令可知,参数b 肯定指向一个32

30、 位带符号整数类型;根据第5 行指令可知,参数a 指向64 位带符号整数类型;而参数c 可以是 32 位,也可以是64 位,因为*b 为 32 位,所以取RDI 中的低32位 Redi(截断为32 位),再和*b 相加。同时,参数 c 可以是带符号整数类型,也可以是无符号整数类型,因为第 2 行加法指令addl 的执行结果对于带符号整数和无符号整数都一样。31参考答案:(1)汇编指令注释如下:1 movl 8(%ebp),%edx/Redx MRebp+8,将 x 送 EDX 2 movl 12(%ebp),%ecx/Recx MRebp+12,将 k 送 ECX 3 movl$255,%es

31、i/Resi 255,将 255 送 ESI 4 movl$-2147483648,%edi/Redi -2147483648,将 0 x80000000 送 EDI 5.L3:6 movl%edi,%eax/Reax Redi,将 i 送 EAX 7 andl%edx,%eax/Reax Reax and Redx,将 i and x 送 EAX 8 xorl%eax,%esi/Resi Resi xor Reax,将 val xor(i and x)送 ESI 9 movl%ecx,%ebx/Rebx Recx,将 k 送 ECX 10 shrl%bl,%edi/Redi Redi Rbl

32、,将 i 逻辑右移k 位送 EDI 11 testl%edi,%edi 12 jne.L3/若 Redi 0,则转.L3 13 movl%esi,%eax/Reax Resi(2)x 和 k 分别存放在EDX 和 ECX 中。局部变量val 和 i 分别存放在ESI 和 EDI 中。(3)局部变量val 和 i 的初始值分别是255 和-2147483648。(4)循环终止条件为i 等于 0。循环控制变量i 每次循环被逻辑右移k 位。(5)C 代码中缺失部分填空如下,注意:对无符号整数进行的是逻辑右移。1 int lproc(int x,int k)2 3 int val=255;4 int

33、i;5 for(i=-2147483648;i!=0;i=(unsigned)i k)6 val=(i&x);7 8 return val;9 32参考答案:从第 5 行指令可知,i 在 EAX 中;从第6 行指令可知,sptr 在 ECX 中。由第7 行指令可知,i*28 在 EBX中。由第8、9 和 10 行指令可猜出,x 的每个数组元素占28B,并且 xptr-idx 的地址为sptr+i*28+4,故在line_struct 中的第一个分量为idx,因而后面的24B 为 6 个数组元素a0a5,类型与 val 变量的类型相同,即 unsigned int。line_struct 结构类

34、型的定义如下:typedef struct int idx;unsigned a6;line_struct;精选学习资料 -名师归纳总结-第 10 页,共 11 页由第 11、12 行指令可知,x 数组所占空间为0 xc8-4=200-4=196B,所以 LEN=196/28=7。33参考答案:(1)n1.ptr、n1.data1、n2.data2、n2.next 的偏移量分别是0、4、0 和 4。(2)node 类型总大小占8 字节。(3)chain_proc 的 C 代码中缺失的表达式如下:uptr-n2.next-n1.data1=*(uptr-n2.next-n1.ptr)uptr-n2.data2;34参考答案:(1)函数 trace 的入口参数tptr 通过 RDI 寄存器传递。(2)函数 trace 完整的 C 语言代码如下:long trace(tree_ptr tptr)long ret_val=0;tree_ptr p=tptr;while(p!=0)ret_val=p-val;p=p-left;return ret_val;(3)函数 trace 的功能是:返回二叉树中最左边叶子节点中的值val。精选学习资料 -名师归纳总结-第 11 页,共 11 页

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!