2022年2022年計(jì)算機(jī)系統(tǒng)第三章答案剖析_第1頁
2022年2022年計(jì)算機(jī)系統(tǒng)第三章答案剖析_第2頁
2022年2022年計(jì)算機(jī)系統(tǒng)第三章答案剖析_第3頁
2022年2022年計(jì)算機(jī)系統(tǒng)第三章答案剖析_第4頁
2022年2022年計(jì)算機(jī)系統(tǒng)第三章答案剖析_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、精選學(xué)習(xí)資料 - - - 歡迎下載習(xí)題3參考答案:( 1)后綴:( 2)后綴:w ,b,源:基址 +比例變址源:寄存器,+偏移,目:寄存器目:基址 +偏移( 3)后綴:l,源:比例變址,目:寄存器( 4)后綴:b,源:基址,目:寄存器( 5)后綴:( 6)后綴:l,l,源:立刻數(shù),源:立刻數(shù),目:棧目:寄存器( 7)后綴:w,源:寄存器,目:寄存器( 8)后綴: l,源:基址 +變址 +偏移,目:寄存器4參考答案:( 1)源操作數(shù)為立刻數(shù)0xff,需在前面加$( 2)源操作數(shù)為16 位,而長度后綴為字節(jié)b,不一樣( 3)目的操作數(shù)不能為立刻數(shù)尋址( 4)操作數(shù)位數(shù)超過16 位,而長度后綴為16

2、 位的 w( 5)不能用8 位寄存器作為目的操作數(shù)地址所在寄存器( 6)源操作數(shù)寄存器與目操作數(shù)寄存器長度不一樣( 7)不存在esx 寄存器( 8)源操作數(shù)地址中缺少變址寄存器 5參考答案:表 3.12 題 5 用 表src_typedst_type機(jī)器級表示charintmovsbl %al、 %edxintcharmovb %al、 %edxintunsignedmovl %eax、 %edxshortintmovswl %ax、 %edx unsigned charunsignedmovzbl %al、 %edxcharunsignedmovsbl %al、 %edxintintmovl

3、 %eax、 %edx6參考答案:(1) xptr .yptr 和 zptr 對應(yīng)實(shí)參所存放的儲備單元地址分別為:rebp+8 .rebp+12 .rebp+16 ;( 2)函數(shù) func 的 c 語言代碼如下:void funcint *xptr、 int *yptr、 int *zptrint tempx=*xptr; int tempy=*yptr; int tempz=*zptr;*yptr=tempx;*zptr = tempy;*xptr = tempz;精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載7參考答案:( 1)redx=x( 2)redx=x+y+4( 3)redx=x+

4、8*y( 4)redx=y+2*x+12( 5)redx=4*y( 6)redx=x+y 8參考答案:( 1)指令功能為:redx redx+mreax=0x00000080+m0x8049300 ,寄存器 edx 中內(nèi)容轉(zhuǎn)變;轉(zhuǎn)變后的內(nèi)容為以下運(yùn)算的結(jié)果: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 中的內(nèi)容轉(zhuǎn)變?yōu)?x00000070 ;依據(jù)表3.

5、5 可知,加法指令會影響of.sf.zf 和 cf 標(biāo)志;of=0 ,zf=0 , sf=0, cf=1 ;( 2)指令功能為:recx recx - mreax+rebx=0x00000010+m0x8049400、寄存器ecx中內(nèi)容轉(zhuǎn)變;轉(zhuǎn)變后的內(nèi)容為以下運(yùn)算的結(jié)果: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 中的內(nèi)容改為0x800000

6、08 ;依據(jù)表3.5 可知,減法指令會影響of.sf.zf 和 cf 標(biāo)志; of=1,zf=0 , sf=1, cf=10=1 ;( 3)指令功能為:rbx r bx ormreax+recx*8+4,寄存器bx 中內(nèi)容轉(zhuǎn)變;轉(zhuǎn)變后的內(nèi)容為以下運(yùn)算的結(jié)果: 0x0100 or m0x8049384=0100hor ff00h0000 0001 0000 0000or1111 1111 0000 00001111 1111 0000 0000因此, bx 中的內(nèi)容改為0xff00;由 3.3.3 節(jié)可知, or 指令執(zhí)行后of=cf=0 ;由于結(jié)果不為0, 故 zf=0 ;由于最高位為1,故

7、sf=1;( 4) test 指令不轉(zhuǎn)變?nèi)魏瓮ㄓ眉拇嫫?但依據(jù)以下“與”操作轉(zhuǎn)變標(biāo)志:rdl and 0x80精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載and1000 00001000 00001000 0000精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載由 3.3.3 節(jié)可知, test 指令執(zhí)行后of=cf=0;由于結(jié)果不為0,故 zf=0 ;由于最高位為1,故 sf=1;( 5)指令功能為:mreax+redx mreax+redx*32,即儲備單元0x8049380 中的內(nèi)容轉(zhuǎn)變?yōu)橐韵逻\(yùn)算的結(jié)果: m0x8049380*32=0x908f12a8*32,也即只要將0x908f12

8、a8 左移 5 位即可得到結(jié)果;1001 0000 1000 1111 0001 0010 1010 1000<<5=0001 0001 1110 0010 0101 0101 0000 0000因此,指令執(zhí)行后,單元0x8049380 中的內(nèi)容轉(zhuǎn)變?yōu)?x11e25500 ;明顯,這個(gè)結(jié)果為溢出的;但為,依據(jù)表 3.5 可知,乘法指令不影響標(biāo)志位,也即并不會使of=1;精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載( 6)指令功能為:rcx r cx - 1,即 cx 寄存器的內(nèi)容減一;0000 0000 0001 0000+1111 1111 1111 11111 0000 00

9、00 0000 1111因此,指令執(zhí)行后cx 中的內(nèi)容從0x0010 變?yōu)?0x000f;由表3.5 可知, dec 指令會影響of.zf .sf,依據(jù)上述運(yùn)算結(jié)果,得到of=0, zf=0 , sf=0; 9參考答案:movl12%ebp、 %ecx/recx mrebp+12 , 將 y 送 ecxsall$8、 %ecx/recx recx<<8 , 將 y*256 送 ecxmovlmovl8%ebp、 %eax20%ebp、 %edx/reax mrebp+8 , 將 x 送 eax/redx mrebp+20 , 將 k 送 edximull%edx、 %eax/rea

10、x reax*redx , 將 x*k 送 eaxmovl16%ebp、 %edx/redx mrebp+16 , 將 z 送 edxandl$65520、 %edx/redx redx and 65520 , 將 z&0xfff0 送 edxaddl%ecx、 %edx/redx redx + recx , 將 z&0xfff0+y*256送edxsubl%edx、 %eax/reax reax-redx , 將 x*k-z&0xfff0+y*256送 eax依據(jù)以上分析可知,第3 行缺失部分為:3intv =x*k-z&0xfff0+y*256; 10參考答

11、案:從匯編代碼的第2 行和第 4 行看, y 應(yīng)當(dāng)為占8 個(gè)字節(jié), rebp+20 開頭的 4 個(gè)字節(jié)為高32 位字節(jié),記為y h;rebp+16 開 始的4 個(gè)字節(jié)為低32 位字節(jié),記為y l;依據(jù)第4 行為無符號數(shù)乘法指令,得知y 的數(shù)據(jù)類型num_type為 unsigned long long ;movl12%ebp、 %eax/reax mrebp+12 , 將 x 送 eax movl20%ebp、 %ecx/recx mrebp+20 , 將 yh 送 ecximull%eax、 %ecx/recx recx*reax , 將 yh*x 的 低 32 位 送 ecxmull16%

12、ebp/redxreax mrebp+16*reax, 將 yl*x 送 edx-eax leal%ecx、 %edx、 %edx/ redx recx+redx ,將 y l*x 的高 32 位與 y h*x 的低 32 位相加后送edxmovl8%ebp、 %ecx/recx mrebp+8 , 將 d 送 ecxmovl%eax、 %ecx/mrecx reax , 將 x*y 低 32 位 送 d 指 向 的低32 位movl%edx、 4%ecx/mrecx+4 redx ,將 x*y 高 32 位送 d 指向的高32 位 11參考答案:依據(jù)第 3.3.4 節(jié)得知,條件轉(zhuǎn)移指令都采納

13、相對轉(zhuǎn)移方式在段內(nèi)直接轉(zhuǎn)移,即條件轉(zhuǎn)移指令的轉(zhuǎn)移目標(biāo)地址為:( pc) +偏移量;( 1)由于je 指令的操作碼為01110100 ,所以機(jī)器代碼7408h中的08h為偏移量,故轉(zhuǎn)移目標(biāo)地址為:0x804838c+2+0x8=0x8048396 ;call 指令中的轉(zhuǎn)移目標(biāo)地址0x80483b1=0x804838e+5+0x1e ,由此,可以看出,call 指令機(jī)器代碼中后面的4 個(gè)字節(jié)為偏移量,因ia-32 采納小端方式,故偏移量為0000001eh ;call 指令機(jī)器代碼共占5 個(gè)字節(jié),因此,下條指令 的地址為當(dāng)前指令地址0x804838e 加 5 ;( 2) jb 指令中 f6h 為偏

14、移量,故其轉(zhuǎn)移目標(biāo)地址為:0x8048390+2+0xf6=0x8048488 ;movl 指令的機(jī)器代碼有10 個(gè)字節(jié),前兩個(gè)字節(jié)為操作碼等,后面8 個(gè)字節(jié)為兩個(gè)立刻數(shù),由于為小端方式,所以,第一個(gè)立刻數(shù)為0804a800h ,即匯編指令中的目的地址0x804a800,最終4 個(gè)字節(jié)為立刻數(shù)00000001h ,即匯編指令中的常數(shù)0x1 ;精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載( 3)jle 指令中的7eh 為操作碼, 16h 為偏移量,其匯編形式中的0x80492e0 為轉(zhuǎn)移目的地址,因此,假定后面的 mov 指令的地址為x,就 x 滿意以下公式:0x80492e0=x+0x16

15、,故 x=0x80492e0 - 0x16=0x80492ca ;( 4)jmp 指令中的e9h 為操作碼,后面4 個(gè)字節(jié)為偏移量,由于為小端方式,故偏移量為ffffff00h ,即- 100h= - 256 ;后 面 的sub指 令的地址 為0x804829b ,故jmp指令的 轉(zhuǎn)移 目標(biāo) 地址為0x804829b+0xffffff00=0x804829b- 0x100=0x804819b ;12參考答案:( 1)匯編指令的注解說明如下:1movb8%ebp、 %dl/rdl mrebp+8 , 將 x 送 dl2movl12%ebp、 %eax/reax mrebp+12 , 將 p 送

16、eax3testl%eax、 %eax/reax and reax ,判定 p 為否為 04je.l1/ 如 p 為 0,就轉(zhuǎn) .l1 執(zhí)行5testb$0x80、 %dl/rdl and 80h ,判定 x 的第一位為否為06je.l1/ 如 x>=0,就轉(zhuǎn) .l1 執(zhí)行7addb%dl、 %eax/mreax mreax+rdl,即 *p+=x8.l1:由于 c 語言 if 語句中的條件表達(dá)式可以對多個(gè)條件進(jìn)行規(guī)律運(yùn)算,而匯編代碼中一條指令只能進(jìn)行一種規(guī)律運(yùn)算,并且在每條規(guī)律運(yùn)算指令生成的標(biāo)志都為存放在同一個(gè)eflags 寄存器中,所以,最好在一條規(guī)律指令后跟一條條件轉(zhuǎn)移指令,把 e

17、flags 中標(biāo)志用完, 然后再執(zhí)行另一次規(guī)律判定并依據(jù)條件進(jìn)行轉(zhuǎn)移的操作;(2)依據(jù)書中圖3.22 給出的“ if goto”語句形式寫出匯編代碼對應(yīng)的c 語言代碼如下:1void compchar x、 int *p 23if p.=04if x<05*p += x;613參考答案:1int funcint x、 int y23int z =x*y;4if x<=-100 5 ify>x6 z =x+y;7 else8 z =x-y;9 else ifx>=1610 z =x &y;11 return z; 1214參考答案:( 1)每個(gè)入口參數(shù)都要按4 字

18、節(jié)邊界對齊,因此,參數(shù)x.y 和 k 入棧時(shí)都占4 個(gè)字節(jié);1 movw8%ebp、 %bx/rbx mrebp+8 , 將 x 送 bx2 movw12%ebp、 %si/rsi mrebp+12 , 將 y 送 si3 movw16%ebp、 %cx/rcx mrebp+16 , 將 k 送 cx 4.l1:精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載5movw%si、 %dx/rdx rsi , 將 y 送 dx6movw%dx、 %ax/rax rdx , 將 y 送 ax7sarw$15、 %dx/rdx rdx>>15 ,將 y 的符號擴(kuò)展16 位 送 dx8idiv

19、%cx/rdx rdx-ax ÷ rcx 的余數(shù),將y%k 送 dx/rax rdx-ax ÷ rcx 的商,將y/k 送 ax9imulw%dx、 %bx/rbx rbx*rdx, 將 x* y%k 送 bx10decw%cx/rcx rcx-1 , 將 k-1 送 cx11testw%cx、 %cx/rcx and rcx ,得 of=cf=0 ,負(fù)數(shù)就sf=1、零就 zf=112jle.l2/ 如 k 小于等于0,就轉(zhuǎn) .l213cmpw%cx、 %si/rsi - rcx ,將 y 與 k 相減得到各標(biāo)志14jg.l1/ 如 y 大于 k,就轉(zhuǎn) .l115.l2:1

20、6movswl%bx、 %eax/ reax rbx , 將 x* y%k 送 ax( 2)被調(diào)用者儲存寄存器有bx .si,調(diào)用者儲存寄存器有ax . cx 和 dx ;在該函數(shù)過程體前面的預(yù)備階段,被調(diào)用者儲存的寄存器ebx 和 esi 必需儲存到棧中;( 3)由于執(zhí)行第8 行除法指令前必需先將被除數(shù)擴(kuò)展為32 位,而這里為帶符號數(shù)除法,因此,采納算術(shù)右移以擴(kuò)展 16 位符號,放在高16 位的 dx 中,低 16 位在 ax 中;15參考答案:1int f1unsigned x23 int y = 0 ;4 while x.=0 5y =x;6x>>=1;78returny&a

21、mp;0x1; 9函數(shù) f1 的功能返回: x x>>1 x>>2 . & 0x1 , 因此f1 用于檢測x 的奇偶性,當(dāng)x 中有奇數(shù)個(gè)1,就返回為 1,否就返回0; 16參考答案:函數(shù) sw 只有一個(gè)入口參數(shù)x,依據(jù)匯編代碼的第25 行指令知,當(dāng)x+3>7 時(shí)轉(zhuǎn)標(biāo)號 .l7 處執(zhí)行,否就,依據(jù)跳轉(zhuǎn)表中的地址轉(zhuǎn)移執(zhí)行,x 與跳轉(zhuǎn)目標(biāo)處標(biāo)號的關(guān)系如下: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 : .l7 x+3=7 : .l6由此可知, switch

22、x中省略的處理部分結(jié)構(gòu)如下:case -2:case -1:/ .l2 標(biāo)號處指令序列對應(yīng)的語句break; case 0:精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載/ .l3 標(biāo)號處指令序列對應(yīng)的語句break; case 1:./ .l4 標(biāo)號處指令序列對應(yīng)的語句break; case 2:精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載break; case 4:break; default:/ .l5 標(biāo)號處指令序列對應(yīng)的語句/ .l6 標(biāo)號處指令序列對應(yīng)的語句/ .l7 標(biāo)號處指令序列對應(yīng)的語句精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載17參考答案:依據(jù)第 2.3 行指令可知,

23、參數(shù)a 為 char 型,參數(shù)p 為指向 short 型變量的指針;依據(jù)第4.5 行指令可知,參數(shù)b 和 c 都為 unsigned short 型,依據(jù)第6 行指令可知,test 的返回參數(shù)類型為unsigned int ;因此, test 的原型為: unsigned int testchar a、 unsigned short b、 unsigned short c、 short *p;18參考答案:每次執(zhí)行pushl 指令后, resp=resp-4 ,因此,第2 行指令執(zhí)行后resp=0xbc00001c ;(1)執(zhí)行第3 行指令后, rebp=resp=0xbc00001c ;到第

24、12 條指令執(zhí)行終止都沒有轉(zhuǎn)變ebp 的內(nèi)容,因而執(zhí)行第10 行指令后, ebp 的內(nèi)容仍為為0xbc00001c ;執(zhí)行第13 行指令后, ebp 的內(nèi)容復(fù)原為進(jìn)入函數(shù)funct 時(shí) 的值0xbc000030;(2)執(zhí)行第 3 行指令后, resp=0xbc00001c ;執(zhí)行第4 行指令后resp= resp-40=0xbc00001c-0x28=0xbbfffff4;因而執(zhí)行第10 行指令后, 未跳轉(zhuǎn)到scanf 函數(shù)執(zhí)行時(shí), esp 中的內(nèi)容為0xbbfffff4-4=0xbbfffff0;在從 scanf函數(shù)返回后esp 中的內(nèi)容為0xbbfffff4 ;執(zhí)行第 13 行指令后, e

25、sp 的內(nèi)容復(fù)原為進(jìn)入函數(shù)funct 時(shí)的舊值,即 resp=0xbc000020 ;(3)第 5.6 兩行指令將 scanf 的第三個(gè)參數(shù) &y 入棧,入棧的內(nèi)容為 rebp-8=0xbc000014 ;第 7.8 兩行指令將 scanf 的其次個(gè)參數(shù) &x 入棧,入棧的內(nèi)容為 rebp-4=0xbc000018 ;故 x 和 y 所在的地址分別為 0xbc000018 和 0xbc000014 ;(4)執(zhí)行第10 行指令后, funct 棧幀的地址范疇及其內(nèi)容如下:精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載0xbc00001c0xbc000030ebp棧幀底部精品學(xué)習(xí)資

26、料精選學(xué)習(xí)資料 - - - 歡迎下載0xbc000018 0xbc0000140xbc000010 0xbc00000c0xbc000008 0xbc000004 0xbc000000 0xbbfffffc 0xbbfffff8 0xbbfffff40xbbfffff0x=15 y=200xbc000014 0xbc000018 0x804c000從 scanf返回的地址esp精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載19參考答案:第 1 行匯編指令說明參數(shù)x 存放在 ebx 中,依據(jù)第4 行判定 x=0 就轉(zhuǎn) .l2,否就連續(xù)執(zhí)行第510 行指令;依據(jù)第 5.6.7 行指令可知,入棧參數(shù)

27、nx 的運(yùn)算公式為x>>1;依據(jù)第9.10.11 行指令可知,返回值為x&1+ rv ;由此精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載推斷出 c 缺失部分如下:1int refuncunsigned x 2if x=03 return0;4 unsigned nx =x>>1;5 int rv = refuncnx ;6 returnx & 0x1 + rv;7該函數(shù)的功能為運(yùn)算x 的各個(gè)數(shù)位中1 的個(gè)數(shù); 20參考答案:在 ia-32 中, gcc 為數(shù)據(jù)類型long double 型變量安排12 字節(jié)空間,實(shí)際上只占用10 個(gè)字節(jié);數(shù)組元素大小(

28、 b)數(shù)組大?。╞)起始地址元素 i 的地址 chara10110&a0&a0+ i intb1004400&b0&b0+4 ishort *c5420&c0&c0+4 i short *d6424&d0&d0+4 i long double e1012120&e0&e0+12 i long double *f10440&f0&f0+4 i精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載21參考答案:表達(dá)式類型值匯編代碼sshort *asleal%edx、 %eaxs+ishort *a s+2*

29、ileal%edx、 %ecx、 2、 %eax sishortm as+2* i movw%edx、 %ecx、 2、 %ax&s10short *as+20leal20%edx、 %eax&si+2short *as+2* i+4leal4%edx、 %ecx、 2、 %eax &si-sinta s+2* i-as/2= imovl%ecx、 %eaxs4*i+4shortm as+2*4* i +4movw8%edx、 %ecx、 8、 %ax*s+i-2shortm as+2* i-2movw-4%edx、 %ecx、 2、 %ax精品學(xué)習(xí)資料精選學(xué)習(xí)資料 -

30、 - - 歡迎下載22參考答案:依據(jù)匯編指令功能可以推斷最終在eax 中返回的值為:ma+28*i+4*j+mb+20*j+4*i,由于數(shù)組a 和 b 都為 int 型,每個(gè)數(shù)組元素占4b,因此, m=5、 n=7 ;23參考答案:執(zhí)行第 11 行指令后, aijk的地址為a+4*63*i+9*j+k,所以,可以推斷出m=9 , n=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)化匯編代碼對應(yīng)的函數(shù)trans_matrix 的

31、c 代碼如下:1 void trans_matrixint amm 2 int i、 j、 t、 *p;3int c=m<<2;3for i = 0; i < m; i+ 4p=&a0i;5for j = 0; j < m; j+ 精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載6t=*p;7*p = aij;8aij = t;9p += c ;10111225參考答案:(1)node 所需儲備空間需要4+4+4+4=16 字節(jié);成員p.s.x.s.y 和 next 的偏移地址分別為0.4.8 和 12;( 2) np_init 中缺失的表達(dá)式如下:void np

32、_initstruct node *npnp->s.x =np->s.y;np->p =&np->s.x; np->next=np;26參考答案:表達(dá)式 exprtype 類型匯編指令序列uptr->s1.xintmovl%eax、 %eax movl%eax、 %edxmovw4%eax、 %ax精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載uptr->s1.yshortmovw%ax、 %edx精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載leal6%eax、 %eax&uptr->s1.zshort *movw%eax、 %

33、edxuptr->s2.ashort *movl%eax、 %edx movl4%eax、 %ecx精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載uptr->s2.auptr->s2.bshort*uptr->s2.pcharmovl%eax、 %ecx、 2、 %eax movl%eax、 %edxmovl8%eax、 %eax movb%eax、 %al movb%al、 %edx精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載27參考答案:( 1)s1:scid0248總共12 字節(jié),按4 字節(jié)邊界對齊( 2)s2:iscd( 3)s3:0c4s6i7d總共8 字節(jié)

34、,按4 字節(jié)邊界對齊( 4)s4:0s2c48總共12 字節(jié),按4 字節(jié)邊界對齊06總共 8 字節(jié),按2 字節(jié)邊界對齊( 5)s5:cside( 6)s6:0c4s8d1216總共 24 字節(jié),按4 字節(jié)邊界對齊(linux 下 double 型按 4 字節(jié)對齊)03640總共 44 字節(jié),按4 字節(jié)邊界對齊28參考答案:windows 平臺要求不同的基本類型依據(jù)其數(shù)據(jù)長度進(jìn)行對齊;每個(gè)成員的偏移量如下:cdisplgv08162024283240精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載結(jié)構(gòu)總大小為48 字節(jié),由于其中的d 和 g 必需為按8 字節(jié)邊界對齊,所以,必需在末尾再加上4 個(gè)字

35、節(jié),即 44+4=48 字節(jié); 變量長度依據(jù)從大到小次序排列,可以使得結(jié)構(gòu)所占空間最小,因此調(diào)整次序后的結(jié)構(gòu)定義如下:struct doubled;long longg;inti;char*p;longl;void*v ;shorts;charc; test ;dgiplvsc08162024283234結(jié)構(gòu)總大小為34+6=40 字節(jié);29參考答案:( 1)執(zhí)行第 7 行和第 10 行指令后棧中的信息存放情形如下圖所示; 其中 gets 函數(shù)的入口參數(shù)為 buf 數(shù)組首地址,應(yīng)等于 getline 函數(shù)的棧幀底部指針 ebp 的內(nèi)容減 0x14 ,而 getline 函數(shù)的棧幀底部指針 eb

36、p 的內(nèi) 容 應(yīng) 等 于 執(zhí) 行 完 getline 中 第 2 行 指 令 ( push %ebp ) 后 esp 的 內(nèi) 容 , 此 時(shí) , resp=0xbffc07f0 - 4=0xbffc07ec ,故 buf 數(shù)組首地址為rebp - 0x14= resp- 0x14=0xbffc07ec - 0x14=0xbffc07d8 ;08 04 85 c8返回 p 的地址08 41 39 38返回 p 的地址精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載ebpbf fc 08 0000 00 00 0800 00 00 1000 00 00 05ebp 在 p 中舊值被 調(diào) 用 者 儲存

37、 寄 存 器 在p 中的舊值buf7 buf4buf3 buf0ebp37 36 35 3433 32 31 3046 45 44 4342 41 39 3837 36 35 3433 32 31 30ebp 在 p 中舊值被 調(diào) 用 者 儲存 寄 存 器 在 p 中的舊值buf7 buf4buf3 buf0精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載espespbf fc 07 d8gets 入口參數(shù)精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載a) 執(zhí)行第 7 行后的棧b 執(zhí)行第 10 行后的棧( 2)當(dāng)執(zhí)行到getline 的 ret 指令

38、時(shí),假如程序不發(fā)生段錯(cuò)誤,就正確的返回地址應(yīng)當(dāng)為0x80485c8 ,發(fā)生段錯(cuò)誤為由于執(zhí)行g(shù)etline 的 ret 指令時(shí)得到的返回地址為0x8413938 ,這個(gè)地址所在儲備段可能為不行執(zhí)行的數(shù)據(jù)段,因而發(fā)生了段錯(cuò)誤(segmentation fault );( 3)執(zhí)行完第10 行匯編指令后,被調(diào)用者儲存寄存器ebx .esi 和 edi 在 p 中的內(nèi)容已被破壞,同時(shí)仍破壞了 ebp 在 p 中的內(nèi)容;( 4) getline 的 c 代碼中 malloc 函數(shù)的參數(shù)應(yīng)當(dāng)為strlenbuf+1 ,此外,應(yīng)當(dāng)檢查malloc 函數(shù)的返回值為否為 null ;30參考答案:x86-64

39、過程調(diào)用時(shí)參數(shù)傳遞為通過通用寄存器進(jìn)行的,前三個(gè)參數(shù)所用寄存器次序?yàn)閞di .rsi .rdx ; abc 的 4 種合理的函數(shù)原型為:viod abcint c、 long *a、 int *b;viod abcunsigned c、 long *a、 int *b;精品學(xué)習(xí)資料精選學(xué)習(xí)資料 - - - 歡迎下載viod abclong c、 long *a、 int *b;viod abcunsigned long c、 long *a、 int *b;依據(jù)第 3.4 行指令可知,參數(shù) b 確定指向一個(gè) 32 位帶符號整數(shù)類型;依據(jù)第 5 行指令可知,參數(shù) a 指向64 位帶符號整數(shù)類型;

40、而參數(shù) c 可以為 32 位,也可以為 64 位,由于 *b 為 32 位,所以取 rdi 中的低 32 位 redi(截?cái)酁?32 位),再和 *b 相加; 同時(shí), 參數(shù) c 可以為帶符號整數(shù)類型, 也可以為無符號整數(shù)類型,由于第 2 行加法指令 addl 的執(zhí)行結(jié)果對于帶符號整數(shù)和無符號整數(shù)都一樣;31參考答案:( 1)匯編指令注釋如下:1 movl 8%ebp、 %edx/redx mrebp+8 , 將 x 送 edx2 movl12%ebp、 %ecx/recx mrebp+12 , 將 k 送 ecx 3movl$255、 %esi/resi 255, 將 255 送 esi4 movl $-2147483648、 %edi /redi -2147483648 , 將 0x80000000 送 edi5 .l3:6 movl %edi、 %eax/reax redi , 將 i 送 eax7 andl %edx、 %eax/reax reax and redx , 將 i and x 送 eax8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論