freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

深入理解計算機系統(tǒng)第二版資料家庭作業(yè)答案(編輯修改稿)

2025-07-17 02:20 本頁面
 

【文章內容簡介】 loat_i2f(x)。floatff =(float)x。if(!is_float_equal(fb,ff)){printf(error in %d:%x %x\n,x,fb,f2u(ff))。return。}x++。}while(x!=0)。printf(Test OK\n)。}無恥地使用了循環(huán)。我也是一點一點測試修改,才通過的。不過好在大方向都知道,所以沒有花多少時間,主要糾結點還是在舍入那塊。需要特別注意。intfloat_f2i(float_bits f){unsigned sign = f31。intexp =(f23)amp。0xFF。intfrac =(famp。0x7FFFFF)|(123)。exp=127。if(exp0)return0。if(exp=31)return0x80000000。//絕對值不大于2^31(131)if(exp23)frac=(exp23)。elsefrac=(23exp)。returnsign?frac : frac。}voidtest2(){intx =0。do{intm =float_f2i(x)。intn =(int)u2f(x)。if(m!= n){printf(error in %x:%d %d\n,x,m,n)。return。}x++。}while(x!=0)。printf(Test OK\n)。}在exp0和=31上犯了小錯誤。開始寫成=0和=32了。其實1這個整數(shù)就是exp==0的。而int絕對值不會超過2^311,..小數(shù)點右移不會到超過30次(否則就越界了),所以exp=30。而這里剛好用TMin來表示越界,因此不用關心TMin的表示。深入理解計算機系統(tǒng)(第二版) 家庭作業(yè) 第三章 intdecode2(intx,inty,intz){intret。z= y。//line 2ret = z。//line 3ret=15。//line 4ret=15。//line 5returnret*(z^x)。}大概算法如下:x的高32位為xh,低32位為xl。y的符號位擴展成32位之后為ys(ys為0或者1)。dest_h = (xl*ys)_l + (xh*y)_l + (xl*y)_hdest_l = (xl*y)_l注意,所有的乘法都是unsigned*unsigned。也就是說對于 1*(1),如果存入兩個寄存器中,那么高32位是0,低32位是1。相當于 1*(UNSIGNED_MAX)。注意n在這里是一個很小的數(shù),用8位就能表示,也可以用n=n%256表示。寄存器 變量esi xebx nedi resultedx maskintloop(intx,intn){intresult =1431655765。intmask。for(mask =131。mask!=0。mask =((unsigned)mask)n){result^=(maskamp。x)。}returnresult。}xp?*xp:0這個語句是不能被編譯成條件傳送語句的。因為如果是條件傳送語句,那么不論xp為什么,*xp都會被計算。我們要寫一個和該功能完全一樣的能編譯成條件傳送語句的函數(shù)。于是,我們要想辦法不使用*xp,而使用一個替代的指向0的非空指針。intcread_alt(int*xp){intt =0。int*p = xp?xp:amp。t。return*p。}MODE_A: result =*p1。*p1 =*p2。break。MODE_B: result =*p1+*p2。*p2 = result。break。MODE_C: result =*p1。*p2 =15。break。MODE_D:*p2 =*p1。MODE_E: result =17。break。default: result =1。break。intswitch_prob(intx,intn){intresult = x。switch(n){case0x28:case0x2a:result=3。break。case0x2b:result=3。break。case0x2c:result=3。result= x。case0x2d:result*= result。case0x29://也可以不要default:result+=0x11。}returnresult。}中間有一句話沒明白,匯編第12行 lea 0x0(%esi), %esi對于A[R][S][T],A[i][j][k] 的位置是 A(,i*S*T+j*T+k,4)。由匯編代碼可知:S*T = 63。T = 9。R*S*T = 2772/4。所以得 R=11, S=7, T=9。感覺可以用j,而不是比較j和n。intvar_prod_ele(intn,intA[n][n],intB[n][n],inti,intk){intj = n1。intresult =0。for(。j!=1。j)result+= A[i][j]*B[j][k]。returnresult。}但是這樣得到的結果仍然會使用到存儲器。按下面的代碼,循環(huán)里面貌似就沒有用到存儲器。但是用到了一個常量4,就是增加a的時候,會add 4。只需要result,a,e,b,4n這五個變量。intvar_prod_ele(intn,intA[n][n],intB[n][n],inti,intk){intresult =0。int*a =amp。A[i][0]。int*b =amp。B[0][k]。int*e =amp。A[i][n]。for(。a!=e。){result+=*a**b。b+=n。a++。}returnresult。}下面是其匯編代碼的循環(huán)部分:edi是4*n,ebx和edx分別是b和a,esi是e,eax是result。ecx是用于存儲乘法的寄存器。L4:movl(%ebx), %ecximull(%edx), %ecxaddl%ecx, %eaxaddl%edi, %ebxaddl$4, %edxcmpl%edx, %esijneL4我怎么感覺前面那個程序,編譯器應該也會自動優(yōu)化。M = 76/4 = 19。i在edi中,j在ecx中。inttranspose(intM,intA[M][M]){inti,j。 for(i=0。iM。++i){int*a =amp。A[i][0]。int*b =amp。A[0][i]。for(j=0。ji。++j){intt =*a。*a =*b。*b = t。++a。b+= M。}}}E1(n)在esi中,esi = 3n。E2(n)在ebx中,ebx = 4*E2(n) = 4*(2n1)。所以E2(n) = 2n1。這道題比較考驗對知識的拓展應用能力。根據簡單的推測,我們可以知道,imull的兩個對象是 ebx和edx,最后edx移動到了(eax)中,所以ebx和edx一個是 *,并且word_sum的12行的eax是result的prod的地址,也就是result的地址。而eax只在第5行賦值,所以result的地址是在8(%ebp)中的。也就是說,結構體返回值實際上是利用類似參數(shù)的變量進行傳入(在8(%ebp)),而傳入的是返回結構體變量的地址。所以:A.8(%ebp)為result的地址。12(%ebp)。16(%ebp)。,分配的20個字節(jié)用黃底展示(每一行為4個字節(jié))yx返回地址保存的ebp(也是當前ebp的指向)amp。s2 (word_sum的返回值地址)在匯編中,沒懂word_sum 15: ret $4以及diff 12: subl $4, %esp的意義何在。可能是為了清除那個result的返回地址。C.傳遞結構體參數(shù)就像正常的傳值。結構體的每一個變量可以看做是單獨的參數(shù)進行傳入。D.返回結構體的通用策略:將返回變量的地址看做第一個參數(shù)傳入函數(shù)。而不是在函數(shù)中分配棧空間給一個臨時變量,因為eax確實存不下一個結構體,eax充當返回變量的指針的角色。B取四的倍數(shù)的上整數(shù) = 8。8+4+ (B*2)取四的倍數(shù)的上整數(shù) = 28。所以B的可選值為8和7。2*A*B取四的上整數(shù)為44,所以A*B的可選值為21和22。所以 A=3, B=7。我們用結構體A表示a_struct。首先,根據第11和12行,可以得到 CNT*size(A) = 196。根據13行,知道 ecx + 4*edx + 8為 apx[apidx]的地址。ecx存儲的是bp(地址)。ap的地址是 bp + 4 + i*size(A)我們知道,apx[0] 的地址是 bp + 4 + i*size(A) + pos(x),pos(x)為結構體A中x的偏移。那么apx[apidx] 的地址是 bp + 4 + i*size(A) + pos(x) +4*(apidx)。所以 4*edx + 8 = 4 + i*size(A) + pos(x) + 4*(apidx)。所以,不難猜測,pos(x)=4,也就是說,在A中,首先是idx,再是x數(shù)組。那么,我們看apidx在哪里計算過。到第10行,edx的結果是 7i + bp[4 + 28*i],bp[4 + 28*i]是什么呢?它很可能是bp中的a[i]的首地址。我們先這樣猜測,于是size(A) = 28,并且bp[4+28*i]的值為apidx。另一方面:4*edx = 28*i + 4*bp[4+28*i] = i*size(A) + 4*(apidx)。所以,我們的猜想是正確的。因此,size(A) = 28,里面包含了一個int idx和一個數(shù)組int x[6]。總共有多少個A呢?CNT = 196/size(A) = 7。A.: 0: 4: 0: 4B.總共需要8個字節(jié)。C.不難知道,賦值前后都應該是整數(shù)。edx就是參數(shù)up(一個指針)。最后結果是用eax (edx)得到的,說明(edx)是整數(shù),即up___ 為整數(shù)。再看看之前的eax,eax是由(eax)所得,說明到第3行后,eax是個指針。它是由(ecx)得到的,說明ecx在第二行
點擊復制文檔內容
電大資料相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1