2022年计算机系统第三章答案剖析 .pdf
《2022年计算机系统第三章答案剖析 .pdf》由会员分享,可在线阅读,更多相关《2022年计算机系统第三章答案剖析 .pdf(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
3、 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; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1
4、 页,共 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=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 Re
5、cx- MReax+Rebx=0 x00000010+M0 x8049400,寄存器ECX 中内容改变。改变后的内容为以下运算的结果:00000010H- 80000008H 因此, ECX 中的内容改为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
6、.3 节可知, OR 指令执行后OF=CF=0 ;因为结果不为0,故 ZF=0;因为最高位为1,故 SF=1。(4)test 指令不改变任何通用寄存器,但根据以下“ 与” 操作改变标志:Rdl and 0 x80由 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 00
7、00 1000 1111 0001 0010 1010 10005 =0001 0001 1110 0010 0101 0101 0000 0000 因此,指令执行后,单元0 x8049380 中的内容改变为0 x11e25500。显然,这个结果是溢出的。但是,根据表 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
8、0111 1111 1111 1111 1111 1111 1111 1000 0 1000 0000 0000 0000 0000 0000 0000 1000 + 0000 0000 0000 0000 0000 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 寄存器的内容减一。
9、因此,指令执行后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 $8, %ecx /Recx Recx=0,则转 .L1 执行7 addb %dl, (%eax) /MReax MReax+Rdl,即 *p+=x 8 .L1: 因为 C 语言 if 语句中的条件表达式可以对多个条件进行逻辑运算,而汇编代码中一条指令只能进行一种逻辑运算,并且在每条逻辑运算指令生成的标志
10、都是存放在同一个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 = x-y ; 9 else
11、 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 /Rcx MRebp+16 ,将 k 送 CX 4 .L1: 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 11 页5 movw %
12、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 testw %cx, %cx /Rcx and Rcx ,得 OF=CF=0
13、,负数则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 位,而这里是带符号数除法,
14、因此,采用算术右移以扩展 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 与跳转
15、目标处标号的关系如下: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 标
16、号处指令序列对应的语句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, unsigned short b, unsigned short c, short *p); 1
17、8参考答案:每次执行pushl 指令后, Resp=Resp-4 ,因此,第2 行指令执行后Resp=0 xbc00001c 。(1)执行第3 行指令后, 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
18、。因而执行第10 行指令后, 未跳转到scanf 函数执行时, ESP 中的内容为0 xbbfffff4-4=0 xbbfffff0;在从 scanf函数返回后ESP中的内容为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 xbc00001
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年计算机系统第三章答案剖析 2022 计算机系统 第三 答案 剖析
限制150内