计算机系统答案_第1页
计算机系统答案_第2页
计算机系统答案_第3页
计算机系统答案_第4页
计算机系统答案_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3. 参考答案:16 / 11(1)后缀:w,源基址+比例变址+偏移,目(2)后缀b,源寄存器,目(3)后缀l,源比例变址,目(4)后缀b,源基址,目(5)后缀l,源立即数,目(6)后缀l,源立即数,目(7)后缀w,源寄存器,目(8)后缀l,源基址+变址+偏移,目寄存器 基址+偏移 寄存器寄存器栈寄存器寄存器寄存器4. 参考答案:(1) 源操作数是立即数 OxFF,需在前面加 $'(2) 源操作数是16位,而长度后缀是字节 b',不一致(3 )目的操作数不能是立即数寻址(4) 操作数位数超过16位,而长度后缀为16位的w'(5) 不能用8位寄存器作为目的操作数地址所在寄

2、存器(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)intintmovl %eax, (%edx)6 参考答案:Rebp+

3、8、Rebp+12、(1) xptr、yptr和zptr对应实参所存放的存储单元地址分别为:Rebp+16。(2)函数func的C语言代码如下:void fun c(i nt *xptr, i nt *yptr, i nt *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+y&参考

4、答案:(1) 指令功能为:Redx Redx+MReax=Ox 00000080+M0x8049300,寄存器 EDX 中内容改变。改变后的内容为以下运算的结果:00000080H+FFFFFFF0H0000 0000 0000 0000 0000 0000 1000 0000+ 1111 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

5、。(2) 指令功能为:Recx Recx-MReax+Rebx=0x00000010+M0x8049400,寄存器 ECX 中内容改变。改变后的内容为以下运算的结果:00000010H - 80000008H0000 0000 0000 0000 0000 0000 0001 0000+ 0111 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

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

7、 1000 00001000 0000由3.3.3节可知,TEST指令执行后OF=CF=O;因为结果不为 0,故ZF=0 ;因为最高位为1,故SF=1。(5) 指令功能为: MReax+Redx MReax+Redx*32 ,即存储单元 0x8049380中的内容改变为以下运算 的结果:M0x8049380*32=0x908f12a8*32 ,也即只要将 0x908f12a8左移5位即可得到结果。1001 0000 1000 1111 0001 0010 1010 1000<<5=0001 0001 1110 0010 0101 0101 0000 0000因此,指令执行后,单元0

8、x8049380中的内容改变为 0x11e25500。显然,这个结果是溢出的。但是,根据表3.5可知,乘法指令不影响标志位,也即并不会使OF=1。(6)指令功能为:Rcx JRcx-1,即CX寄存器的内容减一。0000 0000 0001 0000+ 1111 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), %ecxRecx MRebp+12,将 y送 ECXsa

9、ll$8, %ecxRecx jRecx<<8,将 y*256 送 ECXmovl8(%ebp), %eaxReax MRebp+8,将 x 送 EAXmovl20(%ebp), %edxRedx JMRebp+20,将 k 送 EDXimull%edx, %eaxReax j Reax*Redx,将 x*k 送 EAXmovl16(%ebp), %edxRedx JMRebp+16,将 z 送 EDXandl$65520, %edxRedx jRedx and 65520,将 z&0xFFF0 送 EDXaddl%ecx, %edxRedx jRedx + Recx,将

10、z&0xFFF0+y*256 送EDXsubl%edx, %eaxReax jReax-Redx,将 x*k-(z&0xFFF0+y*256)送E AX根据以上分析可知,第3行缺失部分为:3 int v = x*k-(z&0xFFF0+y*256);10参考答案:从汇编代码的第2行和第4行看,y应该是占8个字节,Rebp+20开始的4个字节为高32位字节,记为yh; Rebp+16开始的4个字节为低32位字节,记为yi。根据第4行为无符号数乘法指令,得知y的数据类型num_type为 unsigned long long。movl12(%ebp), %eaxReax M

11、Rebp+12,将 x 送 EAXmovl20(%ebp), %ecxRecx MRebp+20,将 yh 送 ECXimull%eax, %ecxRecx jRecx*Reax,将 yh*x 的低 32 位送 ECXmull16(%ebp)RedxReax J MRebp+16*Reax,将 yl*x 送 EDX-EAXleal(%ecx, %edx), %edx/ Redx jRecx+Redx,将 yl*x 的高 32 位与 yh*x 的低 32 位相加后送 EDXmovl8(%ebp), %ecxRecx JMRebp+8,将 d 送 ECXmovl%eax, (%ecx)MRecx

12、jReax,将 x*y 低 32 位送 d 指向的低 32 位movl%edx, 4(%ecx)MRecx+4 jRedx,将 x*y 高 32 位送 d 指向的高 32 位11 参考答案:根据第3.3.4节得知,条件转移指令都采用相对转移方式在段内直接转移,即条件转移指令的转移目标地址为: (PC) +偏移量。(1) 因为je指令的操作码为01110100,所以机器代码 7408H中的08H是偏移量,故转移目标地址为: 0x804838c+2+0x8=0x8048396 。call指令中的转移目标地址 0x80483b仁0x804838e+5+0x1e,由此,可以看出,call指令机器代码中

13、后面的4个字节是偏移量,因IA-32采用小端方式,故偏移量为0000001EH。call指令机器代码共占5个字节,因此,下条指令的地址为当前指令地址 0x804838e加5。(2) jb指令中F6H是偏移量,故其转移目标地址为:0x8048390+2+0xf6=0x8048488。movl指令的机器代码有10个字节,前两个字节是操作码等,后面8个字节为两个立即数,因为是小端方式,所以,第一个立即数为 0804A800H,即汇编指令中的目的地址 0x804a800,最后4个字节为立即数 00000001H,即 汇编指令中的常数 0x1。(3) jle指令中的7EH为操作码,16H为偏移量,其汇编

14、形式中的0x80492e0是转移目的地址,因此,假定后 面的 mov 指令的地址为 x,则 x 满足以下公式:0x80492e0=x+0x16,故 x=0x80492e0-0x16=0x80492ca。(4) jmp指令中的E9H为操作码,后面 4个字节为偏移量,因为是小端方式,故偏移量为FFFFFFOOH,即 -100H=-256。 后面的 sub 指令的地址为 0x804829b, 故jmp 指令的转移目标地址为 0x804829b+0xffffff00=0x804829b - 0x100=0x804819b。12参考答案:(1)汇编指令的注解说明如下:1movb8(%ebp), %dlR

15、dl MRebp+8,将 x 送 DL2movl12(%ebp), %eaxReax fRebp+12,将 p 送 EAX3testl%eax, %eaxReax and Reax,判断 p 是否为 04je丄1/若p为0,则转丄1执行5testb$0x80, %dlRdl and 80H,判断x的第一位是否为 06je丄1II若x>=0,则转丄1执行7addb%dl, (%eax)MReax HMReax+Rdl,即 *p+=x8丄1:因为C语言if语句中的条件表达式可以对多个条件进行逻辑运算,而汇编代码中一条指令只能进行一种逻辑运算,并且在每条逻辑运算指令生成的标志都是存放在同一个E

16、FLAGS寄存器中,所以,最好在一条逻辑指令后跟一条条件转移指令,把EFLAGS中标志用完,然后再执行另一次逻辑判断并根据条件进行转移的操作。(2)按照书中图3.22给出的“if () goto”语句形式写出汇编代码对应的C语言代码如下:1void comp(char x, int *p)23if (p!=0)4if (x<0)5*p += x;613参考答案:1234567891011int fun c(i nt x, int y)int z = x*y ;if (x<=-100) if ( y>x)z = x+y;elsez = x-y ; else if (x>=

17、16)z = x &y ;return 乙12 14参考答案:(1)每个入口参数都要按 4字节边界对齐,因此,参数x、y和k入栈时都占4个字节。1 movw 8(%ebp), %bx2 movw 12(%ebp), %si3 movw 16(%ebp), %cxRbx fRebp+8,将 x 送 BX Rsi MRebp+12,将 y 送 SI Rcx MRebp+16,将 k 送 CX4 丄1:5movw%si, %dxRdx MRsi,将 y 送 DX6movw%dx, %axRax jRdx,将 y 送 AX7sarw$15, %dxRdx jRdx>>15,将y的符

18、号扩展16位送DX8idiv%cxRdx Rdx-ax - Rcx的余数,将 y%k 送 DX Rax Rdx-ax - Rcx的商,将 y/k 送 AX9imulw%dx, %bxRbx Rbx*Rdx,将 x*(y%k)送 BX10decw%cx/Rcx Rcx-1,将 k-1 送 CX11testw%cx, %cx/Rcx a nd Rcx,得 OF=CF=0,负数则 SF=1,零则 ZF=112jle丄2/若k小于等于0,则转丄213cmpw%cx, %siRsi - Rcx,将y与k相减得到各标志14jg丄1/若y大于k,则转丄115丄2:16movswl%bx, %eax/ Rea

19、x Rbx,将 x*(y%k)送 AX(2)被调用者保存寄存器有BX、SI,调用者保存寄存器有 AX、CX和DX。在该函数过程体前面的准备阶段,被调用者保存的寄存器EBX和ESI必须保存到栈中。(3) 因为执行第8行除法指令前必须先将被除数扩展为32位,而这里是带符号数除法,因此,采用算术右移以扩展16位符号,放在高16位的DX中,低16位在AX中。15参考答案:1int f1( un sig ned x)23int y = 0 ;4while (x!=0) 5y A=x;6x>>=1;78return y&0x1;9函数f1 的功能返回:(x A x>>1 A

20、 x>>2 A.)& 0x1,因此f1用于检测x的奇偶性,当x中有奇数个1,则返回为1,否则返回0。16参考答案:函数sw只有一个入口参数 x,根据汇编代码的第 25行指令知,当x+3>7时转标号丄7处执行,否则,按照跳 转表中的地址转移执行,x与跳转目标处标号的关系如下:x+3=0 :丄7x+3=1:丄2x+3=2: .L2x+3=3 : .L3x+3=4 :丄4x+3=5 : .L5x+3=6 : .L7x+3=7 : .L6由此可知,switch (x)中省略的处理部分结构如下:case -2:case -1:/丄2标号处指令序列对应的语句break;case

21、0:/丄3标号处指令序列对应的语句break;case 1:/丄4标号处指令序列对应的语句break;case 2:/丄5标号处指令序列对应的语句break;case 4:/丄6标号处指令序列对应的语句break;default:/丄7标号处指令序列对应的语句17参考答案:根据第2、3行指令可知,参数a是char型,参数p是指向short型变量的指针;根据第 4、5行指令可知,参数 b和c都是unsigned short型,根据第6行指令可知,test的返回参数类型为 unsigned int。因此,test的原型为: un sig ned int test(char a, un sig ne

22、d short b, un sig ned 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=0xbc0000

23、1c-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入栈,入栈的内容为 Rebp-4=0xbc000018。故x和y所在的地址分别为 0xbc00001

24、8 和 0xbc000014。(4) 执行第10行指令后,funct栈帧的地址范围及其内容如下:0xbc00001c0xbc0000180xbc0000140xbc0000100xbc00000c0xbc0000080xbc0000040xbc0000000xbbfffffc0xbbfffff80xbbfffff40xbbfffff00xbc000030x=15y=200xbc0000140xbc0000180x804c000从scanf返回的地址ESPEBP栈帧底部19参考答案:第1行汇编指令说明参数 x存放在EBX中,根据第4行判断x=0则转.L2,否则继续执行第 510行指令。根据 第5

25、、6、7行指令可知,入栈参数 nx的计算公式为x>>1 ;根据第9、10、11行指令可知,返回值为(x&1)+rv。由此推断出C缺失部分如下:1 int refunc(un sig ned x) 2 if (x=0)3 return 0;4 un sig ned nx =x>>1;5 int rv = refunc(nx);6 return (x & 0x1) + rv ;7 该函数的功能为计算x的各个数位中1的个数。20 参考答案:在IA-32中,GCC为数据类型long double型变量分配12字节空间,实际上只占用10个字节。数组元素大小(B)数

26、组大小(B)起始地址元素i的地址char A10110&A0&A0+ iint B1004400& B0&B0+4 ishort *C5420& C0&C0+4 ishort *D6424& D0&D0+4 ilong double E1012120& E0&E0+12 ilong double *F10440& F0&F0+4 i21 参考答案:表达式类型值汇编代码Sshort *Asleal (%edx), %eaxS+ishort *As+2*ileal (%edx, %ecx, 2), %e

27、axSishortMAs+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, %eaxS4*i+4shortM As+2*(4* i +4)movw 8(%edx, %ecx, 8), %ax*(S+i-2)shortMAs+2*(i-2)movw -4(%edx, %ecx, 2), %ax22. 参考答案:根据汇编指令功能可以推

28、断最终在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. 参考答案:(1) 常数 M=76/4=19,存放在 EDI中,变量j存放在ECX中。(2) 上述优化汇编代码对应的函数trans_matrix的C代码如下:1 void trans_matrix(int aMM) 2

29、int i, j, t, *p;3 in t c=(M<<2);3 for (i = 0; i < M; i+) 4 p=&a0i;5 for (j = 0; j < M; j+) 6t=*p;7*p = aij;8aij = t;9p += c ;1011 12 25 参考答案:(1) node所需存储空间需要 4+(4+4)+4=16字节。成员p、s.x、s.y和next的偏移地址分别为0、4、8和12。(2) np_init中缺失的表达式如下:void np_in instruct node *np)n p->s.x = n p->s.y ;n

30、 p->p = &(n p->s.x);np_>n ext= np ;26 参考答案:表达式EXPRTYPE类型汇编指令序列uptr->s1.xintmovl (%eax), %eax movl %eax, (%edx)uptr->s1.yshortmovw 4(%eax), %ax movw %ax, (%edx)& uptr->s1.zshort *leal 6(%eax), %eax movw %eax, (%edx)uptr->s2.ashort *movl %eax, (%edx)uptr->s2.auptr->s

31、2.bshortmovl 4(%eax), %ecxmovl (%eax, %ecx, 2), %eax movl %eax, (%edx)*uptr->s2.pcharmovl 8(%eax), %eax movb (%eax), %al movb %al, (%edx)27 参考答案:(1)S1:scid0248总共12字节,按4字节边界对齐(2)S2:iscd0467总共8字节,按4字节边界对齐(3)S3:csid0248总共12字节,按4字节边界对齐(4)S4:sc06总共8字节,按2字节边界对齐(5)S5:cside0481216 总共24字节,按4字节边界对齐(Linux下d

32、ouble型按4字节对齐)(6)S6:csd03640总共44字节,按4字节边界对齐28 参考答案:Windows平台要求不同的基本类型按照其数据长度进行对齐。每个成员的偏移量如下:cdispl gv0816 202428 3240结构总大小为48字节,因为其中的 d和g必须是按 即44+4=48字节。变量长度按照从大到小顺序排列,8字节边界对齐,所以,必须在末尾再加上 4个字节, 可以使得结构所占空间最小, 因此调整顺序后的结构定义如下:struct double long long int char long void short char test ;dgip0816 20d;g;i;*

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

34、返回P的地址EBP在P中旧值被调用者保 存寄存器在 P中的旧值buf7 buf4buf3 buf0a)执行第7行后的栈08 41 39 38EBP f37 36 35 34返回P的地址EBP在P中旧值ESP33 32 31 3046 45 44 4342 41 39 3837 36 35 34被调用者保 存寄存器在 P中的旧值33 32 31 30bf fc 07 d8buf7 buf4buf3 buf0gets入口参数b)执行第10行后的栈(2) 当执行到getline的ret指令时,假如程序不发生段错误,则正确的返回地址应该是0x80485c8,发生段错误是因为执行 getline的ret

35、指令时得到的返回地址为0x8413938 ,这个地址所在存储段可能是不可执行的数据段,因而发生了段错误(segme ntation 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(

36、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, long *a, int *b);根据第3、4行指令可知,参数b肯定指向一个32位带符号整数类型;根据第 5行指令可知,参数a指向 64位带符号整数类型;而参数 c可以是32位,也可以是64位,因为*b为32位,所以取RDI中的低32 位Redi(截断为32位),再和*b相加。同时,参数c可以是带符号整数类型,也可以是无符号整数类型,因为第2行加法

37、指令addl的执行结果对于带符号整数和无符号整数都一样。31 参考答案:(1)汇编指令注释如下:1movl8(%ebp), %edxRedx fRebp+8,将 x 送 EDX2movl12(%ebp), %ecxRecx MRebp+12,将 k 送 ECX3movl$255, %esiResi 255,将 255 送 ESI4movl$-2147483648, %ediRedi -2147483648,将 0x80000000 送 EDI5丄3:6movl%edi, %eaxReax Redi,将 i 送 EAX7andl%edx, %eaxReax Reax a nd Redx,将 i and x 送 EAX8xorl%eax

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论