版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档习题3.参考答案:(1)后缀:(2)后缀:b,源:寄存器,(3)后缀:l,源:比例变址,(4)后缀:b,源:基址,(5)后缀:l,源:立即数,(6)后缀:l,源:立即数,(7)后缀:w,源:寄存器,w,源:基址+比例变址+偏移,目:寄存器目:基址+偏移目:寄存器目:寄存器目:栈目:寄存器目:寄存器(8)后缀:l,源:基址+变址+偏移,目:寄存器4.参考答案:(1)源操作数是立即数0xFF,需在前面加‘$’(2)源操作数是16位,而长度后缀是字节‘b’,不一致(3)目(4)操作数位数超过16位,(5)不能用8位寄存器作的操作数地址所在寄存器的操作数不能是立即数寻址而长度后缀为16位的‘w’为目(6)源操作数寄存器与目操作数寄存器长度不一致(7)不存在ESX寄存器实用文档精品文档(8)源操作数地址中缺少变址寄存器5.参考答案:表3.12题5用表src_typedst_type机器级表示charintintmovsbl%al,(%edx)movb%al,(%edx)charintunsignedmovl%eax,(%edx)shortintmovswl%ax,(%edx)unsignedcharunsignedmovzbl%al,(%edx)charintunsignedmovsbl%al,(%edx)movl%eax,(%edx)int6.参考答案:(1)xptr、yptr和zptr对应实参R[ebp]+16。所存放的存储单元地址分别为:R[ebp]+8、R[ebp]+12、(2)函数func的C语言代码如下:voidfunc(int*xptr,int*yptr,int*zptr){实用文档精品文档inttempx=*xptr;inttempy=*yptr;inttempz=*zptr;*yptr=tempx;*zptr=tempy;*xptr=tempz;}实用文档精品文档7.参考答案:(1)R[edx]=x(2)R[edx]=x+y+4(3)R[edx]=x+8*y(4)R[edx]=y+2*x+12(5)R[edx]=4*y(6)R[edx]=x+y8.参考答案:(1)指令功能为:EDX中内容改变。改变后的内容为以下运算的结果:000000000000000000000000R[edx]←R[edx]+M[R[eax]]=0x00000080+M[0x8049300],寄存器00000080H+FFFFFFF0H+1000000000000000000000000因此,EDX中的内容改变为0x00000070。根据表3.5可知,加法指令会影响OF、SF、ZF和CF标志。OF=0,ZF=0,SF=0,CF=1。(2)指令功能为:R[ecx]←R[ecx]-M[R[eax]+R[ebx]]=0x00000010+M[0x8049400],寄存器ECX中内容改变。改变后的内容为以下运算的结果:00000010H-80000008H000000000000000000000000+0100000000000000000000000实用文档因此,ECX中的内容改为SF、ZF和CF标志。OF=1,ZF=0,SF=1,CF=10=1。(3)指令功能为:R[bx]←R[bx]orM[R[eax]+R[ecx]*8+4],寄存器BX中内容改改变后的内容为以下运算的结果:0x0100orM[0x8049384]=0100HorFF00H0x80000008。根据表3.5可知,减法指令会影响OF、变。0000000100000000o111111110000因此,BX中的内容改为0xFF00。由3.3.3节可知,OR指令执行后OF=CF=0;因为结果不为0,故ZF=0;因为最高位为1,故SF=1。(4)test指令不改变任何通用寄存器,但根据以下“与”操作改变标志:R[dl]and0x801000000010000000an由3.3.3节可知,TEST指令执行后OF=CF=0;因为结果不为0,故ZF=0;因为1,故SF=1。(5)指令功能为:M[R[eax]+R[edx]]←M[R[eax]+R[edx]]*32,即存储单元0x8049380以下运算的结果:M[0x8049380]*32=0x908f12a8*32,也即只要将0x908f12a8左移5位即可最高位为中的内容改变为得到结果。10010000100011110001001010101000<<5=00010001111000100101010100000000精品文档因此,指令执行后,单元0x8049380中的内容改变为0x11e25500。显然,这个结果是溢出的。但是,根据表3.5可知,乘法指令不影响标志位,也即并不会使OF=1。实用文档精品文档(6)指令功能为:R[cx]←R[cx]-1,即CX寄存器的内容减一。0000000000010000+1000000000000因此,指令执行后CX中的内容从0x0010变为0x000F。由表3.5可知,DEC指令会影响OF、ZF、SF,根据上述运算结果,得到OF=0,ZF=0,SF=0。9.参考答案:movl12(%ebp),%ecx//R[ecx]←M[R[ebp]+12],将y送ECXsall$8,%ecx//R[ecx]←R[ecx]<<8,将y*256送ECXmovl8(%ebp),%eax//R[eax]←M[R[ebp]+8],将x送EAXmovl20(%ebp),%edx//R[edx]←M[R[ebp]+20],将k送EDXimull%edx,%eax//R[eax]←R[eax]*R[edx],将x*k送EAXmovl16(%ebp),%edx//R[edx]←M[R[ebp]+16],将z送EDXandl$65520,%edx//R[edx]←R[edx]and65520,将z&0xFFF0送EDXaddl%ecx,%edxsubl%edx,%eax//R[edx]←R[edx]+R[ecx],将z&0xFFF0+y*256送EDX//R[eax]←R[eax]-R[edx],将x*k-(z&0xFFF0+y*256)送EAX根据以上分析可知,第3行缺失部分为:intv=x*k-(z&0xFFF0+y*256);10.参考答案:3实用文档精品文档从汇编代码的第2行和第4行看,y应该是占8个字节,R[ebp]+20开始的4个字节为高32位字节,记为y;R[ebp]+16开始的4个字节为低32位字节,记为y。根据第4hl行为无符号数乘法指令,得知y的数据类型num_type为unsignedlonglong。movl12(%ebp),%eax//R[eax]←M[R[ebp]+12],将x送EAX送ECXmovl20(%ebp),%ecx//R[ecx]←M[R[ebp]+20],将yhimull%eax,%ecx//R[ecx]←R[ecx]*R[eax],将y*xh的低32位送ECXmullleal16(%ebp)//R[edx]R[eax]←M[R[ebp]+16]*R[eax],将y*xl送EDX-EAX(%ecx,%edx),%edx//R[edx]←R[ecx]+R[edx],将y*xl的高32位与y*xh的低32位相加后送EDXmovl8(%ebp),%ecx//R[ecx]←M[R[ebp]+8],将d送ECXmovl%eax,(%ecx)//M[R[ecx]]←R[eax],将x*y低32位送d指向的低32位movl%edx,4(%ecx)//M[R[ecx]+4]←R[edx],将x*y高32位送d指向的高32位11.参考答案:根据第3.3.4节得知,转移目标地址为:(PC)+偏移量。(1)因为je指令的操作码为01110100,所以机器代码7408H中的08H是偏移量,故转移目标地址为:0x804838c+2+0x8=0x8048396。call指令中的转移目标地址0x80483b1=0x804838e+5+0x1e,由此,条件转移指令都采用相对转移方式在段内直接转移,即条件转移指令的可以看出,call实用文档精品文档指令机器代码中后面的4个字节是偏移量,因IA-32采用小端方式,故偏移量为0000001EH。call指令机器代码共占5个字节,因此,下条指令的地址为当前指令地址0x804838e加5。(2)jb指令中F6H是偏移量,故movl指令的机器代码有10个字节,其转移目标地址为:0x8048390+2+0xf6=0x8048488。8个字节为两个0804A800H,即汇编指令中的4个字节为立即数00000001H,即汇编指令中的常数0x1。前两个字节是操作码等,后面立即数,因为是小端方式,所以,第一个立即数为目的地址0x804a800,最后实用文档精品文档(3)jle指令中的7EH为操作码,16H为偏移量,其汇编形式中的0x80492e0是转移目的地址,因此,假定后面的mov指令的地址为x,则x满足以下公式:0x80492e0=x+0x16,故(4)jmp指令中的E9H为操作码,后面FFFFFF00H,即-100H=-256。后面的sub指令的地址为0x804829b,故jmp指0x804829b+0xffffff00=0x804829b-0x100=0x804819b。12.参考答案:(1)汇编指令的1movb8(%ebp),%dl2movl12(%ebp),%eax//R[eax]←M[R[ebp]+12],将p送EAX3testl%eax,%eax//R[eax]andR[eax],判断p是否为//若p为0,则转.L1执行//R[dl]and80H,判断x的第一位是//若x>=0,则转.L1执行//M[R[eax]]←M[R[eax]]+R[dl],即*p+=xx=0x80492e0-0x16=0x80492ca。4个字节为偏移量,因为是小端方式,故偏移量为令的转移目标地址为注解说明如下://R[dl]←M[R[ebp]+8],将x送DL0456je.L1testb$0x80,%dl否为0je.L17addb%dl,(%eax)8.L1:因为C语言if语句中的条件表达式可以对多个条件进行逻辑运算,而汇编代码中一条指令只能进行一种逻辑运算,并且在每条逻辑运算指令生成的标志都是存实用文档精品文档放在同一个EFLAGS寄存器中,所以,最好在一条逻辑指令后跟一条条件转移指令,把EFLAGS中标志用完,然后再执行另一次逻辑判断并根据条件进行转移的操作。(2)按照书中图3.22给出的“if()goto…”语句形式写出汇编代码对应的C语言代码如下:1voidcomp(charx,int*p)2{3if(p!=0)if(x<0)*p+=x;456}13.参考答案:1intfunc(intx,inty)2{34567intz=x*y;if(x<=-100if(y>x)z=x+y;else){实用文档精品文档8z=x-y;9}elseif(x>=16)10z=x&yreturnz;;1112}14.参考答案:(1)每个入口参数都要按节。1movw8(%ebp),%bx//R[bx]←M[R[ebp]+8],将x送BX2movw12(%ebp),%si//R[si]←M[R[ebp]+12],将y送SI4字节边界对齐,因此,参数x、y和k入栈时都占4个字3movw16(%ebp),%cx//R[cx]←M[R[ebp]+16],将k送CX实用文档精品文档4.L1:5movw%si,%dx//R[dx]←R[si],将//R[ax]←R[dx],将y送AXy的符号扩展16位送DX//R[dx]←R[dx-ax]÷R[cx]的余数,将y%k送DX//R[ax]←R[dx-ax]÷R[cx]的商,将y/k送AX9imulw%dx,%bx//R[bx]←R[bx]*R[dx],将x*(y%k)送BX10decw%cx//R[cx]←R[cx]-1,将k-1送CX11testw%cx,%cx//R[cx]andR[cx],得OF=CF=0,负数则SF=1,零则ZF=112jle//若k小于等于0,则转.L213cmpw%cx,%si//R[si]-R[cx],将y与k相减得到各标志//若y大于k,则转.L1y送DX6movw%dx,%ax7sarw$15,%dx//R[dx]←R[dx]>>15,将8idiv%cx.L214jg.L115.L2:16movswl%bx,%eax(2)被调用者保存寄存器有BX、SI,调用者保存寄存器有AX、CX和DX。准备阶段,被调用者保存的寄存器EBX和ESI必须保存到栈中。(3)因为执行第8行除法指令前必须先将被除数扩展为32位,算术右移以扩展16位符号,放在高16位的DX中,低16位在AX//R[eax]←R[bx],将x*(y%k)送AX在该函数过程体前面的而这里是带符号数除法,因此,采用实用文档精品文档中。15.参考答案:1intf1(unsignedx)2{3inty=0;while(x!=0){y^=x;456x>>=1;7}8returny&0x1;9}函数f1的功能返回:(x^x>>1^x>>2^….)&0x1,因此f1用于检测x的奇偶性,当x中有奇数个1,则返回为1,否则返回0。16.参考答案:函数sw只有一个入口参数x,根据汇编代码的第2~5行指令知,当x+3>7时转标号.L7处执行,否则,按照跳转表中的地址转移执行,x与跳转目标处标号的关系如下:x+3=0:.L7实用文档精品文档x+3=1:.L2x+3=2:.L2x+3=3:.L3x+3=4:.L4x+3=5:.L5x+3=6:.L7x+3=7:.L6由此可知,switch(x)中省略的处理部分结构如下:case-2:case-1:……//.L2标号处指令序列对应的语句break;实用文档精品文档case0:……//.L3标号处指令序列对应的语句break;case1:…….//.L4标号处指令序列对应的语句break;case2:……//.L5标号处指令序列对应的语句break;case4:……//.L6标号处指令序列对应的语句break;default:……//.L7标号处指令序列对应的语句17.参考答案:2、3行指令4、5行指令可知,参数b和c都是unsignedshort型,根据第根据第可知,参数a是char型,参数p是指向short型变量的指针;根据第6行指令可知,test的返回参数类型为unsignedint。因此,test的原型为:unsignedinttest(chara,unsignedshortb,unsignedshortc,short*p);18.参考答案:实用文档精品文档每次执行pushl指令后,R[esp]=R[esp]-4,因此,第2行指令执行后R[esp]=0xbc00001c。(1)执行第3行指令后,R[ebp]=R[esp]=0xbc00001c。到第12条指令执行结束都没有改变EBP的内容,因而执行第10行指令后,EBP的内容还是为0xbc00001c。执行第13行指令后,EBP的内容恢复为进入函数funct时的值0xbc000030。(2)执行第3行指令后,R[esp]=0xbc00001c。执行第4行指令后R[esp]=R[esp]-40=0xbc00001c-0x28=0xbbfffff4。因而执行第10行指令后,未跳转到scanf函数执行时,ESP中的内容为0xbbfffff4-4=0xbbfffff0;在从scanf函数返回后ESP中的内容为0xbbfffff4。执行第13行指令后,ESP的内容恢复为进入函数funct时的旧值,即R[esp]=0xbc000020。(3)第5、6两行指令将scanf的第三个参数&y入栈,入栈的内容为R[ebp]-8=0xbc000014;第7、8两行指令将scanf的第二个参数&x入栈,入栈R[ebp]-4=0xbc000018。故x和y所在的0xbc000018和0xbc000014。的内容为地址分别为实用文档精品文档0xbc00x=15y=20栈帧底0xbc000xbc000xbc000xbc000xbc000xbc000xbc000xbc000xbbff0xbbff0xbbff0xbbff从scanf返回ES(4)执行第10行指令后,funct栈帧的地址范围及其内容如下:实用文档精品文档19.参考答案:第1行汇编指令说明参数x存放在EBX中,根据第4行判断x=0则转.L2,否则继续入栈参数nx的计算公式为x>>1;根可知,返回值为(x&1)+rv。由此推断出C缺失部分如下:1intrefunc(unsignedx){执行第5~10行指令。根据第5、6、7行指令可知,据第9、10、11行指令2if(x==0)34return0;unsignednx=x>>1;intrv=refunc(nx);56return(x&0x1)+rv;7}该函数的功能为计算x的各个数20.参考答案:在IA-32中,GCC为数据类型longdouble型变量分配12字节空间,实10个字节。数组元素大数组大起始地元素i的地址位中1的个数。际上只占用小(B)小(B)址实用文档精品文档charA[10]intB[100]short1441040020&A[0]&B[0]&C[0]&A[0]+i&B[0]+4i&C[0]+4i*C[5]short41242412040&D[0]&E[0]&F[0]&D[0]+4i&E[0]+12i&F[0]+4i**D[6]longdoubleE[10]longdouble*F[10]21.参考答案:表达式类型值汇编代码Sshort*short*Aleal(%edx),%eaxSS+iA+2*ileal(%edx,%ecx,S2),%eaxS[i]shortM[A+2*i]movw(%edx,%ecx,2),%axS实用文档精品文档&S[10]short*&S[i+2]short*A+20leal20(%edx),%eaxleal4(%edx,%ecx,2),%eaxSA+2*i+4S&S[i]-Sint(A+2*i-As)/2=imovl%ecx,%eaxSS[4*i+4]shortM[A+2*(4*i+4)]movw8(%edx,%ecx,S8),%ax*(S+i-2)shortM[A+2*(i-2)]movw-4(%edx,%ecx,S2),%ax22.参考答案:根据汇编指令功能可以推断最终在EAX中返回的值为:M[a+28*i+4*j]+M[b+20*j+4*i],因为数组a和b都是int型,每个数组元素占4B,因此,M=5,N=7。23.参考答案:执行第11行指令M=9,N=63/9=7。根据第12行指令,可L=4536/(4*L*M)=18。24.参考答案:后,a[i][j][k]的地址为a+4*(63*i+9*j+k),所以,可以推断出知数组a的大小为4536字节,故(1)常数M=76/4=19,存放在EDI中,变量j存放在ECX中。实用文档精品文档(2)上述优化汇编代码对应的函数trans_matrix的C代码如下:1voidtrans_matrix(inta[M][M]){2inti,j,t,*p;intc=(M<<2);for(i=0;i<M;i++){p=&a[0][i];for(j=0;j<M;j++){t=*p;334567*p=a[i][j];a[i][j]=t;89p+=c;}101112}}25.参考答案:(1)node所需存储空间需要4+(4+4)+4=16字节。成员p、s.x、s.y和next的偏移地址分别为0、4、8和12。(2)np_init中缺失的表达式如下:voidnp_init(structnode*np){np->s.x=np->s.y;np->p=&(np->s.x);实用文档精品文档np->next=np;}26.参考答案:表达式EXPRTYPE类汇编指令序列型movl(%eax),%eaxmovl%eax,(%edx)intuptr->s1.xuptr->s1.ymovw4(%eax),%axmovw%ax,(%edx)leal6(%eax),%eaxmovw%eax,(%edx)movl%eax,(%edx)shortshort*short*&uptr->s1.zuptr->s2.amovl4(%eax),%ecxmovl(%eax,%ecx,2),%eaxmovl%eax,(%edx)movl8(%eax),%eaxmovb(%eax),%alshortcharuptr->s2.a[uptr->s2.b]*uptr->s2.pmovb%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字节对齐)(6)S6:csd03640总共44字节,按28.参考答案:4字节边界对齐(Linux下double型按4字节边界对齐Windows平台要求不同的基本类型按照其数据长度进行对齐。每个成员的偏移量如下:cdisplgv08162024283240结构总大小为48字节,因为其中的d和g必须是按8字节边界对齐,所以,必须在末尾再加上4个字节,即44+4=48字节。变量长度按照从大到小顺序排列,可以使得结构所占空间最小,因此调整顺序后的结构定义如下:struct{doubled;longlongg;inti;charlongvoid*p;l;*v;实用文档精品文档shortchars;c;}test;dgiplvsc08162024283234结构总大小为34+6=40字节。29.参考答案:(1)执行第7行和第10行指令后栈中的信息存放情况如下图所示。其中gets函数的入口参数为buf数组首地址,应等于getline函数的栈帧底部指针EBP的内容减0x14,而getline函数的栈帧底部指针EBP的内容应等于执行完getline中第2行指令(push%ebp)后ESP的内容,此时,R[esp]==0xbffc07f0-4=0xbffc07ec,故buf数组首地址为R[ebp]-0x14=R[esp]-0x14=0xbffc07ec-0x14=0xbffc07d8。返回P的返回P的080485084139EBEBbffc08EBP在P中000000被调用者000000373635EBP在P中333231464544424139被调用者000000373635buf[7]~333231buf[3]~buf[7]~buf[3]~ESESbffc07gets入口参b)执行第10行后a)执行第7行后(2)当执行到getline的ret指令时,假如程序不发生段错误,则正确的返回地址实用文档精品文档应该是0x80485c8,发生段错误是因为执行getline的ret指令时得到的返回地址为0x8413938,这个地址所在存储段可能是不可执行的数据段,因而发生了段错误(segmentationfault)。实用文档精品文档(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种合理的函数原型为:①viodabc(intc,long*a,int*b);②viodabc(unsignedc,long*a,int*b);③viodabc(longc,long*a,int*b);④viodabc(unsignedlongc,long*a,int*b);根据第3、4行指令a指向64位带符号整数以是64位,因为*b为32位,所以取RDI中的低32位R[edi](截断为32位),再和*b相加。同时,参数c可以是2行加法指令addl的执行31.参考答案:可知,参数b肯定指向一个32位带符号整数类型;根据第5行指令可知,参数类型;而参数c可以是32位,也可带符号整数类型,也可以是无符号整数类型,因为第结果对于带符号整数和无符号整数都一样。实用文档精品文档(1)汇编指令注释如下:1movl8(%ebp),%edx//R[edx]←M[R[ebp]+8],将2movl12(%ebp),%ecx//R[ecx]←M[R[ebp]+12],将k送ECX3movl$255,%esi//R[esi]←255,将255送ESI4movl$-2147483648,%edi//R[edi]←-2147483648,将0x80000000送EDIx送EDX5.L3:6movl%edi,%eax//R[eax]←R[edi],将//R[eax]←R[eax]andR[edx],将iandx送EAX//R[esi]←R[esi]xorR[eax],将valxor(iandx)i送EAX7andl%edx,%eax%eax,%esi8xorl送ESI9movl%ecx,%ebx//R[ebx]←R[ecx],将k送ECXi逻辑右移k位送10shrlEDI%bl,%edi//R[edi]←R[edi]>>R[bl],将11testl12jne.L3%edi,%edi//若R[edi]≠0,则转.L3//R[eax]←R[es
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国制糖行业市场发展分析及前景趋势与投资研究报告
- 2024-2030年中国分体式饲料机行业市场发展规模及投资可行性分析报告
- 2024-2030年中国冶金炉料助熔剂产业未来发展趋势及投资策略分析报告
- 2024-2030年中国冰鲜鸡行业发展状况及营销战略研究报告
- 2024-2030年中国兽用头孢菌素类药品行业市场运营模式及未来发展动向预测报告
- 2024-2030年中国全氟三戊胺项目申请报告
- 2024-2030年中国光纤预制棒市场运行状况与前景趋势分析报告
- 《电机拖动及基础》教案
- 2024年度电梯管理服务协议版B版
- 《大萧条与罗斯福新政》教案
- 2025年1月“八省联考”考前猜想卷化学试题(15 4) 含解析
- 冲压团队协作力培训
- 2024年公务员考试时事政治考试题(综合题)
- 《视觉神经生理学》期末考试复习题库(含答案)
- 《厂内专用机动车辆安全技术规程》TSG81-2022知识培训
- 2024年2个居间人内部合作协议书模板
- 乡镇意识形态舆情事件应急处置预案
- 采购合同协议书范本(3篇)
- 广东省惠州市惠阳区2023-2024学年九年级上学期期末语文试题
- 课件:《中华民族共同体概论》第十五讲:新时代与中华民族共同体建设
- 幼儿园冬至主题班会课件
评论
0/150
提交评论