ImageVerifierCode 换一换
格式:DOC , 页数:11 ,大小:176KB ,
资源ID:2323134      下载积分:15 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-2323134.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

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

计算机系统第三章答案.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

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)in

3、t int movl %eax, (%edx)6参考答案:(1)xptr、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;7参考答案:(1)Redx=x(2)Redx=x+y+4(3)Redx=x+8*y(4)Redx=y+2*x+12

4、(5)Redx=4*y(6)Redx=x+y8参考答案:(1)指令功能为:RedxRedx+MReax=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

5、 标志。OF=0,ZF=0,SF=0,CF=1 。(2)指令功能为:RecxRecx -MReax+Rebx=0x00000010+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

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

7、作改变标志:Rdl and 0x801000 00001000 00001000 0000 andd由 3.3.3 节可知,TEST 指令执行后 OF=CF=0;因为结果不为 0,故 ZF=0;因为最高位为 1,故 SF=1。(5)指令功能为:MReax+RedxMReax+Redx*32,即存储单元 0x8049380 中的内容改变为以下运算的结果:M0x8049380*32=0x908f12a8*32,也即只要将 0x908f12a8 左移 5 位即可得到结果。1001 0000 1000 1111 0001 0010 1010 1000=0,则转.L1 执行7 addb %dl, (%e

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

9、+y ;7 else 8 z = x-y ;9 else if ( x=16 )10 z = x 11 return 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 movw 16(%ebp), %cx /RcxMRebp+16,将 k 送 CX4 .L1:5 movw %si, %dx /RdxRsi,将 y 送 DX6 movw %dx, %ax /Ra

10、xRdx,将 y 送 AX7 sarw $15, %dx /RdxRdx15 ,将 y 的符号扩展 16 位送 DX8 idiv %cx /RdxRdx-axRcx的余数,将 y%k 送 DX/RaxRdx-ax Rcx的商,将 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

11、 /Rsi - Rcx,将 y 与 k 相减得到各标志14 jg .L1 /若 y 大于 k,则转.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(unsi

12、gned x)2 3 int y = 0 ;4 while ( x!=0 ) 5 y =x ;6 x=1 ;7 8 return y9 函数 f1 的功能返回:( x x1 x2 .) case 0:/ .L3 标号处指令序列对应的语句break;case 1:. / .L4 标号处指令序列对应的语句break;case 2:/ .L5 标号处指令序列对应的语句break;case 4: / .L6 标号处指令序列对应的语句break;default: / .L7 标号处指令序列对应的语句17参考答案:根据第 2、3 行指令可知,参数 a 是 char 型,参数 p 是指向 short 型变量

13、的指针;根据第 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=0xbc00001c。(1)执行第 3 行指令后,Rebp=Resp=0xbc00001c。到第 12 条指令执行结束都没有改变 EBP 的内容,因

14、而执行第 10 行指令后,EBP 的内容还是为 0xbc00001c。执行第 13 行指令后,EBP 的内容恢复为进入函数funct 时的值 0xbc000030。(2)执行第 3 行指令后,Resp=0xbc00001c。执行第 4 行指令后 Resp= Resp-40=0xbc00001c-0x28=0xbbfffff4。因而执行第 10 行指令后,未跳转到 scanf 函数执行时,ESP 中的内容为 0xbbfffff4-4=0xbbfffff0;在从 scanf 函数返回后 ESP 中的内容为 0xbbfffff4。执行第 13 行指令后,ESP 的内容恢复为进入函数 funct 时的

15、旧值,即 Resp=0xbc000020。(3)第 5、6 两行指令将 scanf 的第三个参数4 unsigned nx = x1 ;5 int rv = refunc(nx) ;6 return (x 3 int c=(Ms.x = np-s.y ;np-p = np-next= np ;26参考答案:表达式 EXPR TYPE 类型 汇编指令序列uptr-s1.x int movl (%eax), %eaxmovl %eax, (%edx)uptr-s1.y short movw 4(%eax), %axmovw %ax, (%edx)long long g;int i;char *p;

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

17、ec, 故 buf 数 组 首 地 址 为 Rebp-0x14= Resp-0x14=0xbffc07ec-0x14=0xbffc07d8。a) 执行第 7 行后的栈ESPEBP EBP 在 P 中旧值08 04 85 c8 返回 P 的地址bf fc 08 0000 00 00 0800 00 00 1000 00 00 05被调用者保存寄存器在P 中的旧值buf7 buf4buf3 buf0b) 执行第 10 行后的栈ESPEBP EBP 在 P 中旧值08 41 39 38 返回 P 的地址37 36 35 3433 32 31 3046 45 44 4342 41 39 38 被调用者

18、保存寄存器在P 中的旧值buf7 buf4buf3 buf033 32 31 3037 36 35 34gets 入口参数bf fc 07 d8(2)当执行到 getline 的 ret 指令时,假如程序不发生段错误,则正确的返回地址应该是 0x80485c8,发生段错误是因为执行 getline 的 ret 指令时得到的返回地址为 0x8413938,这个地址所在存储段可能是不可执行的数据段,因而发生了段错误(segmentation fault)。(3)执行完第 10 行汇编指令后,被调用者保存寄存器 EBX、ESI 和 EDI 在 P 中的内容已被破坏,同时还破坏了 EBP 在 P 中的

19、内容。(4)getline 的 C 代码中 malloc 函数的参数应该为 strlen(buf)+1,此外,应该检查 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); viod abc(long c, long *a, int *b); viod abc(unsigned long c, lo

20、ng *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)汇编指令注释如下:1 movl 8(%ebp), %edx /RedxMRebp+8,将 x 送 EDX2 movl 1

21、2(%ebp), %ecx /RecxMRebp+12,将 k 送 ECX3 movl $255, %esi /Resi255 ,将 255 送 ESI4 movl $-2147483648, %edi /Redi-2147483648,将 0x80000000 送 EDI5 .L3:6 movl %edi, %eax /ReaxRedi ,将 i 送 EAX7 andl %edx, %eax /ReaxReax and Redx,将 i and x 送 EAX8 xorl %eax, %esi /ResiResi xor Reax,将 val xor (i and x)送 ESI9 movl

22、 %ecx, %ebx /RebxRecx ,将 k 送 ECX10 shrl %bl, %edi /RediRedi Rbl,将 i 逻辑右移 k 位送 EDI11 testl %edi, %edi12 jne .L3 /若 Redi0,则转 .L313 movl %esi, %eax /ReaxResi(2)x 和 k 分别存放在 EDX 和 ECX 中。局部变量 val 和 i 分别存放在 ESI 和 EDI 中。(3)局部变量 val 和 i 的初始值分别是 255 和-2147483648。(4)循环终止条件为 i 等于 0。循环控制变量 i 每次循环被逻辑右移 k 位。(5)C 代

23、码中缺失部分填空如下,注意:对无符号整数进行的是逻辑右移。1 int lproc(int x, int k)2 3 int val = 255 ;4 int i;5 for (i= -2147483648 ; i != 0 ; i= (unsigned) i k ) 6 val = (i 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。

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。