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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

完整word版计算机系统第三章答案word文档良心出品.docx

1、完整word版计算机系统第三章答案word文档良心出品习 题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_typedst_type机器级表示charintmovsbl %al, (%edx) intcharmovb %al, (%edx)intunsignedmovl %eax, (%edx)shortintmovswl %ax, (%edx)unsigned charunsignedmovzbl %al, (%edx)charunsignedmovsbl %al, (%edx)int

3、intmovl %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(5)

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

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

6、后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 10005=0001 0001 1110 0010 0101 0101 0000 0000因此,指令执行后,单元0x8049380中的内容改变为0x11e25500。显然,这个结果是溢出的。但是,根据表3.5可知,乘法指令

7、不影响标志位,也即并不会使OF=1。(6)指令功能为:Rcx Rcx-1,即CX寄存器的内容减一。因此,指令执行后CX中的内容从0x0010变为0x000F。由表3.5可知,DEC指令会影响OF、ZF、SF,根据上述运算结果,得到OF=0,ZF=0,SF=0。9参考答案:movl 12(%ebp), %ecx /RecxMRebp+12,将y送ECX sall $8, %ecx /RecxRecx=0,则转.L1执行7 addb %dl, (%eax) /MReaxMReax+Rdl,即*p+=x8 .L1: 因为C语言if语句中的条件表达式可以对多个条件进行逻辑运算,而汇编代码中一条指令只能

8、进行一种逻辑运算,并且在每条逻辑运算指令生成的标志都是存放在同一个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*y ;4 if ( xx ) 6 z = x+y ;7 else 8 z =

9、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 /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 /RaxRdx,将y送AX7 sarw $15, %dx /RdxRdx

10、15,将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,则转.L115 .L2:16 movs

11、wl %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 ;4 while ( x!=0 ) 5 y =x ;6 x=1 ;7 8 return y&0x1 ;9 函数f1的功能返回:( x x

12、1 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; case 0: / .L3标

13、号处指令序列对应的语句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, u

14、nsigned 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-0x

15、28=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。 (4)执行第10行

16、指令后,funct栈帧的地址范围及其内容如下:19参考答案:第1行汇编指令说明参数x存放在EBX中,根据第4行判断x=0则转.L2,否则继续执行第510行指令。根据第5、6、7行指令可知,入栈参数nx的计算公式为x1;根据第9、10、11行指令可知,返回值为(x&1)+rv。由此推断出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 & 0x1) + rv ; 7 该函数的功能为计算x的各个数位中1的个数。20参考答

17、案: 在IA-32中,GCC为数据类型long double型变量分配12字节空间,实际上只占用10个字节。数组元素大小(B)数组大小(B)起始地址元素i的地址char A10110&A0&A0+iint B1004400&B0&B0+4ishort *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

18、), %eax SishortMAS+2*imovw (%edx, %ecx, 2), %ax &S10short *AS+20leal 20(%edx), %eax &Si+2short *AS+2*i+4leal 4(%edx, %ecx, 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中

19、返回的值为: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代码如下:1 void trans_matrix(int aMM) 2 int i, j, t, *p;3

20、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参考答案:表达式EXPRTYPE类型汇编指令序列uptr-s1.xintmovl (%eax), %eaxmovl %eax, (%edx)uptr-s1.yshortmovw 4(%eax), %axmovw %ax, (%edx)&uptr-s1.zshort *leal 6(%eax), %eaxmovw %eax, (%edx)uptr-s2.ashort *movl %eax

21、, (%edx)uptr-s2.auptr-s2.bshortmovl 4(%eax), %ecxmovl (%eax, %ecx, 2), %eaxmovl %eax, (%edx) *uptr-s2.pcharmovl 8(%eax), %eaxmovb (%eax), %almovb %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下doub

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1