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

上传人:Q****o 文档编号:27949833 上传时间:2022-07-26 格式:DOCX 页数:14 大小:169.82KB
返回 下载 相关 举报
2022年计算机系统第三章答案剖析.docx_第1页
第1页 / 共14页
2022年计算机系统第三章答案剖析.docx_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《2022年计算机系统第三章答案剖析.docx》由会员分享,可在线阅读,更多相关《2022年计算机系统第三章答案剖析.docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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 位,

2、而长度后缀为16 位的w(5)不能用 8 位寄存器作为目的操作数地址所在寄存器(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 movsb

3、l %al, %edx int int movl %eax, %edx 6参考答案:(1)xptr、yptr 和 zptr 对应实参所存放的储备单元地址分别为:Rebp+16 ;(2)函数 func 的 C 语言代码如下:void funcint *xptr, int *yptr, int *zptr int tempx=*xptr; int tempy=*yptr; int tempz=*zptr; *yptr=tempx; *zptr = tempy; *xptr = tempz; Rebp+8 、Rebp+12 、名师归纳总结 - - - - - - -第 1 页,共 11 页精选学习资

4、料 - - - - - - - - - 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+y 8参考答案:(1)指令功能为: Redx Redx+MReax=0x00000080+M0x8049300 ,寄存器 EDX 中内容转变;转变后的内容为以下运算的结果:00000080H+FFFFFFF0H 0000 0000 0000 0000 0000 0000 1000 0000 + 1111 1111 1111 1111 1111 1111 1111 0000 1 0000 00

5、00 0000 0000 0000 0000 0111 0000 因此,EDX 中的内容转变为0x00000070 ;依据表 3.5 可知,加法指令会影响OF、SF、ZF 和 CF 标志;OF=0,ZF=0 ,SF=0,CF=1;(2)指令功能为:Recx Recx- MReax+Rebx=0x00000010+M0x8049400,寄存器ECX 中内容转变;转变后的内容为以下运算的结果:00000010H - 80000008H 0000 0000 0000 0000 0000 0000 0001 0000 + 0111 1111 1111 1111 1111 1111 1111 1000

6、0 1000 0000 0000 0000 0000 0000 0000 1000 因此, ECX 中的内容改为 0x80000008;依据表 3.5 可知,减法指令会影响 OF、SF、ZF 和 CF 标志; OF=1,ZF=0 ,SF=1,CF=1 0=1;(3)指令功能为:Rbx Rbx or MReax+Recx*8+4,寄存器 BX 中内容转变;转变后的内容为以下运算的结果: 0x0100 or M0x8049384=0100H or FF00H 0000 0001 0000 0000 or 1111 1111 0000 0000 1111 1111 0000 0000 因此, BX

7、中的内容改为0xFF00;由 3.3.3 节可知, OR 指令执行后OF=CF=0 ;由于结果不为0,故 ZF=0 ;由于最高位为1,故 SF=1;Rdl and 0x80(4)test 指令不转变任何通用寄存器,但依据以下“ 与”操作转变标志:1000 0000 and 1000 0000 1000 0000 由 3.3.3 节可知, TEST 指令执行后 OF=CF=0;由于结果不为 0,故 ZF=0 ;由于最高位为 1,故 SF=1;(5)指令功能为:MReax+Redx MReax+Redx*32,即储备单元 0x8049380 中的内容转变为以下运算的结果: M0x8049380*3

8、2=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;第 2 页,共 11 页- - - - - - -精选学习资料 - - - - - - - - - (6)指令功能为:Rcx R cx- 1,即 CX 寄存

9、器的内容减一;0000 0000 0001 0000 + 1111 1111 1111 1111 1 0000 0000 0000 1111 因此,指令执行后 CX 中的内容从 0x0010 变为 0x000F;由表 3.5 可知, DEC 指令会影响 OF、ZF、SF,依据上述运算结果,得到 OF=0,ZF=0 ,SF=0;9参考答案:movl 12%ebp, %ecx /Recx MRebp+12 ,将 y 送 ECX sall $8, %ecx /Recx Recx=0,就转 .L1 执行7 addb %dl, %eax /MReax MReax+Rdl,即 *p+=x 8 .L1: 由

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

11、t 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 个字节;第 4 页,共 11 页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 /Rcx MRebp+16 ,将 k 送 CX 4 .L1:

12、 - - - - - - -精选学习资料 - - - - - - - - - 5 movw %si, %dx /Rdx Rsi ,将 y 送 DX 6 movw %dx, %ax /Rax Rdx ,将 y 送 AX 16 位送 DX 7 sarw $15, %dx /Rdx Rdx15 ,将 y 的符号扩展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

13、送 CX 11 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 必需

14、储存到栈中;( 3)由于执行第 8 行除法指令前必需先将被除数扩展为 32 位,而这里是带符号数除法,因此,采纳算术右移以扩展 16 位符号,放在高 16 位的 DX 中,低 16 位在 AX 中;15参考答案:1 int f1unsigned x x 中有奇数个1,就返回2 3 int y = 0 ; 4 while x.=0 5 y =x ; 6 x=1 ; 7 8 return y&0x1 ; 9 函数 f1 的功能返回: x x1 x2 . & 0x1 ,因此 f1 用于检测 x 的奇偶性,当为 1,否就返回0;16参考答案:函数 sw 只有一个入口参数x,依据汇编代码的第25 行指令

15、知,当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:.L7 x+3=7:.L6 由此可知, switch x 中省略的处理部分结构如下:case -2: case -1: / .L2 标号处指令序列对应的语句 break; case 0: 名师归纳总结 - - - - - - -第 5 页,共 11 页精选学习资料 - - - - - - - - - break; case 1: / .L3 标号处指令序列对

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

17、a, 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 ;执行第

18、 4 行指令后 Resp= Resp-40=0xbc00001c-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 入栈,

19、入栈的内容为 Rebp-4=0xbc000018 ;故 x 和 y 所在的地址分别为 0xbc000018和 0xbc000014 ;(4)执行第 10 行指令后, funct 栈帧的地址范畴及其内容如下:0xbc00001c0xbc000030 EBP 栈帧底部0xbc000018x=150xbc000014y=20 0xbc0000100xbc00000c0xbc0000080xbc0000040xbc0000000xbbfffffc0xbc000014 ESP 0xbbfffff80xbc000018 0xbbfffff40x804c000 从 scanf返回的地址0xbbfffff01

20、9参考答案:第 1 行汇编指令说明参数 x 存放在 EBX 中,依据第 4 行判定 x=0 就转 .L2,否就连续执行第 510 行指令;依据第 5、6、7 行指令可知,入栈参数 nx 的运算公式为 x1;依据第 9、10、11 行指令可知,返回值为 x&1+ rv ;由此名师归纳总结 第 6 页,共 11 页- - - - - - -精选学习资料 - - - - - - - - - 推断出 C 缺失部分如下:1 int refuncunsigned x 2 if x=0 3 return 0 ; 4 unsigned nx = x1 ; 5 int rv = refuncnx ; 6 ret

21、urn x & 0x1 + 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+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

22、40 &F0 &F0+4 i21参考答案:表达式类型值汇编代码S short * ASleal %edx, %eax S+i short * AS+2* ileal %edx, %ecx, 2, %eax Si short M AS+2* i movw %edx, %ecx, 2, %ax &S10 short * AS+20 leal 20%edx, %eax &Si+2 short * AS+2* i+4 leal 4%edx, %ecx, 2, %eax &Si-S int AS+2* i-As/2=imovl %ecx, %eax S4*i+4 short M AS+2*4* i +4

23、 movw 8%edx, %ecx, 8, %ax *S+i-2 short M AS+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参

24、考答案:(1)常数 M=76/4=19 ,存放在 EDI 中,变量 j 存放在 ECX 中;(2)上述优化汇编代码对应的函数trans_matrix 的 C 代码如下:名师归纳总结 1 void trans_matrixint aMM 第 7 页,共 11 页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 类型汇编指令序列uptr-s1.x int movl

25、 %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 movl 4%eax, %ecx short movl %eax, %ecx, 2, %eax *uptr-s2.p movl %eax, %edx movl 8%eax, %eax char movb %eax, %al movb %al

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

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

28、; char *p; long l; void *v ;short s; char c; test ;v g i p 0 8 16 20 24 28 32 34 29参考答案:(1)执行第 7 行和第 10 行指令后栈中的信息存放情形如下图所示;其中 gets 函数的入口参数为 buf 数组首地址,应等于 getline 函数的栈帧底部指针 EBP 的内容减 0x14,而 getline 函数的栈帧底部指针 EBP 的内 容 应 等 于 执 行 完 getline 中 第 2 行 指 令 ( push %ebp ) 后 ESP 的 内 容 , 此 时 , Resp= =0xbffc07f0 -

29、 4=0xbffc07ec ,故 buf 数组首地址为Rebp- 0x14= Resp- 0x14=0xbffc07ec - 0x14=0xbffc07d8 ;08 04 85 c8 返回 P 的地址 08 41 39 38 返回 P 的地址EBP bf fc 08 00 EBP 在 P 中旧值 EBP 37 36 35 34 EBP 在 P中旧值00 00 00 08 被 调 用 者 保 33 32 31 30 被 调 用 者 保00 00 00 10 存 寄 存 器 在 46 45 44 43 存 寄 存 器 在00 00 00 05 P 中的旧值 42 41 39 38 P 中的旧值bu

30、f7 buf4 37 36 35 34 buf7 buf4buf3 buf0 33 32 31 30 buf3 buf0ESP ESP bf fc 07 d8 gets 入口参数a 执行第 7 行后的栈 b 执行第 10 行后的栈(2)当执行到 getline 的 ret 指令时,假如程序不发生段错误,就正确的返回地址应当是 0x80485c8,发生段错误是由于执行 getline 的 ret 指令时得到的返回地址为 0x8413938,这个地址所在储备段可能是不行执行的数据段,因而发生了段错误(segmentation fault );(3)执行完第 10 行汇编指令后,被调用者储存寄存器

31、EBX 、ESI 和 EDI 在 P 中的内容已被破坏,同时仍破坏了 EBP 在 P 中的内容;(4)getline 的 C 代码中 malloc 函数的参数应当为strlenbuf+1 ,此外,应当检查malloc 函数的返回值是否为 NULL ;30参考答案:x86-64 过程调用时参数传递是通过通用寄存器进行的,前三个参数所用寄存器次序为 RDI 、RSI、RDX ;abc 的 4 种合理的函数原型为: viod abcint c, long *a, int *b; viod abcunsigned c, long *a, int *b; 名师归纳总结 - - - - - - -第 9

32、页,共 11 页精选学习资料 - - - - - - - - - viod abclong c, long *a, int *b; viod abcunsigned long c, long *a, int *b; 依据第 3、4 行指令可知,参数 b 确定指向一个 32 位带符号整数类型;依据第 5 行指令可知,参数 a 指向64 位带符号整数类型;而参数 c 可以是 32 位,也可以是 64 位,由于 *b 为 32 位,所以取 RDI 中的低 32位 Redi(截断为 32 位),再和 *b 相加; 同时, 参数 c 可以是带符号整数类型,也可以是无符号整数类型,由于第 2 行加法指令 addl 的执行结果对于带符号整数和无符号整数都一样;31参考答案:(1)汇编指令

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁