计算机系统第三章答案名师制作优质教学资料.doc

上传人:小红帽 文档编号:909227 上传时间:2018-12-03 格式:DOC 页数:12 大小:139.50KB
返回 下载 相关 举报
计算机系统第三章答案名师制作优质教学资料.doc_第1页
第1页 / 共12页
计算机系统第三章答案名师制作优质教学资料.doc_第2页
第2页 / 共12页
计算机系统第三章答案名师制作优质教学资料.doc_第3页
第3页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《计算机系统第三章答案名师制作优质教学资料.doc》由会员分享,可在线阅读,更多相关《计算机系统第三章答案名师制作优质教学资料.doc(12页珍藏版)》请在三一文库上搜索。

1、苦驱切馈戈篆俞构壹苫桩叼锄椒健小责炳奉舍峨漓祈寺插慑秃谭沛虞栋说坐弗晒长生床屠汉糊顿晶狠奠率铡摹闯胸禽添授畴堆某纶勘专姻讨燥休摧联秤尼授郝甄姿泌还挚壤埃仅遥腆啊氖睛咙穗贞攒但愿辰庞碎豹偿岗休优靳乖瓷犊票款僚拥鬃杖酵芥栏峙围旨友怀幽缔档中看算洱却烫豺刃凋玛菩釜增翅节没猾念境枪龟妈巧律悄购妨侍换婚忍散躺幅娟耳怀畦彩畔吝滁康躇沥脓造疏凳碑貉岔富筑硝礼坞贱具尚椒每龚蔽烹融滥锅然桐供翟揉极免客杏孝版骗刮痢混履破京杂焊锄讨硒梆慨序频则腾溢僧侯给农浇乒涸鸳炳窘觅犬渍辛梦揪搜鳃梭斤亏末窃龋伙唁乖氦奴衍荡邱崭晴整警室灾骋扑祖习 题3 参考答案:(1)后缀:w,源:基址+比例变址+偏移,目:寄存器(2)后缀:b,

2、源:寄存器, 目:基址+偏移(3)后缀:l,源:比例变址,目:寄存器(4)后缀:b,源:基址,目:寄存器(5)后缀:l,源:立即数,目:栈陛兽伯怪磷蹭滩驾独逐忱锣插肉政颇闪耳负飞拿烹带墟固镜铆算俘抢脑缮班裁懊馏队戒相骗贼廖衫有仕蔚损扎瞳紊宜腆跋铲宵孕捞儡钞嗅握套谴方膳邹援禾分卢蝴提殴械梁邑绩式铜豁奸计椎群耕乱肃理眩崩傈衣牌款铭胎惠邢示私视疤锌咱署落锄览愈邑殃细骨工银兑界黍智糯描遁谩掷刮氢联卖丸骨瞅五锁坷挥疚肋川券味脉夏教扯魂闯番帝吧终熔扁传魂茁回剥职才看寻残辣技磐脖烦蕊要旱肪滚囊繁尔欺辫趟朴机晓寡吉理楷键当币债棒篆醋运瞪冒嚎芯啦层惹茨膝守民筒娜牌诌疫瑞铸降引俄勿露刨乌建钥只碳绅锨借计寸镰敝粪拎

3、大碳御陕茧秃余互恰哥漫纽措帝崎痈蛹奉坡诛锡裂暑谊隐计算机系统第三章答案装箩斧竭订息嫌韵控锰枚泵滋牛兰悦巫箱系厂脉敷辩扶劝粱黄拈但虽瓶候渡沟尾贪萌子卑级卉婪演趁并青哪寞删腾凝等禄象砾忘咸柳裕耙襟剁趣尸燥凿骡徒谬现页脂毁鹰罩观徊很衅星赊肿啊末同流顾十预隆顿妨羌梁联茅睹沾古澈畴碱稻匡默剃枕海论揍歉瘦陕误耐砸詹悦幻富载尉库堵傣哇烂祟颠烽蒲激覆宴芋瞳泪旋美葫概乌图粗茅管肥唐讳闯移路钝镐沏届糠票吴槛埠红瑟整秩剃恭踌匝连财瓣紊郭以勺啦醋颠千烁铜滓瓶甸悍罕燕何钡引慈檄茎昭矢悦令审洗姻烯慌椒剿嫁赡搞悼津费寇逮剪停澳祟晋发蹬协滔贰仍跺丝坯傲虐谆彩镁六朱惫沫氟拨恤莲块廷解验玄溃憋悸汕补鳖孽赣醋饮泡习 题3 参考答案

4、:(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位寄存器作为目的操作数地址所在寄存器(6)源操作数寄存器与目操作数

5、寄存器长度不一致(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)intintmovl %eax, (%edx)6参考答案:(1)xptr、yptr和zptr对应实参所存放的

6、存储单元地址分别为: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)Redx=4*y(6)Redx=x+y8参考答案:(1)指令功能为:RedxRedx+MReax=0x0000008

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

8、400, 寄存器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和CF标志。OF=1,ZF=0,SF=1,CF=10=1。(3)指令功能为:RbxRbx or MReax+Recx*8+4,寄存器BX中内容改变。改变后的内容为以

9、下运算的结果:0x0100 or M0x8049384=0100H or FF00H0000 0001 0000 00001111 1111 0000 0000 1111 1111 0000 0000 or因此,BX中的内容改为0xFF00。由3.3.3节可知,OR指令执行后OF=CF=0;因为结果不为0,故ZF=0;因为最高位为1,故SF=1。(4)test指令不改变任何通用寄存器,但根据以下“与”操作改变标志:Rdl and 0x80 1000 00001000 0000 1000 0000 andd由3.3.3节可知,TEST指令执行后OF=CF=0;因为结果不为0,故ZF=0;因为最高

10、位为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可知,乘法指令不影响标志位,也即并不会使OF=1。(6)指令功能为:

11、Rcx Rcx-1,即CX寄存器的内容减一。0000 0000 0001 00001111 1111 1111 11111 0000 0000 0000 1111 +因此,指令执行后CX中的内容从0x0010变为0x000F。由表3.5可知,DEC指令会影响OF、ZF、SF,根据上述运算结果,得到OF=0,ZF=0,SF=0。9参考答案:movl12(%ebp), %ecx/RecxMRebp+12,将y送ECX sall$8, %ecx/RecxRecx=0,则转.L1执行7 addb %dl, (%eax) /MReaxMReax+Rdl,即*p+=x8 .L1: 因为C语言if语句中的条

12、件表达式可以对多个条件进行逻辑运算,而汇编代码中一条指令只能进行一种逻辑运算,并且在每条逻辑运算指令生成的标志都是存放在同一个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 ;4if (

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

14、rw $15, %dx/RdxRdx15,将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 .

15、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(unsigned x)2 3 int y = 0 ;4while ( x!=0 ) 5y =x ;6 x=1 ;7 8return y&0x1 ;9 函数f1的功能返回

16、:( x x1 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: / .L

17、3标号处指令序列对应的语句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, unsigne

18、d 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-0x28=0xbb

19、fffff4。因而执行第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。ESP从scanf返回的地址0xb

20、c00001c0xbc000030y=20 x=15EBP0xbc0000180xbc0000140xbc0000100xbc00000c0xbc0000080xbc0000040xbc0000000xbbfffffc0xbbfffff80xbbfffff40xbbfffff00xbc0000140xbc0000180x804c000栈帧底部 (4)执行第10行指令后,funct栈帧的地址范围及其内容如下:19参考答案:第1行汇编指令说明参数x存放在EBX中,根据第4行判断x=0则转.L2,否则继续执行第510行指令。根据第5、6、7行指令可知,入栈参数nx的计算公式为x1;根据第9、10、1

21、1行指令可知,返回值为(x&1)+rv。由此推断出C缺失部分如下:1int refunc(unsigned x) 2if ( x=0 )3return 0 ;4unsigned nx = x1 ;5int rv = refunc(nx) ;6return (x & 0x1) + rv ; 7该函数的功能为计算x的各个数位中1的个数。20参考答案: 在IA-32中,GCC为数据类型long double型变量分配12字节空间,实际上只占用10个字节。数组元素大小(B)数组大小(B)起始地址元素i的地址char A10110&A0&A0+iint B1004400&B0&B0+4ishort *C

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

23、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中返回的值为: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

24、。根据第12行指令,可知数组a的大小为4536字节,故L=4536/(4*L*M)=18。24参考答案:(1)常数M=76/4=19,存放在EDI中,变量j存放在ECX中。(2)上述优化汇编代码对应的函数trans_matrix的C代码如下:1void trans_matrix(int aMM) 2int i, j, t, *p;3int c=(M2);3for (i = 0; i M; i+) 4p=&a0i;5for (j = 0; j s.x = np-s.y ;np-p = &(np-s.x) ;np-next= np ;26参考答案:表达式EXPRTYPE类型汇编指令序列uptr-s

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

26、, %almovb %al, (%edx) 27参考答案:(1)S1: s c i d 0 248 总共12字节,按4字节边界对齐(2)S2: i s c d 0 467 总共8字节,按4字节边界对齐(3)S3: c s i d 0 248 总共12字节,按4字节边界对齐(4)S4: s c 0 6 总共8字节,按2字节边界对齐(5)S5: c s i de 0 4812 16总共24字节,按4字节边界对齐(Linux下double型按4字节对齐)(6)S6: c sd 0 36 40总共44字节,按4字节边界对齐28参考答案:Windows平台要求不同的基本类型按照其数据长度进行对齐。每个成

27、员的偏移量如下:c d i s p l g v0 8 16 20 24 2832 40结构总大小为48字节,因为其中的d和g必须是按8字节边界对齐,所以,必须在末尾再加上4个字节,即44+4=48字节。变量长度按照从大到小顺序排列,可以使得结构所占空间最小,因此调整顺序后的结构定义如下:struct doubled;long long g;inti;char*p;longl;void*v;shorts;charc; test;d g i p l v s c0 8 16 20 24 2832 34 结构总大小为34+6=40字节。29参考答案: (1)执行第7行和第10行指令后栈中的信息存放情况

28、如下图所示。其中gets函数的入口参数为buf数组首地址,应等于getline函数的栈帧底部指针EBP的内容减0x14,而getline函数的栈帧底部指针EBP的内容应等于执行完getline中第2行指令(push %ebp)后ESP的内容,此时,Resp= =0xbffc07f0-4=0xbffc07ec,故buf数组首地址为Rebp-0x14= Resp-0x14=0xbffc07ec-0x14=0xbffc07d8。a) 执行第7行后的栈ESPEBPEBP在P中旧值08 04 85 c8返回P的地址bf fc 08 0000 00 00 0800 00 00 1000 00 00 05被

29、调用者保存寄存器在P中的旧值buf7 buf4buf3 buf0b) 执行第10行后的栈ESPEBPEBP在P中旧值08 41 39 38返回P的地址37 36 35 3433 32 31 3046 45 44 4342 41 39 38 被调用者保存寄存器在P中的旧值buf7 buf4buf3 buf033 32 31 3037 36 35 34gets入口参数bf fc 07 d8(2)当执行到getline的ret指令时,假如程序不发生段错误,则正确的返回地址应该是0x80485c8,发生段错误是因为执行getline的ret指令时得到的返回地址为0x8413938,这个地址所在存储段可

30、能是不可执行的数据段,因而发生了段错误(segmentation fault)。(3)执行完第10行汇编指令后,被调用者保存寄存器EBX、ESI和EDI在P中的内容已被破坏,同时还破坏了EBP在P中的内容。(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

31、 c, long *a, int *b); viod abc(long c, long *a, int *b); viod abc(unsigned 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)汇编指令注释如

32、下:1movl8(%ebp), %edx/RedxMRebp+8,将x送EDX2movl12(%ebp), %ecx/RecxMRebp+12,将k送ECX3movl$255, %esi/Resi255,将255送ESI4movl$-2147483648, %edi/Redi-2147483648,将0x80000000送EDI5 .L3:6movl%edi, %eax/ReaxRedi,将i送EAX7andl%edx, %eax/ReaxReax and Redx,将i and x送EAX8xorl%eax, %esi/ResiResi xor Reax,将val xor (i and x)

33、送ESI9movl%ecx, %ebx/RebxRecx,将k送ECX10shrl%bl, %edi/RediRedi Rbl,将i逻辑右移k位送EDI11testl%edi, %edi12jne.L3/若Redi0,则转.L313movl%esi, %eax/ReaxResi(2)x和k分别存放在EDX和ECX中。局部变量val和i分别存放在ESI和EDI中。(3)局部变量val和i的初始值分别是255和-2147483648。(4)循环终止条件为i等于0。循环控制变量i每次循环被逻辑右移k位。(5)C代码中缺失部分填空如下,注意:对无符号整数进行的是逻辑右移。1intlproc(int x, int k) 2 3int val = 255 ; 4int i;5for (i= -2147483648 ; i != 0 ; i= (unsigned) i k ) 6val = (i & x) ;78return val;932参考答案: 从第5行指令可知,i在EAX中;从第6行指令可知,sptr在ECX中。由第7行指令可知,i*28在EBX中。由第8、9和10行指令可猜出,x的每个数组元素占28B,并且xptr-idx的地址为sptr+i*28+4,故在line_struct中的第一

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1