第一章
用了一個小時看 《深入理解計算機系統》第一章。雖然通過之前的逆向,彙編等底層知識的學習,這些知識大部分都是掌握之中了,但是讀了之後還是有一種
豁然開朗的感覺,覺得之前積累的零零散散的知識被梳理了一遍,這是本好書,繼續學習!
第二章
浮點運算有完全不同的數學屬性。雖然溢出會產生特殊的值+∞,但是一組正數的乘積總是正的。
自己寫個小程序
#include <Stdio.h>
int main()
{
float flow;
float normal=999.999*888.888;
scanf("%f",&flow);
flow=flow*normal;
printf("you never get here %f",flow);
printf("\n");
return 0;
}
在scanf執行時輸入一個超大的浮點數,flow的值變爲7F800000
用printf輸出flow就會顯示字符串1.#INF00,大概就是所說的 特殊的值+∞ 了吧
後面有一段文字被譯者翻譯得有點傻逼,我覺得他翻譯的傻B,當然你也可以覺得我翻譯得更傻逼。。
當值x是2的非負整數冪時,也就是...(方便後人搜索)
大概就是說二進制和十六進制之間的竅門,如一個十六進制數等於2的5次方,那麼寫成二進制就是1後面跟5個0,即100000B(二進制)=20H(十六進制)=32D(十進制)
就是說2的n次方,寫成二進制就是2後面跟n個0,書上還說如果將n表示爲i+4j (0<=i<=3), 轉換起來更方便,如2的11次方 中的11=3+2*4,那麼它的十六進制形式就是
2的三次方的2*4次方,也就是8的8次方,就是8後面要跟8個0(二進制的0),那麼十六進制上就要跟2個0,所以十六進制表示爲800H
後面講到十六進制與十進制的互轉。
十進制轉十進制是不斷地用商除16,直到商爲0,然後餘數按最後一次除法到第一次除法的順序念就是十六進制了
十六進制轉十進制就是,例:7AF=7*16的2次方 + 10* 16的1一次方 + 15*16的0次方 = 1967
後面說大小端,一般Intel用的是小端,IBM和Sun用的是大端,不過也不一定全是啦。考慮一個數0x12345678, 12那個位置叫最高有效位 78那個位置在最低有效位
小端方式的存儲會將低有效位放在前面,高有效位放在後面,所以我們在用OD逆向的時候看到一個句柄如此存放在0x403000的時候(9A2C321F),其實真正的句柄值是1F322C9A. 爲什麼字節存儲方式要叫做大端小端(respectively big endian and little endian)這麼奇怪, 其中故事比較傻逼, 這裏就不引用了。。