




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、習題3 .參考答案:(1)后綴:w,源:基址+比例變址瑜移,目寄存器(2)后綴b,源:寄存器,目基址+偏移(3)后綴l,源:比例變址,目寄存器(4)后綴b,源:基址,目寄存器(5)后綴l,源:立即數(shù),目棧(6)后綴l,源:立即數(shù),目寄存器后綴w,源:寄存器,目寄存器(8)后綴l,源:基址建址+偏移,目寄存器4 .參考答案:(1)源操作數(shù)是立即數(shù)0xFF,需在前面加$(2)源操作數(shù)是16位,而長度后綴是字節(jié)b,不一致(3)目的操作數(shù)不能是立即數(shù)尋址(4)操作數(shù)位數(shù)超過16位,而長度后綴為16位的w(5)不能用8位寄存器作為目的操作數(shù)地址所在寄存器(6)源操作數(shù)寄存器與目操作數(shù)寄存器長度不一致(7
2、)不存在ESX寄存器(8)源操作數(shù)地址中缺少變址寄存器5 .參考答案:表題5用表src_typedst_type機器級表示charintmovsbl%al,(%edx)intcharmovb%al,(%edx)intunsignedmovl%eax,(%edx)shortintmovswl%ax,(%edx)unsignedcharunsignedmovzbl%al,(%edx)charunsignedmovsbl%al,(%edx)intintmovl%eax,(%edx)6 .參考答案:(1) xptr、yptr和zptr對應實參所存放的存儲單元地址分別為:Rebp+8、Rebp+12、R
3、ebp+16。(2)函數(shù)func的C語言代碼如下:voidfunc(int*xptr,int*yptr,int*zptr)inttempx=*xptr;inttempy=*yptr;inttempz=*zptr;*yptr=tempx;*zptr=tempy;*xptr=tempz;7 .參考答案:(11) Redx=x(12) Redx=x+y+4(13) Redx=x+8*y(14) Redx=y+2*x+12(15) Redx=4*y(16) Redx=x+y8 .參考答案:(1)指令功能為:RedxRedx+MReax=0x00000080+M0x8049300,寄存器EDX中內(nèi)容改變
4、。改變后的內(nèi)容為以下運算的結(jié)果:00000080H+FFFFFFF0H00000000000000000000000010000000+11111111111111111111111111110000100000000000000000000000001110000因此,EDX中的內(nèi)容改變?yōu)?x00000070。根據(jù)表可知,加法指令會影響ORSF、ZF和CF標志。OF=QZF=0,SF=0,CF=1。(2)指令功能為:RecxRecx-MReax+Rebx=0x00000010+M0x8049400,寄存器ECX中內(nèi)容改變。改變后的內(nèi)容為以下運算的結(jié)果:00000010H-H000000000
5、00000000000000000010000+01111111111111111111111111111000010000000000000000000000000001000因此,ECX中的內(nèi)容改為0x。根據(jù)表可知,減法指令會影響OF、SF、ZF和CF標志。OF=1,ZF=0,SF=1,CF=1?0=1。(3)指令功能為:Rbx-RbxorMReax+Recx*8+4,寄存器BX中內(nèi)容改變。改變后的內(nèi)容為以下運算的結(jié)果:0x0100orM0x8049384=0100HorFF00H0000000100000000o11111111000000001111111100000000因此,BX中
6、的內(nèi)容改為0xFF00。由節(jié)可知,OR指令執(zhí)行后OF=CF=0因為結(jié)果不為0,故ZF=0;因為最高位為1,故SF=1o(4) test指令不改變?nèi)魏瓮ㄓ眉拇嫫?,但根?jù)以下“與操作改變標志:Rdland0x8010000000and1000000010000000由節(jié)可知,TEST指令執(zhí)行后OF=CF=0因為結(jié)果不為0,故ZF=0;因為最高位為1,故SF=1。(5)指令功能為:MReax+Redx-MReax+Redx*32,即存儲單元0x8049380中的內(nèi)容改變?yōu)橐韵逻\算的結(jié)果:M0x8049380*32=0x908f12a8*32,也即只要將0x908f12a8左移5位即可得到結(jié)果。100
7、100001000111100010010101010005=00010001111000100101010100000000因此,指令執(zhí)行后,單元0x8049380中的內(nèi)容改變?yōu)?x11e25500。顯然,這個結(jié)果是溢出的。但是,根據(jù)表可知,乘法指令不影響標志位,也即并不會使OF=1o(6)指令功能為:Rcx-Rcx-1,即CX寄存器的內(nèi)容減一。0000000000010000+111111111111111110000000000001111因此,指令執(zhí)行后CX中的內(nèi)容從0x0010變?yōu)?x000F。由表可知,DEC指令會影響ORZF、SF,根據(jù)上述運算結(jié)果,得到OF=QZF=0,SF=0
8、o9 .參考答案:movl12(%ebp),%ecx11執(zhí)行5testb$0x80,%dl11執(zhí)行7addb%dl,(%eax)1:因為C語言if語句中的條件表達式可以對多個條件進行邏輯運算,而匯編代碼中一條指令只能進行一種邏輯運算,并且在每條邏輯運算指令生成的標志都是存放在同一個EFLAGSW存器中,所以,最好在一條邏輯指令后跟一條條件車t移指令,把EFLAG計標志用完,然后再執(zhí)行另一次邏輯判斷并根據(jù)條件進行轉(zhuǎn)移的操作。(2)按照書中圖給出的“if()goto”語句形式寫出匯編代碼對應的C語言代碼如下:1 voidcomp(charx,int*p)2 3 if(p!=0)4 if(x0)5
9、*p+=x;6 13 .參考答案:1 intfunc(intx,inty)2 3 intz=x*y;4 if(xx)6 z=x+y;7 else8 z=x-y;9 elseif(x=16)10 z=x&y;11 returnz;12 14 .參考答案:(1)每個入口參數(shù)都要按4字節(jié)邊界對齊,因此,參數(shù)x、y和k入棧時都占4個字節(jié)。1 movw 8(%ebp), %bx5 movw %si, %dx13 cmpw %cx, %si15 .L2:16 movswl %bx, %eax返回0。16.參考答案:1:2211& 0x1 ,因此 f1用于檢測x的奇偶性,當x中有奇數(shù)個1,則返回為1,否則函
10、數(shù)sw只有一個入口參數(shù)x,根據(jù)匯編代碼的第25行指令知,當x+37時轉(zhuǎn)標號.L7處執(zhí)行,否則,按照跳轉(zhuǎn)表中的地址轉(zhuǎn)移執(zhí)行,x 與跳轉(zhuǎn)目標處標號的關(guān)系如下:x+3=0:x+3=1:x+3=2:x+3=3:x+3=4:x+3=5:x+3=6:x+3=7:由此可知,.L7.L2.L2.L3.L4.L5.L7.L6switch (x)中省略的處理部分結(jié)構(gòu)如下:case -2:case -1:2 標號處指令序列對應的語句break;case 0:3標號處指令序列對應的語句break;case 1:.4標號處指令序列對應的語句break;case 2:5標號處指令序列對應的語句break;case4:6標
11、號處指令序列對應的語句break;default:7標號處指令序列對應的語句17 參考答案:根據(jù)第2、3行指令可知,參數(shù)a是char型,參數(shù)p是指向short型變量的指針;根據(jù)第4、5行指令可知,參數(shù)b和c都是unsignedshort型,根據(jù)第6行指令可知,test的返回參數(shù)類型為unsignedint。因此,test的原型為:unsignedinttest(chara,unsignedshortb,unsignedshortc,short*p);18 參考答案:每次執(zhí)行pushl指令后,Resp=Resp-4,因此,第2行指令執(zhí)行后Resp=0xbc00001c。(1)執(zhí)行第3行指令后,R
12、ebp=Resp=0xbc00001c。到第12條指令執(zhí)行結(jié)束都沒有改變EBP的內(nèi)容,因而執(zhí)行第10行指令后,EBP的內(nèi)容還是為0xbc00001c。執(zhí)行第13行指令后,EBP的內(nèi)容恢復為進入函數(shù)funct時的值0xbc000030。(2)執(zhí)行第3行指令后,Resp=0xbc00001c。執(zhí)行第4行指令后Resp=Resp-40=0xbc00001c-0x28=0xbbfffff4。因而執(zhí)行第10行指令后,未跳轉(zhuǎn)到scanf函數(shù)執(zhí)行時,ESP中的內(nèi)容為0xbbfffff4-4=0xbbfffff0;在從scanf函數(shù)返回后ESP中的內(nèi)容為0xbbfffff4。執(zhí)行第13行指令后,ESP的內(nèi)容恢
13、復為進入函數(shù)funct時的舊值,即Resp=0xbc000020。(3)第5、6兩行指令將scanf的第三個參數(shù)&y入棧,入棧的內(nèi)容為Rebp-8=0xbc000014;第7、8兩行指令將scanf的第二個參數(shù)&x入棧,入棧的內(nèi)容為Rebp-4=0xbc000018。故x和y所在的地址分別為0xbc000018和0xbc000014。(4)執(zhí)行第10行指令后,funct棧幀的地址范圍及其內(nèi)容如下:0xbc00001c0xbc0000300xbc000018x=150xbc000014y=200xbc0000100xbc00000c0xbc0000080xbc0000040xbc0000000x
14、bbfffff0xbc0000140xbbfffff0xbc0000180xbbfffff0x804c0000xbbfffff從scanf返回的地EBpEBP棧幀底部ESP19 .參考答案:第1行匯編指令說明參數(shù)x存放在EBX中,根據(jù)第4行判斷x=0則轉(zhuǎn).L2,否則繼續(xù)執(zhí)行第510行指令。根據(jù)第5、6、7行指令可知,入棧參數(shù)nx的計算公式為x1;根據(jù)第9、10、11行指令可知,返回值為(x&1)+rv。由此推斷出C缺失部分如下:1 intrefunc(unsignedx)2 if(x=0)3 return0;4 unsignednx=x1;5 intrv=refunc(nx);6 return
15、(x&0x1)+rv;7該函數(shù)的功能為計算x的各個數(shù)位中1的個數(shù)。20 .參考答案:在IA-32中,GCa數(shù)據(jù)類型longdouble型變量分配12字節(jié)空間,實際上只占用10個字節(jié)。數(shù)組元素大小(B)數(shù)組大小(B)起始地址元素i的地址charA10110&A0&A0+iintB1004400&B0&B0+4ishort*C5420&C0&C0+4ishort*D6424&D0&D0+4ilongdoubleE1012120&E0&E0+12ilongdouble*F10440&F0&F0+4i21 .參考答案:表達式類型值匯編代碼Sshort*Aleal(%edx),%eaxS+ishort*
16、A+2*ileal(%edx,%ecx,2),%eaxSishortMAS+2*imovw(%edx,%ecx,2),%ax&S10short*AS+20leal20(%edx),%eax&Si+2short*A+2*i+4leal4(%edx,%ecx,2),%eax&Si-Sint(As+2*i-As)/2=imovl%ecx,%eaxS4*i+4shortMAs+2*(4*i+4)movw8(%edx,%ecx,8),%ax*(S+i-2)shortMA+2*(i-2)movw-4(%edx,%ecx,2),%ax22 .參考答案:根據(jù)匯編指令功能可以推斷最終在EAX中返回的值為:Ma+
17、28*i+4*j+Mb+20*j+4*i,因為數(shù)組a和b都是int型,每個數(shù)組元素占4B,因此,M=5,N=7。23 .參考答案:執(zhí)行第11行指令后,ai皿k的地址為a+4*(63*i+9*j+k),所以,可以推斷出M=9N=63/9=7。根據(jù)第12行指令,可知數(shù)組a的大小為4536字節(jié),故L=4536/(4*L*M)=18。24 .參考答案:(1)常數(shù)M=76/4=19,存放在EDI中,變量j存放在ECX中。(2)上述優(yōu)化匯編代碼對應的函數(shù)trans_matrix的C代碼如下:1 voidtrans_matrix(intaMM)2 inti,j,t,*p;3 intc=(M2);4 for(
18、i=0;iM;i+)5 p=&a0i;6 for(j=0;j=np-;np-p=&(np-;np-next=np;26 .參考答案:表達式EXPRTYPE類型匯編指令序列uptr-intmovl(%eax),%eaxmovl%eax,(%edx)uptr-shortmovw4(%eax),%axmovw%ax,(%edx)&uptr-short*leal6(%eax),%eaxmovw%eax,(%edx)uptr-short*movl%eax,(%edx)uptr-uptr-shortmovl4(%eax),%ecxmovl(%eax,%ecx,2),%eaxmovl%eax,(%edx)*
19、uptr-charmovl8(%eax),%eaxmovb(%eax),%almovb%al,(%edx)27 .參考答案:(1) S1: s c 0(2) S2: i s 0(3) S3: c s 0(4) S4: s c 0(5) S5: c s 0(6) S6: c s 028 .參考答案:id248總共12字節(jié),按4字節(jié)邊界對齊cd467總共8字節(jié),按4字節(jié)邊界對齊id248總共12字節(jié),按4字節(jié)邊界對齊6總共8字節(jié),按2字節(jié)邊界對齊ide481216總共24字節(jié),按4字節(jié)邊界對齊(Linux下double型按4字節(jié)對齊)d3640總共44字節(jié),按4字節(jié)邊界對齊Windows平臺要求不
20、同的基本類型按照其數(shù)據(jù)長度進行對齊。每個成員的偏移量如下:cdisplgv08162024283240結(jié)構(gòu)總大小為48字節(jié),因為其中的d和g必須是按8字節(jié)邊界對齊,所以,必須在末尾再加上4個字節(jié),即44+4=48字節(jié)。變量長度按照從大到小順序排列,可以使得結(jié)構(gòu)所占空間最小,因此調(diào)整順序后的結(jié)構(gòu)定義如下:structdoubled;longlongg;inti;char*p;longl;void*v;shorts;charc;test;dgiplvsc08162024283234結(jié)構(gòu)總大小為34+6=40字節(jié)。29 .參考答案:(1)執(zhí)行第7行和第10行指令后棧中的信息存放情況如下圖所示。其中g(shù)
21、ets函數(shù)的入口參數(shù)為buf數(shù)組首地址,應等于getline函數(shù)的棧幀底部指針EBP的內(nèi)容減0x14,而getline函數(shù)的棧幀底部指針EBP的內(nèi)容應等于執(zhí)行完getline中第2行指令(push%ebp)后ESP的內(nèi)容,此時,Resp=0xbffc07f0-4=0xbffc07ec,故buf數(shù)組首地址為Rebp-0x14=Resp-0x14=0xbffc07ec-0x14=0xbffc07d8。08413938EBPf飛736353433323130464544434241393813736353433323130ESP bf fc 07 d8b)執(zhí)行第10行后的棧返回P的地址EBP在P中舊值被調(diào)用者保卜存寄存器在J P中的舊值buf7 bu肥 buf0gets入口參數(shù)(2)當執(zhí)行到getline的ret指令時,假如程序不發(fā)生段錯誤,則正確的返回地址應該是0x80485c8,發(fā)生段錯誤是因為執(zhí)行g(shù)etline的ret指令時得到的返回地址為0x8413938,這個地址所在存儲段可能是不可執(zhí)行的數(shù)據(jù)段,因而發(fā)生了段錯誤(segmentationfault)。(3)執(zhí)行完第10行匯編指令后,被調(diào)用者保存寄存器EBXESI和EDI在P中的內(nèi)容已被破壞,同時還破壞了EBP在P中的內(nèi)容。(4) getline的C代碼中m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年刮墨刀項目資金申請報告代可行性研究報告
- 2025年度教育科技股權(quán)分配及資源共享協(xié)議模板
- 2025年度事業(yè)單位聘用合同書模板(保密協(xié)議)正式版
- 2025年度保密性產(chǎn)品研發(fā)與生產(chǎn)合作協(xié)議
- 2025年河南中醫(yī)藥大學單招職業(yè)技能測試題庫及答案一套
- 2025年農(nóng)村集體土地租賃與使用權(quán)轉(zhuǎn)讓協(xié)議
- 2025年度宅基地使用權(quán)流轉(zhuǎn)備案與監(jiān)管服務(wù)合同
- 二零二五年度電影演員跨界合作合同范本
- 咖啡廳垃圾運輸合作協(xié)議
- 2025年度新能源產(chǎn)業(yè)研發(fā)人工費合作協(xié)議
- 教師課堂教學語言技能范例課件
- 《體育與健康說課》課件
- 人教版化學九年級下冊同步練習:第九單元 溶液
- 華南師范大學附屬小學招聘教師筆試真題2022
- 山東女子學院《C語言程序設(shè)計》2022-2023學年期末試卷
- 2020年中國人身保險產(chǎn)品研究報告
- 常見織帶花鏈的排法和穿棕方法
- 《化工工程制圖》完整教案
- 心肌梗死后心衰病例分享
- 洪恩識字識字卡(001-100)可直接打印剪裁
- 《單片機技術(shù)及應用》教學大綱
評論
0/150
提交評論