版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
..深入理解計(jì)算機(jī)系統(tǒng)<第二版>家庭作業(yè)第二章深入理解計(jì)算機(jī)系統(tǒng)二進(jìn)制2.55-2.57
略2.58intis_little_endian<>{
int
a=
1;
return
*<<char*>&a>;
}2.59<x&0xFF>|<y&~0xFF>2.60unsignedreplace_byte<unsigned
x,
unsignedchar
b,
int
i>{
return
<x
&
~<0xFF<<<i<<3>>>
|
<b
<<
<i<<3>>;
}2.61A.!~xB.!xC.!~<x>><<sizeof<int>-1><<3>>D.!<x&0xFF>注意,英文版中C是最低字節(jié),D是最高字節(jié)。中文版恰好反過來了。這里是按中文版來做的。2.62這里我感覺應(yīng)該是英文版對的,int_shifts_are_arithmetic<>intint_shifts_are_arithmetic<>{
int
x=
-1;
return
<x>>1>
==
-1;
}2.63對于sra,主要的工作是將xrsl的第w-k-1位擴(kuò)展到前面的高位。這個可以利用取反加1來實(shí)現(xiàn),不過這里的加1是加1<<<w-k-1>。如果x的第w-k-1位為0,取反加1后,前面位全為0,如果為1,取反加1后就全是1。最后再使用相應(yīng)的掩碼得到結(jié)果。對于srl,注意工作就是將前面的高位清0,即xsra&<1<<<w-k>-1>。額外注意k==0時,不能使用1<<<w-k>,于是改用2<<<w-k-1>。intsra<int
x,
int
k>{
int
xsrl=
<unsigned>
x
>>
k;
int
w=
sizeof<int><<3;
unsignedz=
1
<<
<w-k-1>;
unsignedmask=z
-
1;
unsignedright=mask
&
xsrl;
unsignedleft=
~mask
&
<~<z&xsrl>
+
z>;
return
left
|
right;
}
intsrl<unsignedx,
int
k>{
int
xsra=
<int>
x
>>
k;
int
w=
sizeof<int>*8;
unsignedz=
2
<<
<w-k-1>;
return
<z
-
1>
&
xsra;
}2.64intany_even_one<unsignedx>{
return
!!<x
&
<0x55555555>>;
}2.65inteven_ones<unsignedx>{
x
^=
<x>>
16>;
x
^=
<x>>
8>;
x
^=
<x>>
4>;
x
^=
<x>>
2>;
x
^=
<x>>
1>;
return
!<x&1>;
}
x的每個位進(jìn)行異或,如果為0就說明是偶數(shù)個1,如果為1就是奇數(shù)個1。那么可以想到折半縮小規(guī)模。最后一句也可以是return<x^1>&12.66根據(jù)提示想到利用或運(yùn)算,將最高位的1或到比它低的每一位上,忽然想如果x就是10000000..該如何讓每一位都為1。于是便想到了二進(jìn)擴(kuò)展。先是x右移1位再和原x進(jìn)行或,變成1100000...,再讓結(jié)果右移2位和原結(jié)果或,變成11110000...,最后到16位,變成11111111...。intleftmost_one<unsignedx>{
x
|=
<x
>>
1>;
x
|=
<x
>>
2>;
x
|=
<x
>>
4>;
x
|=
<x
>>
8>;
x
|=
<x
>>
16>;
return
x^<x>>1>;
}2.67A.32位機(jī)器上沒有定義移位32次。B.beyond_msb變?yōu)?<<31。C.定義a=1<<15;a<<=15;set_msb=a<<1;beyond_msb=a<<2;2.68感覺中文版有點(diǎn)問題,注釋和函數(shù)有點(diǎn)對應(yīng)不上,于是用英文版的了。個人猜想應(yīng)該是讓x的最低n位變1。intlower_one_mask<int
n>{
return
<2<<<n-1>>
-
1;
}2.69unsigned
rotate_right<unsignedx,
int
n>{
int
w=
sizeof<unsigned>*8;
return
<x>>n>
|
<x<<<w-n-1><<1>;
}2.70這一題是看x的值是否在-2^<n-1>到2^<n-1>-1之間。如果x滿足這個條件,則其第n-1位就是符號位。如果該位為0,則前面的w-n位均為0,如果該位為1,則前面的w-n位均為1。所以本質(zhì)是判斷,x的高w-n+1位是否為0或者為-1。intfits_bits<int
x,
int
n>{
x
>>=
<n-1>;
return
!x
||
!<~x>;
}2.71A.得到的結(jié)果是unsigned,而并非擴(kuò)展為signed的結(jié)果。B.使用int,將待抽取字節(jié)左移到最高字節(jié),再右移到最低字節(jié)即可。intxbyte<unsignedword,
int
bytenum>{
int
ret=word
<<
<<3
-
bytenum><<3>;
return
ret
>>
24;
}2.72A.size_t是無符號整數(shù),因此左邊都會先轉(zhuǎn)換為無符號整數(shù),它肯定是大于等于0的。B.判斷條件改為if<maxbytes>0&&maxbytes>=sizeof<val>>2.73請先參考2.74題。可知:t=a+b時,如果a,b異號〔或者存在0,則肯定不會溢出。如果a,b均大于等于0,則t<0就是正溢出,如果a,b均小于0,則t>=0就是負(fù)溢出。于是,可以利用三個變量來表示是正溢出,負(fù)溢出還是無溢出。intsaturating_add<int
x,
int
y>{
int
w=
sizeof<int><<3;
int
t=x
+
y;
int
ans=x
+
y;
x>>=<w-1>;
y>>=<w-1>;
t>>=<w-1>;
int
pos_ovf=
~x&~y&t;
int
neg_ovf=x&y&~t;
int
novf=
~<pos_ovf|neg_ovf>;
return
<pos_ovf&INT_MAX>
|
<novf&ans>
|
<neg_ovf&INT_MIN>;
}2.74對于有符號整數(shù)相減,溢出的規(guī)則可以總結(jié)為:t=a-b;如果a,b同號,則肯定不會溢出。如果a>=0&&b<0,則只有當(dāng)t<=0時才算溢出。如果a<0&&b>=0,則只有當(dāng)t>=0時才算溢出。不過,上述t肯定不會等于0,因?yàn)楫?dāng)a,b不同號時:1>a!=b,因此a-b不會等于0。2>a-b<=abs<a>+abs<b><=abs<TMax>+abs<TMin>=<2^w-1>所以,a,b異號,t,b同號即可判定為溢出。inttsub_ovf<int
x,
int
y>{
int
w=
sizeof<int><<3;
int
t=x
-
y;
x>>=<w-1>;
y>>=<w-1>;
t>>=<w-1>;
return
<x
!=y>&&<y==t>;
}順便整理一下匯編中CF,OF的設(shè)定規(guī)則<個人總結(jié),如有不對之處,歡迎指正>。t=a+b;CF:<unsignedt><<unsigneda>進(jìn)位標(biāo)志OF:<a<0==b<0>&&<t<0!=a<0>t=a-b;CF:<a<0&&b>=0>||<<a<0==b<0>&&t<0>退位標(biāo)志OF:<a<0!=b<0>&&<b<0==t<0>匯編中,無符號和有符號運(yùn)算對條件碼〔標(biāo)志位的設(shè)定應(yīng)該是相同的,但是對于無符號比較和有符號比較,其返回值是根據(jù)不同的標(biāo)志位進(jìn)行的。詳情可以參考第三章節(jié)。2.75根據(jù)2-18,不難推導(dǎo),<x'*y'>_h=<x*y>_h+x<w-1>*y+y<w-1>*x。unsigned
unsigned_high_prod<unsignedx,
unsignedy>{
int
w=
sizeof<int><<3;
returnsigned_high_prod<x,
y>
+
<x>><w-1>>*y
+
x*<y>><w-1>>;
}當(dāng)然,這里用了乘法,不屬于整數(shù)位級編碼規(guī)則,聰明的辦法是使用int進(jìn)行移位,并使用與運(yùn)算。即<<int>x>><w-1>>&y和<<int>y>><w-1>>&x。注:不使用longlong來實(shí)現(xiàn)signed_high_prod<intx,inty>是一件比較復(fù)雜的工作,而且我不會只使用整數(shù)位級編碼規(guī)則來實(shí)現(xiàn),因?yàn)樾枰褂醚h(huán)和條件判斷。下面的代碼是計(jì)算兩個整數(shù)相乘得到的高位和低位。intuadd_ok<unsignedx,
unsignedy>{
return
x
+
y
>=x;
}voidsigned_prod_result<int
x,
int
y,
int
&h,
int
&l>{
int
w=
sizeof<int><<3;
h=
0;
l=
<y&1>?x:0;
for<int
i=1;
i<w;
i++>{
if<
<y>>i>&1
>
{
h
+=
<unsigned>x>><w-i>;
if<!uadd_ok<l,
x<<i>>
h++;
l
+=
<x<<i>;
}
}
h=h
+
<<x>><w-1>>*y>
+
<<y>><w-1>>*x>;
}最后一步計(jì)算之前的h即為unsigned相乘得到的高位。sign_h=unsign_h-<<x>><w-1>>&y>-<<y>><w-1>>&x>;sign_h=unsign_h+<<x>><w-1>>*y>+<<y>><w-1>>*x>;2.76A.K=5:<x<<2>+xB.K=9:<x<<3>+xC.K=30:<x<<5>-<x<<1>D.K=-56:<x<<3>-<x<<6>2.77先計(jì)算x>>k,再考慮舍入。舍入的條件是x<0&&x的最后k位不為0。intdivide_power2<int
x,
int
k>{
int
ans=x>>k;
int
w=
sizeof<int><<3;
ans
+=
<x>><w-1>>
&&
<x&<<1<<k>-1>>;
return
ans;
}
2.78這相當(dāng)于計(jì)算<<x<<2>+x>>>3,當(dāng)然,需要考慮x為負(fù)數(shù)時的舍入。先看上述表達(dá)式,假設(shè)x的位模式為[b<w-1>,b<w-2>,...,b<0>],那么我們需要計(jì)算:[b<w-1>,b<w-2>,b<w-3>,
...
,b<0>,
0,
0]+
[b<w-1>,b<w-2>,...,b<2>,
b<1>,b<0>]最后需要右移3位。因此我們可以忽略下方的b<1>,b<0>。于是就計(jì)算<x>>2>+x,再右移一位即是所求答案。不過考慮到<x>>2>+x可能也會溢出,于是就計(jì)算<x>>3>+<x>>1>,這個顯然是不會溢出的。再看看b<0>+b<2>會不會產(chǎn)生進(jìn)位,如果產(chǎn)生進(jìn)位,則再加一。最后考慮負(fù)數(shù)的舍入。負(fù)數(shù)向0舍入的條件是x<0&&<<x<<2>+x的后三位不全為0>。滿足舍入條件的話,結(jié)果再加1。容易證明,加法后三位不全為0可以等價為x后三位不全為0。intmul5div8<int
x>{
int
b0=x&1,
b2=
<x>>2>&1;
int
ans=
<x>>3>
+
<x>>1>;
int
w=
sizeof<int><<3;
ans
+=
<b0&b2>;
ans
+=
<<x>><w-1>>
&&
<x&7>>;
return
ans;
}
2.79不懂題意,感覺就是2.78。2.80A.1[w-n]0[n]:
~<<1<<n>-1>B.0[w-n-m]1[n]0[m]:<<1<<n>-1><<m2.81A.false,當(dāng)x=0,y=TMin時,x>y,而-y依然是Tmin,所以-x>-y。B.true,補(bǔ)碼的加減乘和順序無關(guān)〔如果是右移,則可能不同。C.false,當(dāng)x=-1,y=1時,~x+~y=0xFFFFFFFE,而~<x+y>==0xFFFFFFFF。D.true,無符號和有符號數(shù)的位級表示是相同的。E.true,最后一個bit清0,對于偶數(shù)是不變的,對于奇數(shù)相當(dāng)于-1,而TMin是偶數(shù),因此該減法不存在溢出情況。所以左邊總是<=x。2.82A.令x為無窮序列表示的值,可以得到x*2^k=Y+x。所以x=Y/<2^k-1>。B.<a>1/7,<b>9/15=3/5,<c>7/63=1/92.83浮點(diǎn)數(shù)的一個特點(diǎn)就是,如果大于0,則可以按unsigned位表示的大小排序。如果小于0則相反。注意都為0的情況即可。所以條件是:<<ux<<1>==0&&<uy<<1>==0>||
<!sx&&sy>||
<!sx&&!sy&&ux>=uy>||<sx&&sy&&ux<=uy>;2.84A.5.0,5表示為101,因此位數(shù)M就是1.01為1.25,小數(shù)f為0.01=0.25。指數(shù)部分應(yīng)該為E=2,所以其指數(shù)部分位表示為e=<2^<k-1>-1>+2=2^<k-1>+1。位表示三個部分分別是s-e-f,為0-10..01-0100..0。B.能被準(zhǔn)確描述的最大奇數(shù),那么其M=1.111..1,故f部分全為1,E應(yīng)該為n。當(dāng)然,這個假設(shè)在2^<k-1>>=n的情況下才能成立。這時,s=0,e=n+2^<k-1>-1,f=11...1。值為2^<n+1>-1。C.最小的規(guī)格化數(shù)為2^<1-bias>即2^<-2^<k-1>+2>,所以其倒數(shù)值V為2^<2^<k-1>-2>,所以M為1.00000,f部分為全0,E=2^<k-1>-2,e部分為2^<k-1>-2+bias=2^k-3,即為11..101。位表示為0-11..101-00..0。2.85描述擴(kuò)展精度值十進(jìn)制最小的正非規(guī)格化數(shù)2^<-63>*2^<-2^14+2>3.6452e-4951最小的正規(guī)格化數(shù)2^<-2^14+2>3.3621e-4932最大的規(guī)格化數(shù)<2^64-1>*2^<2^14-1-63>1.1897e+49322.86描述HexMEV-00x80000-62--最小的值>10x3F01257/2560257*2^<-8>2560x470018--最大的非規(guī)格化數(shù)0x00FF255/256-62255*2^<-70>-inf0xFF00------Hex為0x3AA00x3AA0416/256-5416*2^〔-13=13*2^<-8>2.87格式A格式B位值位值101110001-9/16101100010-9/16010110101208011101010208100111110-7/1024100000111-7/10240000001016/2^170000000000111011000-4096111110000-inf011000100768011110000inf沒有特別明白轉(zhuǎn)換成最接近的,然后又說向+inf舍入的含義。按理說,舍入到+inf就是向上舍入,而并不是找到最接近的。表格中是按最接近的進(jìn)行舍入,并且如果超出范圍則認(rèn)為是inf。如果都按+inf進(jìn)行舍入,那么第四行格式B將是000000001。2.88A.false,float只能精確表示最高位1和最低位的1的位數(shù)之差小于24的整數(shù)。所以當(dāng)x==TMAX時,用float就無法精確表示,但double是可以精確表示所有32位整數(shù)的。B.false,當(dāng)x+y越界時,左邊不會越界,而右邊會越界。C.true,double可以精確表示所有正負(fù)2^53以內(nèi)的所有整數(shù)。所以三個數(shù)相加可以精確表示。D.false,double無法精確表示2^64以內(nèi)所有的數(shù),所以該表達(dá)式很有可能不會相等。雖然舉例子會比較復(fù)雜,但可以考慮比較大的值。E.false,0/0.0為NaN,<非0>/0.0為正負(fù)inf。同號inf相減為NaN,異號inf相減也為被減數(shù)的inf。2.89float的k=8,n=23。bias=2^7-1=127。最小的正非規(guī)格化數(shù)為2^<1-bias-n>=2^-149。最小的規(guī)格化數(shù)為2^<0-bias>*2=2^-126。最大的規(guī)格化數(shù)〔二的冪為2^<2^8-2-bias>=2^127。因此按各種情況把區(qū)間分為[TMin,-148][-149,-125][-126,127][128,TMax]。floatfpwr2<int
x>
{
/*Resultexponentandfraction*/
unsignedexp,
frac;
unsignedu;
if
<x
<-149>
{
/*Toosmall.Return0.0*/
exp=
0;
frac=
0;
}
elseif
<x
<
-126>
{
/*Denormalizedresult*/
exp=
0;
frac=
1<<<x+149>;
}
elseif
<x
<
128>
{
/*Normalizedresult.*/
exp=x
+
127;
frac=
0;
}
else
{
/*Toobig.Return+oo*/
exp=
255;
frac=
0;
}
/*Packexpandfracinto32bits*/
u=exp
<<
23
|
frac;
/*Returnasfloat*/returnu2f<u>;
}2.90A.pi的二進(jìn)制數(shù)表示為:,E=128-127=1,它表示的二進(jìn)制小數(shù)值為:B.根據(jù)2.82,可知1/7的表示為0.001001[001]...,所以22/7為C.從第9位開始不同。為了方便測試,我寫了幾個公共函數(shù)。typedefunsignedfloat_bits;
floatu2f<unsignedx>{
return
*<<float*>&x>;
}
unsigned
f2u<float
f>{
return
*<<unsigned*>&f>;
}
boolis_float_equal<float_bitsf1,
float
f2>{
returnf2u<f2>
==f1;
}
boolis_nan<float_bitsfb>{
unsignedsign=fb>>31;
unsignedexp=
<fb>>23>
&
0xFF;
unsignedfrac=fb&0x7FFFFF;
return
exp==
0xFF
&&
frac
!=
0;
}
boolis_inf<float_bitsfb>{
unsignedsign=fb>>31;
unsignedexp=
<fb>>23>
&
0xFF;
unsignedfrac=fb&0x7FFFFF;
return
exp==
0xFF
&&
frac==
0;
}
inttestFun<
float_bits<*fun1><float_bits>,
float<*fun2><float>>{
unsignedx=
0;
do{
//testforall2^32value
float_bitsfb=
fun1<x>;
float
ff=
fun2<u2f<x>>;
if<!is_float_equal<fb,
ff>>{
printf<"%xerror\n",
x>;
return0;
}
x++;
}while<x!=0>;
printf<"TestOK\n">;return1;
}最后的testFun是用來測試fun1和fun2是否對每種可能的輸入都輸出相同的值,fun1為題中所要求的函數(shù),fun2為float版本。這個函數(shù)大概會運(yùn)行2到3分鐘,也可以寫多線程,利用多核處理器求解。2.91float_bits
float_absval<float_bitsf>{
if<is_nan<f>>
return
f;
elsereturn
f
&
0x7FFFFFFF;
}
floatfloat_absval_f<float
f>{
if<is_nan<f2u<f>>>
return
f;
elsereturnfabs<f>;
}測試即調(diào)用testFun<float_absval,float_absval_f>;在測試的時候發(fā)現(xiàn)0x7F800001的時候不對了。后來debug了一下,發(fā)現(xiàn)u2f的時候,會篡改原值。即令x=0x7F800001。則f2u<u2f<x>>會變成0x7FC00001。奇怪的nan,第22位一定是1。我將f2u和u2f里用memcpy也同樣是不行。所以,我將testFun中的一個條件變成了:if<!is_float_equal<fb,ff>&&
!is_nan<fb>>這個bug實(shí)在是不知道怎么回事。想了想,這和高位低位排列是無關(guān)的。這個bug還是之后再找吧。也有可能是硬件本身的原因了。注:C庫中也提供了isnan<>函數(shù)。2.92float_bits
float_negate<float_bitsf>{
if<is_nan<f>>
return
f;
elsereturn
f^0x80000000;
}
floatfloat_negate_f<float
f>{
if<isnan<f>>
return
f;
return
-f;
}就是將最高位反位。2.93float_bits
float_half<float_bitsf>{
unsignedsign=f>>31;
unsignedexp=
<f>>23>
&
0xFF;
unsignedfrac=f&0x7FFFFF;
if<exp==
0>
return
sign<<31
|
<<frac>>1>
+
<<frac&1>&&<<frac>>1>&1>>>;
elseif<exp==
1>
return
sign<<31
|
<<
<1<<22>
|
<frac>>1>>
+
<<frac&1>&&<<frac>>1>&1>>>
;
elseif<exp
!=
255>
return
sign<<31
|<exp-1>
<<
23
|
frac;
elsereturn
f;
}
floatfloat_half_f<float
f>{
if<!isnan<f>>
return
<float>0.5*f;
elsereturn
f;
}需要注意的是,舍入采用的是向偶數(shù)舍入。這也是我在測試的過程中發(fā)現(xiàn)的?!埠冒?書上在浮點(diǎn)數(shù)位級編碼規(guī)則中說過了,眼殘沒看到最后,非規(guī)格化的平滑效果讓exp==1時的程序變得比較簡潔。2.94float_bits
float_twice<float_bitsf>{
unsignedsign=f>>31;
unsignedexp=
<f>>23>
&
0xFF;
unsignedfrac=f&0x7FFFFF;
if<exp==
0>
return
sign<<31
|
frac<<1;
elseif<exp
<
254>
return
sign<<31
|
<exp+1><<23
|
frac;
elseif<exp==
254>
return
sign<<31
|
0xFF<<23;
elsereturn
f;
}
floatfloat_twice_f<float
f>{
if<!isnan<f>>
return
<float>2*f;
elsereturn
f;
}比float_half簡單一些。對于非規(guī)格化的平滑,使用移位就可以了,對于規(guī)格化,只要exp+1即可,當(dāng)然,如果exp==254,就要返回inf了。2.95float_bits
float_i2f<int
i>
{
if<i==
0>
return0;
unsignedx=i>0?i:-i;
int
sign=i>0?0:1;
int
w=
sizeof<int><<3;
int
j;
for<j=w-1;
j>=0;
j-->{
//找到最高位if<
<x>>j>
&
1>
break;
}
unsignedbias=
127;
unsignedexp,
frac;
exp=bias
+
j;
if<j
<=
23>
frac=x<<<23-j>;
else
{
frac=x>><j-23>;
unsignedmask=
<1<<<j-23>>
-
1;
if<
<x&mask>
>
<1<<<j-24>>
>
frac++;
//需要舍入到大值elseif<
<x&mask>
==
1<<<j-24>
&&
<frac&1>>
frac++;
//舍入到偶數(shù)if<frac==
<1<<24>>
exp++;
//舍入到偶數(shù)超過<1<<24>-1,指數(shù)需要再加1
}
return
sign<<31
|
exp<<23
|
frac&0x7FFFFF;
}
voidtest<>{
int
x=
0;
do{
float_bitsfb=
float_i2f<x>;
float
ff=
<float>x;
if<!is_float_equal<fb,
ff>>{
printf<"errorin%d:
%x%x\n",
x,
fb,
f2u<ff>>;
return;
}
x++;
}while<x!=0>;
printf<"TestOK\n">;
}無恥地使用了循環(huán)。我也是一點(diǎn)一點(diǎn)測試修改,才通過的。不過好在大方向都知道,所以沒有花多少時間,主要糾結(jié)點(diǎn)還是在舍入那塊。需要特別注意。2.96intfloat_f2i<float_bitsf>{
unsignedsign=f>>31;
int
exp=
<f>>23>
&
0xFF;
int
frac=
<f&0x7FFFFF>
|
<1<<23>;
exp
-=
127;
if<exp
<
0>
return0;
if<exp
>=
31>
return0x80000000;
//絕對值不大于2^31〔1<<31if<exp
>
23>
frac
<<=
<exp
-
23>;
else
frac
>>=
<23
-
exp>;
return
sign?
-frac:frac;
}
voidtest2<>{
int
x=
0;
do{
int
m=
float_f2i<x>;
int
n=
<int>u2f<x>;
if<m
!=n>{
printf<"errorin%x:
%d%d\n",
x,
m,
n>;
return;
}
x++;
}while<x!=0>;
printf<"TestOK\n">;
}在exp<0和>=31上犯了小錯誤。開始寫成<=0和>=32了。其實(shí)1這個整數(shù)就是exp==0的。而int絕對值不會超過2^31-1,因此1.0000..小數(shù)點(diǎn)右移不會到超過30次〔否則就越界了,所以exp<=30。而這里剛好用TMin來表示越界,因此不用關(guān)心TMin的表示。深入理解計(jì)算機(jī)系統(tǒng)<第二版>家庭作業(yè)第三章3.54intdecode2<int
x,
int
y,
int
z>
{
int
ret;
z
-=y;
//line2
ret=z;
//line3
ret
<<=
15;//line4
ret
>>=
15;//line5return
ret*<z^x>;
}3.55大概算法如下:x的高32位為xh,低32位為xl。y的符號位擴(kuò)展成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。
相當(dāng)于1*<UNSIGNED_MAX>。3.56注意n在這里是一個很小的數(shù),用8位就能表示,也可以用n=n%256表示。寄存器變量esi
xebx
nedi
resultedx
maskintloop<int
x,
int
n>
{
int
result=
1431655765;
int
mask;
for<mask=
1<<31;
mask
!=
0;
mask=
<<unsigned>mask>>>n>{
result
^=
<mask
&
x>;
}
return
result;
}3.57xp?*xp:0這個語句是不能被編譯成條件傳送語句的。因?yàn)槿绻菞l件傳送語句,那么不論xp為什么,*xp都會被計(jì)算。我們要寫一個和該功能完全一樣的能編譯成條件傳送語句的函數(shù)。于是,我們要想辦法不使用*xp,而使用一個替代的指向0的非空指針。intcread_alt<int
*xp>
{
int
t=
0;
int
*p=xp?xp:&t;
return
*p;
}3.58MODE_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;3.59intswitch_prob<int
x,
int
n>
{
int
result=x;
switch<n>
{
case0x28:
case0x2a:
result
<<=
3;
break;
case0x2b:
result
>>=
3;
break;
case0x2c:
result
<<=
3;
result
-=x;
case0x2d:
result
*=result;
case0x29:
//也可以不要default:
result
+=
0x11;
}
return
result;
}中間有一句話沒明白,匯編第12行l(wèi)ea0x0<%esi>,%esi3.60對于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。3.61感覺可以用--j,而不是比較j和var_prod_ele<int
n,
int
A[n][n],
int
B[n][n],
int
i,
int
k>
{
int
j=n-1;
int
result=
0;
for<;
j!=-1;
--j>
result
+=A[i][j]
*
B[j][k];
return
result;
}但是這樣得到的結(jié)果仍然會使用到存儲器。按下面的代碼,循環(huán)里面貌似就沒有用到存儲器。但是用到了一個常量4,就是增加a的時候,會add4。只需要result,a,e,b,4n這五個變量。intvar_prod_ele<int
n,
int
A[n][n],
int
B[n][n],
int
i,
int
k>
{
int
result=
0;
int
*a=
&A[i][0];
int
*b=
&B[0][k];
int
*e=
&A[i][n];
for<;a!=e;>
{
result
+=
*a
*
*b;
b+=n;
a++;
}
return
result;
}下面是其匯編代碼的循環(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īng)該也會自動優(yōu)化。。。3.62M=76/4=19;i在edi中,j在ecx中;inttranspose<int
M,
int
A[M][M]>
{
int
i,j;
for<i=0;
i<M;
++i>
{
int
*a=
&A[i][0];
int
*b=
&A[0][i];
for<j=0;
j<i;
++j>
{
int
t=
*a;
*a=
*b;
*b=t;
++a;
b
+=M;
}
}
}3.63E1<n>在esi中,esi=3n。E2<n>在ebx中,ebx=4*E2<n>=4*<2n-1>。所以E2<n>=2n-1。3.64這道題比較考驗(yàn)對知識的拓展應(yīng)用能力。根據(jù)簡單的推測,我們可以知道,imull的兩個對象是ebx和edx,最后edx移動到了<eax>中,所以ebx和edx一個是*s1.p,一個是s1.v,并且word_sum的12行的eax是result的prod的地址,也就是result的地址。而eax只在第5行賦值,所以result的地址是在8<%ebp>中的。也就是說,結(jié)構(gòu)體返回值實(shí)際上是利用類似參數(shù)的變量進(jìn)行傳入〔在8<%ebp>,而傳入的是返回結(jié)構(gòu)體變量的地址。所以:A.
8<%ebp>為result的地址。12<%ebp>為s1.p。16<%ebp>為s1.v。B.棧中的內(nèi)容如下表,分配的20個字節(jié)用黃底展示〔每一行為4個字節(jié)yx返回地址保存的ebp〔也是當(dāng)前ebp的指向ds1.vs1.p&s2〔word_sum的返回值地址在匯編中,沒懂word_sum15:ret$4以及diff12:subl$4,%esp的意義何在??赡苁菫榱饲宄莻€result的返回地址。C.傳遞結(jié)構(gòu)體參數(shù)就像正常的傳值。結(jié)構(gòu)體的每一個變量可以看做是單獨(dú)的參數(shù)進(jìn)行傳入。D.返回結(jié)構(gòu)體的通用策略:將返回變量的地址看做第一個參數(shù)傳入函數(shù)。而不是在函數(shù)中分配??臻g給一個臨時變量,因?yàn)閑ax確實(shí)存不下一個結(jié)構(gòu)體,eax充當(dāng)返回變量的指針的角色。3.65B取四的倍數(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。3.66我們用結(jié)構(gòu)體A表示a_struct。首先,根據(jù)第11和12行,可以得到CNT*size<A>=196。根據(jù)13行,知道ecx+4*edx+8為ap->x[ap->idx]的地址。ecx存儲的是bp〔地址。ap的地址是bp+4+i*size<A>我們知道,ap->x[0]的地址是bp+4+i*size<A>+pos<x>,pos<x>為結(jié)構(gòu)體A中x的偏移。那么ap->x[ap->idx]的地址是bp+4+i*size<A>+pos<x>+
4*<ap->idx>。所以4*edx+8=4+i*size<A>+pos<x>+4*<ap->idx>。所以,不難猜測,pos<x>=4,也就是說,在A中,首先是idx,再是x數(shù)組。那么,我們看ap->idx在哪里計(jì)算過。到第10行,edx的結(jié)果是7i+bp[4+28*i],bp[4+28*i]是什么呢?它很可能是bp中的a[i]的首地址。我們先這樣猜測,于是size<A>=28,并且bp[4+28*i]的值為ap->idx。另一方面:4*edx=28*i+4*bp[4+28*i]=i*size<A>+4*<ap->idx>。所以,我們的猜想是正確的。因此,size<A>=28,里面包含了一個intidx和一個數(shù)組intx[6]??偣灿卸嗌賯€A呢?CNT=196/size<A>=7。3.67A.
e1.p:0e1.x:4e2.y:0e2.next:4B.總共需要8個字節(jié)。C.不難知道,賦值前后都應(yīng)該是整數(shù)。edx就是參數(shù)up〔一個指針。最后結(jié)果是用eax-<edx>得到的,說明<edx>是整數(shù),即up->___為整數(shù),肯定是表示的e2.y。再看看之前的eax,eax是由<eax>所得,說明到第3行后,eax是個指針。它是由<ecx>得到的,說明ecx在第二行也是個指針。而ecx是通過*<up+4>得到的,所以ecx是一個union指針next,即up->e2.next;到第三行,eax為*<ecx>,且是一個指針,所以eax在第三行為int*p,即up->e2.next->e1.p。所以,賦值符號后面的表達(dá)式就為
*<up->e2.next->e1.p>-up->e2.y再看看前面。最終賦值的地址是ecx+4,而ecx那時候是一個next指針,而<next+4>必須是一個int,也不難推測它是e1.x。因此前面就為up->e2.next->e1.x。結(jié)果如下:voidproc<unionele
*up>
{
up->e2.next->e1.x=
*<up->e2.next->e1.p>
-
up->e2.y;
}3.68版本一:使用getcharvoidgood_echo<>
{
char
c;
int
x=
0;
while<
x=getchar<>,
x!='\n'
&&
x!=EOF>
{
putchar<x>;
}
}版本二:使用fgetsvoidgood_echo<>
{
constint
BufferSize=
10;
char
s[BufferSize];
int
i;
while<fgets<s,
BufferSize,
stdin>!=NULL>
{
for<i=0;s[i];++i>
putchar<s[i]>;
if<i<BufferSize-1>
break;
}
return;
}兩種方法對于EOF好像沒效果,就是輸入一定字符后不按回車直接按EOF,沒能正確輸出。網(wǎng)上查到的資料說,getchar在輸入字符后,如果直接按EOF,并不能退出,只能導(dǎo)致新一輪的輸入。需要在最開始輸入的時候按,即按了回車之后按。而fgets就不知道了,不按回車,就不添加0。3.69longtrace<tree_ptrtp>
{
long
ret=
0;
while<tp
!=NULL>
{
ret=tp->val;
tp=tp->left;
}
return
ret;
}作用是從根一直遍歷左子樹,找到第一個沒有左子樹的節(jié)點(diǎn)的值。3.70longtraverse<tree_ptrtp>
{
long
v=MAX_LONG;
if<tp
!=NULL>
{
v=
min<traverse<tp->left>,
traverse<tp->right>>;
//Line16cmovle:if<r12<rax>rax=r12;
v=
min<v,
tp->v>;
//Line20cmovle:if<rax>rbx>rax=rbx;
}
return
v;
}當(dāng)然,如果要用三目條件表達(dá)式的話:longtraverse<tree_ptrtp>
{
long
v=MAX_LONG,
rv,
lv;
if<tp
!=NULL>
{
lv=
traverse<tp->left>;
rv=
traverse<tp->right>;
v=lv
<
rv
?
lv:rv
;
//Line16cmovle:if<r12<rax>rax=r12;
v=v
>
tp->v
?
tp->v:v
;
//Line20cmovle:if<rax>rbx>rax=rbx;
}
return
v;
}函數(shù)的目的是找到樹的所有節(jié)點(diǎn)的值中最小的一個。深入理解計(jì)算機(jī)系統(tǒng)<第二版>家庭作業(yè)第四章4.43沒有正確執(zhí)行pushl%esp,pushl%esp是將esp當(dāng)前的內(nèi)容入棧。如果REG是esp,那么代碼是先減去了esp,然后將減了4以后的REG移入了esp。修改:〔我只能想到利用其它的寄存器movlREG,%eaxsubl$4,%espmovl%eax,<%esp>4.44也沒有正確執(zhí)行popl%esp,因?yàn)閜opl%esp是將當(dāng)前棧頂?shù)闹捣湃雃sp。如果REG是esp,那么最后得到esp是棧頂值減4之后的值。movl<%esp>,%eaxaddl$4,%espmovl%eax,REG4.45我沒有按書上給的例子寫,而是自己寫了一個冒泡。voidbubble<int
*data,
int
count>
{
if<count==
0>
return;
int
i,
j;
int
*p,
*q;
for<i=count-1;
i!=0;
i-->{
p=data,
q=data
+
1;
for<j=0;
j!=i;
++j>
{
if<
*p
>
*q
>
{
int
t=
*p;
*p=
*q;
*q=t;
}
p++,
q++;
}
}
}Y86:<movl就沒有區(qū)分那么細(xì)了,因?yàn)樘闊┝?。。?gt;data:#〔從地地址往高地址$5,$2,$7,$4,$3,$6,$1,$8movl$8,%ecx
pushl%ecx
#count=8movldata,%ecxpushl%ecx#pushdatacallbubblehaltbubble:pushl
%ebpmovl
%esp,%ebppushl
%esipushl
%ebxpushl
%edxmovl
8<%ebp>,%edx
#edx==datamovl
12<%ebp>,%esi
#esi==countandl
%esi,%esije
bubbleEnd
#count==0movl$1,%eaxsubl
%eax,%esi#count--je
bubbleEnd
#count==1OuterLoop:movl
%edx,%ecx
#p=data<ecx>pushl
%esi#tosaveoneregInnerLoop:movl
<%ecx>,%eaxmovl
4<%ecx>,%ebxsubl
%eax,%ebxmovl4<%ecx>,%ebxjg
NoSwapmovl
%eax,%ebx
#swap,soebxisgreatermovl4<%ecx>,%eaxNoSwap:movl
%eax,<%ecx>movl%ebx,4<%ecx>movl$4,%eaxaddl
%eax,%ecxmovl$1,%eaxsubl%eax,%esijne
InnerLooppopl
%esimovl$1,%eaxsubl
%eax,%esijne
OuterLoopbubbleEnd:popl
%edxpopl
%ebxpopl
%esimovl
%ebp,%esppopl
%ebpret4.46InnerLoop內(nèi)改成:〔edx是循環(huán)利用movl
<%ecx>,%edxInnerLoop:movl
%edx,%eaxmovl
4<%ecx>,%ebxsubl
%ebx,%eax
#compare*pand*<p+1>cmovl
%ebx,%edx
#edxismaxmovl<%ecx>,%eax
cmovg%ebx,%eax
#%eaxisminmovl
%edx,4<%ecx>movl
%eax,<%ecx>movl$4,%eaxaddl
%eax,%ecxmovl$1,%eaxsubl
%eax,%esijne
InnerLoop4.47我們可以明確的是,這條指令完成的任務(wù)為,ebp<-M4[cur_ebp]esp<-cur_ebp+4取指階段icode:ifun=D:0
valP<=PC+1譯碼階段
valB<=R[%ebp]執(zhí)行階段
valE<=valB+4
訪存階段
valM<=M4[valB]寫回階段
R[%esp]<=valE
R[%ebp]<=valM4.48取指階段
icode:ifun=M1[PC]=C:0
rA:rB<=M1[PC+1]
valC<=M4[PC+2]
valP<=PC+6譯碼階段
valB<=R[rB]執(zhí)行階段
valE<=valB+valC
SetCC訪存階段
寫回階段
R[rB]<=valE
4.494.50取指boolneed_regids=
icodein{IRRMOVL,IOPL,IPUSHL,IPOPL,
IIRMOVL,IRMMOVL,IMRMOVL,
IADDL
};boolneed_valC=
icodein{IIRMOVL,IRMMOVL,IMRMOVL,IJXX,ICALL,
IADDL
};譯碼和寫回intsrcA=[
icodein{IRRMOVL,IRMMOVL,IOPL,IPUSHL
}:rA;
icodein{
IPOPL,IRET}:RESP;
1:RNONE;#Don’tneedregister];intsrcB=[icodein{IOPL,IRMMOVL,IMRMOVL,
IADDL
}:rB;icodein{IPUSHL,IPOPL,ICALL,IRET}:RESP;icodein{ILEAVE}:REBP;1:RNONE;#Don’tneedregister];intdstE=[icodein{IRRMOVL}
&&Cnd:rB;icodein{IIRMOVL,IOPL,
IADDL
}:rB;icodein{IPUSHL,IPOPL,ICALL,IRET,
ILEAVE
}:RESP;1:RNONE;#Don’twriteanyregister];intdstM=[
icodein{IMRMOVL,IPOPL}:rA;
icodein{ILEAVE}:REBP;
1:RNONE;#Don’twriteanyregister];執(zhí)行intaluA=[icodein{IRRMOVL,IOPL
}:valA;icodein{IIRMOVL,IRMMOVL,IMRMOVL,
IADDL
}:valC;icodein{ICALL,IPUSHL}:-4;icodein{IRET,IPOPL,
ILEAVE}:4;#Otherinstructionsdon’tneedALU];intaluB=[icodein{IRMMOVL,IMRMOVL,IOPL,ICALL,IPUSHL,IRET,IPOPL,
ILEAVE,IADDL
}:valB;icodein{IRRMOVL,IIRMOVL}:0;#Otherinstructionsdon’tneedALU];boolset_cc=icodein{IOPL,
IADDL
};訪存intmem_addr=[icodein{IRMMOVL,IPUSHL,ICALL,IMRMOVL}:valE;icodein{IPOPL,IRET}:valA;icodein{ILEAVE}:valB;#Otherinstructionsdon’tneedaddress];boolmem_read=icodein{IMRMOVL,IPOPL,IRET,
ILEAVE
};4.51--4.56感覺蠻麻煩的,不想寫啊。。。4.57A.發(fā)現(xiàn)加載/使用冒險(xiǎn)的邏輯公式:<E_icodein{IMRMOVL,IPOPL}&&E_dstMin{d_srcA,d_srcB}>
&&!<E_icode==IMRMOVL&&D_icode==IPUSHL>;B.e_valA=[<E_icode==IPUSH>&&<M_dstM==E_srcA>:m_valM;
1:E_valA;
];4.58版本1,在預(yù)測正確的情況下執(zhí)行7條指令,預(yù)測錯誤時執(zhí)行9條指令并插入一個bubble。版本2,執(zhí)行8條指令,但是在外部循環(huán)需要多執(zhí)行3條指令,否則就需要多用一個寄存器。暫時沒有想到好的辦法。光從內(nèi)循環(huán)看來,版本2平均執(zhí)行次數(shù)比版本1要少,因?yàn)榭梢约僭O(shè)預(yù)測錯誤的概率是50%。深入理解計(jì)算機(jī)系統(tǒng)<第二版>家庭作業(yè)第五章5.15A.關(guān)鍵路徑是%xmm1更新路徑上的加法。B.CPE下界是浮點(diǎn)加法的延遲。C.兩個load操作的吞吐量界限?!参矣X得是2.00D.因?yàn)槌朔ú辉陉P(guān)鍵路徑上,乘法也是流水線執(zhí)行的,其限制因素為吞吐量界限。整個程序的限制因素為最后的浮點(diǎn)數(shù)加法的延遲,這個延遲對float和double都是3.00。書上之前說關(guān)鍵路徑,現(xiàn)在其實(shí)可以再仔細(xì)分析一下<以下屬于個人分析>:把執(zhí)行指令寫出了就明了了。以整數(shù)為例:相同底色表示這些指令在一個循環(huán)內(nèi)執(zhí)行,以及同一個循環(huán)內(nèi)的初始值:所以我覺得整數(shù)的時候CPE是2.00,可是為什么是3.00呢?浮點(diǎn)數(shù)的話,延遲是3.00沒問題。時間線xmm1_add單元xmm1mul單元發(fā)射load單元發(fā)射rdx_add單元rdx的值10load1
add+020load2+13load1add+14load2+25load1add+26mul
<load延遲4>load2...7...80mul9add
整數(shù)mul
延遲為3010added
整數(shù)加法
延遲為1mul11add12added5.16voidinner4<vec_ptru,
vec_ptrv,
data_t
*dest>
{
longint
i;
int
length=
vec_length<u>;
data_t
*udata=
get_vec_start<u>;
data_t
*vdata=
get_vec_start<v>;
data_tsum=
<data_t>
0;
int
limit=length
-
2;
for
<i=
0;
i
<
limit;
i++>
{
sum=sum
+
udata[i]
*
vdata[i];
sum=sum
+
udata[i+1]
*
vdata[i+1];
sum=sum
+
udata[i+2]
*
vdata[i+2];
}
for<;
i<length;
++i>
sum=sum
+
udata[i]
*
vdata[i];
*dest=sum;
}A.因?yàn)閘oad吞吐量為1.00,每計(jì)算一個值需要兩次load,所以CPE不可能低于2.00。B.關(guān)鍵路徑上仍然有N個浮點(diǎn)加法,所以循環(huán)展開并沒有改變5.17A.load執(zhí)行單元的吞吐量B.IA32可用寄存器實(shí)際只有6個,而三路展開需要i,limit,udata,vdata,以及存儲udata[i],vdata[i]的寄存器,所以肯定有些循環(huán)變量會溢出到寄存器,這會影響效率?!仓劣跒槭裁词?.67以及為什么四路展開的整數(shù)會是2.33,還不是很清楚。5.18voidinner4<vec_ptru,
vec_ptrv,
data_t
*dest>
{
longint
i;
int
length=
vec_length<u>;
data_t
*udata=
get_vec_start<u>;
data_t
*vdata=
get_vec_start<v>;
data_tsum=
<data_t>
0;
int
limit=length
-
2;
for
<i=
0;
i
<
limit;
i++>
{
int
x1=udata[i]
*
vdata[i];
int
x2=udata[i+1]
*
vdata[i+1];
int
x3=udata[i+2]
*
vdata[i+2];
sum=sum
+
<x1
+
x2
+
x3>;
}
for<;
i<length;
++i>
sum=sum
+
udata[i]
*
vdata[i];
*dest=sum;
}5.19void
*optimized_memset<void
*s,
int
c,
size_tn>
{
unsigned
int
K=
sizeof<unsigned
long>;
unsigned
char
*schar=
<unsigned
char*>s;
unsigned
long
*lchar;
unsigned
long
fill=
0;
int
i=
0;
for<i=
0;
i
<
K;
i++>
fill
+=
<c&0xff>
<<
<i<<3>;
//n如果是個負(fù)數(shù),會變成一個很大的正數(shù),這應(yīng)該不需要處理吧?//size_t應(yīng)該是unsignedint,n應(yīng)該不可能是//一般K都是2的整數(shù)次冪,也可以用schar&<K-1>來求schar%Kwhile<<unsigned>schar%K
&&
n>
{
*schar++
=
<unsigned
char>c;
n--;
}
lchar=
<unsigned
long*>
schar;
while
<
n
>=K
>
{
*lchar++
=fill;
n
-=K;
//不知道這里如果用++和--會不會影響整體的效率
}
schar=
<unsigned
char*>
lchar;
while<n>
//剩余的n
{
*schar++
=
<unsigned
char>c;
--n;
}
return
s;
}5.20doublepoly_optimized<double
a[],
double
x,
int
degree>
{
longint
i;
double
result=
0;
double
s=
0,
powx4=
1;
double
x2=x*x;
double
x4=x2*x2;
longint
limit=degree-3;
for<i=
0;
i
<=limit;
i
+=
4>
{
double
v1=a[i]
+
a[i+1]*x;
double
v2=a[i+2]
+
a[i+3]*x;
v1=v1
+
v2
*
x2;
s=s
+
v1
*
powx4;
powx4
*=x4;
}
for<;
i
<=degree;
++i>
{
s
+=a[i]*powx4;
powx4
*=x;
}
return
s;
}關(guān)鍵路徑就是一個浮點(diǎn)數(shù)乘法,因此CPE是浮點(diǎn)乘法延遲的1/4,然而每次計(jì)算都需要load4個值,所以CPE還是1.00。5.21voidpsum<float
a[],
float
p[],
longint
n>
{
longint
i;
int
v=0;
for<i=0;
i<n-1;
i+=2>
{
int
v1=a[i];
int
v2=a[i+1];
v2=v1
+
v2;
p[i]
=v+v1;
p[i+1]
=v+v2;
v=v
+
v2;
}
for<;
i<n;
i++>
{
v=v
+
a[i];
p[i]
=v;
}
}5.22假設(shè)最開始需要100T的時間,那么A需要20T,B需要30T,C需要50T。將B提到3倍,也就是B需要10T,那么總時間為80T。將C提到1.5倍,也就是C需要33.3T,那么總時間為83.3T。所以提高B會使得性能更優(yōu)。深入理解計(jì)算機(jī)系統(tǒng)<第二版>家庭作業(yè)第六章6.23我們可以認(rèn)為,磁道沿半徑方向是均勻分布的。假設(shè)半徑為r的磁盤總的磁道是K,那么除掉內(nèi)部的x*r〔磁道數(shù)為x*K,剩下的磁道數(shù)為<1-x>*K。那么總?cè)萘繛?/p>
2*pi*x*r*<1-x>*K,其中pi,r和K都是常數(shù),那么只剩下x*<1-x>。這個函數(shù)在x=0.5的時候取最大。6.24T_seek=
3msT_maxrotate=60*1000/12000ms=5msT_avgrotate=0.5*T_maxrotate=
2.5msT_transfer=T_maxrotate/500=
0.01msT=T_seek+T_avgrotate+T_transfer=5.51ms6.253MB文件,我們假設(shè)1MB=1000KB,而1KB=1024B〔這個好算一些。那么3MB文件就有3000個邏輯塊〔扇區(qū),需要讀6個磁道。T_maxrotate=5msT_transfer=0.01msA.最好情況是6個磁道都在一個柱面上,只需要尋一次道,而且文件是順序存儲。T=T_seek+0.5*T_maxrotate+6*T_maxrotate=
35.5msB.最差的情況3000*<T_seek+0.5*T_maxroate+T_transfer>=16530ms6.26高速
緩存mCBEStsb1322048441282372232204845121300233220488125621834322048812822813532204832164216563220483241623456.27高速
緩存mCBEStsb13281921615121994232409644256228233240964812823724322048324162245感覺最后一行答案有錯誤,C應(yīng)該是4096,或者t是23,或者E為2。Address_start=<tag<<5>|<set<<2>;Address_end=<tag<<5>|<set<<2>|3;行1行2組00x0120-0x01
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南省岳陽市汨羅市2024屆九年級上學(xué)期期中考試數(shù)學(xué)試卷(答案不全)
- 2024年驅(qū)絳藥項(xiàng)目發(fā)展計(jì)劃
- 2024年離子風(fēng)棒項(xiàng)目建議書
- 2024年無碳復(fù)寫紙微膠囊(無碳復(fù)寫紙發(fā)色劑)項(xiàng)目合作計(jì)劃書
- 2024年液壓元件、系統(tǒng)及裝置合作協(xié)議書
- DB3305-T 308-2024 社會組織參與人民調(diào)解工作規(guī)范
- 2024年混懸劑項(xiàng)目合作計(jì)劃書
- 山東省定陶縣冉堌鎮(zhèn)南張莊完小2024-2025學(xué)年數(shù)學(xué)三上期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 網(wǎng)絡(luò)安全技術(shù) 統(tǒng)一威脅管理產(chǎn)品(UTM)技術(shù)規(guī)范 編制說明
- 山東省濟(jì)寧市曲阜市2025屆數(shù)學(xué)三上期末監(jiān)測試題含解析
- Module 1 Unit 2 Period 2 分層訓(xùn)練2023-2024學(xué)年九年級下冊英語課時分層作業(yè)教學(xué)設(shè)計(jì)(外研版)
- 智能倉儲系統(tǒng)建設(shè)方案
- 2024年上海青浦新城發(fā)展(集團(tuán))限公司自主招聘9名高頻考題難、易錯點(diǎn)模擬試題(共500題)附帶答案詳解
- 2025屆高考語文復(fù)習(xí):作文審題立意+課件
- 2024-2030年中國活塞發(fā)動機(jī)飛機(jī)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
- 2025年上半年教師資格考試初中歷史學(xué)科知識與教學(xué)能力試題及解答
- 信息系統(tǒng)集成服務(wù)合同
- 印刷服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 100以內(nèi)兩位數(shù)進(jìn)位加法退位減法計(jì)算題-(直接打印版)
- 【廣州浪奇公司存貨內(nèi)部控制缺陷的案例探析8100字(論文)】
- JT∕T 327-2016 公路橋梁伸縮裝置通.用技術(shù)條件
評論
0/150
提交評論