計算機系統第三章答案_第1頁
計算機系統第三章答案_第2頁
計算機系統第三章答案_第3頁
計算機系統第三章答案_第4頁
計算機系統第三章答案_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、習 題3 參考答案:(1)后綴:w,源:基址+比例變址+偏移,目:寄存器(2)后綴:b,源:寄存器, 目:基址+偏移(3)后綴:l,源:比例變址,目:寄存器(4)后綴:b,源:基址,目:寄存器(5)后綴:l,源:立即數,目:棧(6)后綴:l,源:立即數,目:寄存器(7)后綴:w,源:寄存器,目:寄存器(8)后綴:l,源:基址+變址+偏移,目:寄存器4參考答案:(1)源操作數是立即數0xFF,需在前面加$(2)源操作數是16位,而長度后綴是字節b,不一致(3)目的操作數不能是立即數尋址(4)操作數位數超過16位,而長度后綴為16位的w(5)不能用8位寄存器作為目的操作數地址所在寄存器(6)源操作

2、數寄存器與目操作數寄存器長度不一致(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參考答案:(1)xptr、yptr和zpt

3、r對應實參所存放的存儲單元地址分別為: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;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+y8參考答案:(1)指令功能為:RedxRedx+MReax=

4、0x00000080+M0x8049300,寄存器EDX中內容改變。改變后的內容為以下運算的結果:00000080H+FFFFFFF0H0000 0000 0000 0000 0000 0000 1000 00001111 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。(2)指令功能為:RecxRecx-MReax+Rebx=0x0000001

5、0+M0x8049400, 寄存器ECX中內容改變。改變后的內容為以下運算的結果:00000010H-80000008H0000 0000 0000 0000 0000 0000 0001 00000111 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=1Å0=1。(3)指令功能為:RbxRbx or MReax+Recx*8+4,寄存器B

6、X中內容改變。改變后的內容為以下運算的結果:0x0100 or M0x8049384=0100H or FF00H0000 0001 0000 00001111 1111 0000 0000 1111 1111 0000 0000 or因此,BX中的內容改為0xFF00。由3.3.3節可知,OR指令執行后OF=CF=0;因為結果不為0,故ZF=0;因為最高位為1,故SF=1。(4)test指令不改變任何通用寄存器,但根據以下“與”操作改變標志:Rdl and 0x80 1000 00001000 0000 1000 0000 andd由3.3.3節可知,TEST指令執行后OF=CF=0;因為結

7、果不為0,故ZF=0;因為最高位為1,故SF=1。(5)指令功能為:MReax+RedxMReax+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因此,指令執行后,單元0x8049380中的內容改變為0x11e25500。顯然,這個結果是溢出的。但是,根據表3.5可知,乘法指令不影響標

8、志位,也即并不會使OF=1。(6)指令功能為:Rcx Rcx-1,即CX寄存器的內容減一。0000 0000 0001 00001111 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), %ecx/RecxMRebp+12,將y送ECX sall$8, %ecx/RecxRecx<<8,將y*256送ECXmovl8(%ebp), %eax/ReaxMRebp

9、+8,將x送EAXmovl20(%ebp), %edx /RedxMRebp+20,將k送EDXimull%edx, %eax/ReaxReax*Redx,將x*k送EAXmovl16(%ebp), %edx/RedxMRebp+16,將z送EDXandl$65520, %edx/RedxRedx and 65520,將z&0xFFF0送EDXaddl%ecx, %edx/RedxRedx + Recx,將z&0xFFF0+y*256送EDXsubl%edx, %eax/ReaxReax-Redx,將x*k-(z&0xFFF0+y*256)送EAX根據以上分析可知,第3

10、行缺失部分為:3intv = x*k-(z&0xFFF0+y*256) ;10參考答案:從匯編代碼的第2行和第4行看,y應該是占8個字節,Rebp+20開始的4個字節為高32位字節,記為yh;Rebp+16開始的4個字節為低32位字節,記為yl。根據第4行為無符號數乘法指令,得知y的數據類型num_type為unsigned long long。movl 12(%ebp), %eax/ReaxMRebp+12,將x送EAXmovl20(%ebp), %ecx/RecxMRebp+20,將yh送ECXimull%eax, %ecx/RecxRecx*Reax,將yh*x的低32位送ECX

11、mull16(%ebp) /RedxReaxMRebp+16*Reax,將yl*x送EDX-EAXleal(%ecx, %edx), %edx/ RedxRecx+Redx,將yl*x的高32位與yh*x的低32位相加后送EDXmovl8(%ebp), %ecx /RecxMRebp+8,將d送ECXmovl%eax, (%ecx)/MRecxReax,將x*y低32位送d指向的低32位movl%edx, 4(%ecx)/MRecx+4Redx,將x*y高32位送d指向的高32位11參考答案:根據第3.3.4節得知,條件轉移指令都采用相對轉移方式在段內直接轉移,即條件轉移指令的轉移目標地址為:

12、(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是偏移量,故其轉移目標地址為:0x8048390+2+0xf6=0x8048488。movl指令的機器代碼有1

13、0個字節,前兩個字節是操作碼等,后面8個字節為兩個立即數,因為是小端方式,所以,第一個立即數為0804A800H,即匯編指令中的目的地址0x804a800,最后4個字節為立即數00000001H,即匯編指令中的常數0x1。 (3)jle指令中的7EH為操作碼,16H為偏移量,其匯編形式中的0x80492e0是轉移目的地址,因此,假定后面的mov指令的地址為x,則x滿足以下公式:0x80492e0=x+0x16,故x=0x80492e0-0x16=0x80492ca。(4)jmp指令中的E9H為操作碼,后面4個字節為偏移量,因為是小端方式,故偏移量為FFFFFF00H,即-100H=-256。后

14、面的sub指令的地址為0x804829b,故jmp指令的轉移目標地址為0x804829b+0xffffff00=0x804829b-0x100=0x804819b。12參考答案:(1)匯編指令的注解說明如下:1 movb 8(%ebp), %dl/RdlMRebp+8,將x送DL2 movl 12(%ebp), %eax /ReaxMRebp+12,將p送EAX3 testl %eax, %eax /Reax and Reax,判斷p是否為04 je .L1/若p為0,則轉.L1執行5 testb $0x80, %dl /Rdl and 80H,判斷x的第一位是否為06 je .L1/若x&g

15、t;=0,則轉.L1執行7 addb %dl, (%eax) /MReaxMReax+Rdl,即*p+=x8 .L1: 因為C語言if語句中的條件表達式可以對多個條件進行邏輯運算,而匯編代碼中一條指令只能進行一種邏輯運算,并且在每條邏輯運算指令生成的標志都是存放在同一個EFLAGS寄存器中,所以,最好在一條邏輯指令后跟一條條件轉移指令,把EFLAGS中標志用完,然后再執行另一次邏輯判斷并根據條件進行轉移的操作。(2)按照書中圖3.22給出的“if () goto ”語句形式寫出匯編代碼對應的C語言代碼如下:1 void comp(char x, int *p)2 3 if (p!=0) 4 i

16、f (x<0)5 *p += x;6 13參考答案:1 int func(int x, int y)2 3 int z = x*y ;4if ( x<=-100 ) 5if ( y>x ) 6z = x+y ;7else 8z = x-y ;9 else if ( x>=16 )10 z = x &y ;11return z;12 14參考答案:(1)每個入口參數都要按4字節邊界對齊,因此,參數x、y和k入棧時都占4個字節。1 movw 8(%ebp), %bx/RbxMRebp+8,將x送BX2 movw 12(%ebp), %si/RsiMRebp+12,將

17、y送SI3 movw16(%ebp), %cx/RcxMRebp+16,將k送CX4 .L1:5 movw %si, %dx/RdxRsi,將y送DX6 movw %dx, %ax/RaxRdx,將y送AX7 sarw $15, %dx/RdxRdx>>15,將y的符號擴展16位送DX8 idiv %cx/RdxRdx-ax÷Rcx的余數,將y%k送DX/RaxRdx-ax÷Rcx的商,將y/k送AX9 imulw %dx, %bx/RbxRbx*Rdx,將x*(y%k) 送BX10 decw %cx/RcxRcx-1,將k-1 送CX11 testw %cx,

18、 %cx/Rcx and Rcx,得OF=CF=0,負數則SF=1,零則ZF=112 jle .L2/若k小于等于0,則轉.L213 cmpw %cx, %si/Rsi - Rcx,將y與k相減得到各標志14 jg .L1/若y大于k,則轉.L115 .L2:16 movswl %bx, %eax/ ReaxRbx,將x*(y%k) 送AX(2)被調用者保存寄存器有BX、SI,調用者保存寄存器有AX、CX和DX。在該函數過程體前面的準備階段,被調用者保存的寄存器EBX和ESI必須保存到棧中。(3)因為執行第8行除法指令前必須先將被除數擴展為32位,而這里是帶符號數除法,因此,采用算術右移以擴展

19、16位符號,放在高16位的DX中,低16位在AX中。15參考答案: 1 int f1(unsigned x)2 3 int y = 0 ;4while ( x!=0 ) 5y =x ;6 x>>=1 ;7 8return y&0x1 ;9 函數f1的功能返回:( x x>>1 x>>2 .) & 0x1,因此f1用于檢測x的奇偶性,當x中有奇數個1,則返回為1,否則返回0。16參考答案: 函數sw只有一個入口參數x,根據匯編代碼的第25行指令知,當x+3>7時轉標號.L7處執行,否則,按照跳轉表中的地址轉移執行,x與跳轉目標處標號的關系

20、如下: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:.L7x+3=7:.L6由此可知,switch (x) 中省略的處理部分結構如下: case -2:case -1:/ .L2標號處指令序列對應的語句break; case 0: / .L3標號處指令序列對應的語句break;case 1:./ .L4標號處指令序列對應的語句break;case 2: / .L5標號處指令序列對應的語句break;case 4:/ .L6標號處指令序列對應的語句break; default:/ .L7標號處指令序列對應的語句

21、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);18參考答案:每次執行pushl指令后,Resp=Resp-4,因此,第2行指令執行后Resp=0xbc00001c。 (1)執行第3行指令后,Rebp=Resp=0xbc00001c。到第12條

22、指令執行結束都沒有改變EBP的內容,因而執行第10行指令后,EBP的內容還是為0xbc00001c。執行第13行指令后,EBP的內容恢復為進入函數funct時的值0xbc000030。 (2)執行第3行指令后,Resp=0xbc00001c。執行第4行指令后Resp= Resp-40=0xbc00001c-0x28=0xbbfffff4。因而執行第10行指令后,未跳轉到scanf函數執行時,ESP中的內容為0xbbfffff4-4=0xbbfffff0;在從scanf函數返回后ESP中的內容為0xbbfffff4。執行第13行指令后,ESP的內容恢復為進入函數funct時的舊值,即Resp=0

23、xbc000020。 (3)第5、6兩行指令將scanf的第三個參數&y入棧,入棧的內容為Rebp-8=0xbc000014;第7、8兩行指令將scanf的第二個參數&x入棧,入棧的內容為Rebp-4=0xbc000018。故x和y所在的地址分別為0xbc000018和0xbc000014。ESP從scanf返回的地址0xbc00001c0xbc000030y=20 x=15EBP0xbc0000180xbc0000140xbc0000100xbc00000c0xbc0000080xbc0000040xbc0000000xbbfffffc0xbbfffff80xbbfffff4

24、0xbbfffff00xbc0000140xbc0000180x804c000棧幀底部 (4)執行第10行指令后,funct棧幀的地址范圍及其內容如下:19參考答案:第1行匯編指令說明參數x存放在EBX中,根據第4行判斷x=0則轉.L2,否則繼續執行第510行指令。根據第5、6、7行指令可知,入棧參數nx的計算公式為x>>1;根據第9、10、11行指令可知,返回值為(x&1)+rv。由此推斷出C缺失部分如下:1int refunc(unsigned x) 2if ( x=0 )3return 0 ;4unsigned nx = x>>1 ;5int rv = r

25、efunc(nx) ;6return (x & 0x1) + rv ; 7該函數的功能為計算x的各個數位中1的個數。20參考答案: 在IA-32中,GCC為數據類型long double型變量分配12字節空間,實際上只占用10個字節。數組元素大?。˙)數組大?。˙)起始地址元素i的地址char A10110&A0&A0+iint B1004400&B0&B0+4ishort *C5420&C0&C0+4ishort *D6424&D0&D0+4ilong double E1012120&E0&E0+12il

26、ong double *F10440&F0&F0+4i21參考答案:表達式類型值匯編代碼Sshort *ASleal (%edx), %eax S+ishort *AS+2*ileal (%edx, %ecx, 2), %eax SishortMAS+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, %eax S4

27、*i+4shortMAS+2*(4*i+4)movw 8(%edx, %ecx, 8), %ax *(S+i-2)shortMAS+2*(i-2)movw -4(%edx, %ecx, 2), %ax 22參考答案:根據匯編指令功能可以推斷最終在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。

28、24參考答案:(1)常數M=76/4=19,存放在EDI中,變量j存放在ECX中。(2)上述優化匯編代碼對應的函數trans_matrix的C代碼如下:1void trans_matrix(int aMM) 2int i, j, t, *p;3int c=(M<<2);3for (i = 0; i < M; i+) 4p=&a0i;5for (j = 0; j < M; j+) 6t=*p;7*p = aij;8aij = t;9p += c;10111225參考答案:(1)node所需存儲空間需要4+(4+4)+4=16字節。成員p、s.x、s.y和next的

29、偏移地址分別為0、4、8和12。 (2)np_init中缺失的表達式如下:void np_init(struct node *np)np->s.x = np->s.y ;np->p = &(np->s.x) ;np->next= np ;26參考答案:表達式EXPRTYPE類型匯編指令序列uptr->s1.xintmovl (%eax), %eaxmovl %eax, (%edx)uptr->s1.yshortmovw 4(%eax), %axmovw %ax, (%edx)&uptr->s1.zshort *leal 6(%ea

30、x), %eaxmovw %eax, (%edx)uptr->s2.ashort *movl %eax, (%edx)uptr->s2.auptr->s2.bshortmovl 4(%eax), %ecxmovl (%eax, %ecx, 2), %eaxmovl %eax, (%edx) *uptr->s2.pcharmovl 8(%eax), %eaxmovb (%eax), %almovb %al, (%edx) 27參考答案:(1)S1: s c i d 0 248 總共12字節,按4字節邊界對齊(2)S2: i s c d 0 467 總共8字節,按4字節邊界

31、對齊(3)S3: c s i d 0 248 總共12字節,按4字節邊界對齊(4)S4: s c 0 6 總共8字節,按2字節邊界對齊(5)S5: c s i de 0 4812 16總共24字節,按4字節邊界對齊(Linux下double型按4字節對齊)(6)S6: c sd 0 36 40總共44字節,按4字節邊界對齊28參考答案:Windows平臺要求不同的基本類型按照其數據長度進行對齊。每個成員的偏移量如下:c d i s p l g v0 8 16 20 24 2832 40結構總大小為48字節,因為其中的d和g必須是按8字節邊界對齊,所以,必須在末尾再加上4個字節,即44+4=48

32、字節。變量長度按照從大到小順序排列,可以使得結構所占空間最小,因此調整順序后的結構定義如下:struct doubled;long long g;inti;char*p;longl;void*v;shorts;charc; test;d g i p l v s c0 8 16 20 24 2832 34 結構總大小為34+6=40字節。29參考答案: (1)執行第7行和第10行指令后棧中的信息存放情況如下圖所示。其中gets函數的入口參數為buf數組首地址,應等于getline函數的棧幀底部指針EBP的內容減0x14,而getline函數的棧幀底部指針EBP的內容應等于執行完getline中第

33、2行指令(push %ebp)后ESP的內容,此時,Resp= =0xbffc07f0-4=0xbffc07ec,故buf數組首地址為Rebp-0x14= Resp-0x14=0xbffc07ec-0x14=0xbffc07d8。a) 執行第7行后的棧ESPEBPEBP在P中舊值08 04 85 c8返回P的地址bf fc 08 0000 00 00 0800 00 00 1000 00 00 05被調用者保存寄存器在P中的舊值buf7 buf4buf3 buf0b) 執行第10行后的棧ESPEBPEBP在P中舊值08 41 39 38返回P的地址37 36 35 3433 32 31 304

34、6 45 44 4342 41 39 38 被調用者保存寄存器在P中的舊值buf7 buf4buf3 buf033 32 31 3037 36 35 34gets入口參數bf fc 07 d8(2)當執行到getline的ret指令時,假如程序不發生段錯誤,則正確的返回地址應該是0x80485c8,發生段錯誤是因為執行getline的ret指令時得到的返回地址為0x8413938,這個地址所在存儲段可能是不可執行的數據段,因而發生了段錯誤(segmentation fault)。(3)執行完第10行匯編指令后,被調用者保存寄存器EBX、ESI和EDI在P中的內容已被破壞,同時還破壞了EBP在P

35、中的內容。(4)getline的C代碼中malloc函數的參數應該為strlen(buf)+1,此外,應該檢查malloc函數的返回值是否為NULL。30參考答案: x86-64過程調用時參數傳遞是通過通用寄存器進行的,前三個參數所用寄存器順序為RDI、RSI、RDX。abc的4種合理的函數原型為: viod abc(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

36、); 根據第3、4行指令可知,參數b肯定指向一個32位帶符號整數類型;根據第5行指令可知,參數a指向64位帶符號整數類型;而參數c可以是32位,也可以是64位,因為*b為32位,所以取RDI中的低32位Redi(截斷為32位),再和*b相加。同時,參數c可以是帶符號整數類型,也可以是無符號整數類型,因為第2行加法指令addl的執行結果對于帶符號整數和無符號整數都一樣。31參考答案:(1)匯編指令注釋如下:1movl8(%ebp), %edx/RedxMRebp+8,將x送EDX2movl12(%ebp), %ecx/RecxMRebp+12,將k送ECX3movl$255, %esi/Resi255,將255送ESI4movl$-2147483648, %edi/Redi-2147483648,將0x80000000送EDI5 .L3:6movl%edi, %eax/ReaxRedi,將i送EAX7andl%edx, %eax/ReaxReax and Redx,將i a

溫馨提示

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

評論

0/150

提交評論