前言:已經大四,沒有去找工作,選擇了保研,之所以這樣選擇,有三個原因,一、剛進校時,聽說保研都是牛人才能行的事,所以一心努力保研;二、2008年開始,經濟危機比較嚴重,工作不好找,雖然軟件專業要找一份工作還是比較容易,但好工作的機會少了很多,再多學習幾年,規避下風險;三、三年多的本科學習下來,雖然簡歷看起來還像回事,但內心很虛,感覺真才實學沒多少,都是略懂皮毛,做了太多表面工作,沒有特長,選擇讀研,希望在某一方面能夠深入學習,不再流於膚淺,真正地學有所長。
保研成功後,過了近一個月豬一樣的生活,實在過得空虛,看到考研同學每天辛苦地備考,在暗自慶幸的同時,也意識到,保研給我節約了很大一筆時間,不應該把這段時間荒廢了。於是找了譚師兄和樑老師,讓他們給我指點一二。樑老師的建議很中肯,他說如果他現在是HR,他會只招本科生,而不是研究生,因爲現在研究生的質量比本科生高不到哪裏去,而且一把年紀了,本科生出來工作三年後經驗什麼的都要比研究生強多了,說不定很多本科生還會當研究生的思想導師。這個說法當然比較絕對,但是我認爲還是很有道理,因此,他說,你如果去讀研,就不要再像本科一樣把自己定位爲一個coder,而應該至少是去做一個提出解決方案的,具體的實現讓下面的人去做。你可以發現很多好東西好的解決方案都是老外提出來的,爲什麼中國人只能錦上添花,那裏因爲我的的基礎知識不夠紮實,知識體系不夠健全,連自己手中的計算機是怎麼工作的都不知道,怎麼能提出很好的解決方案呢。所以,對於大四這一年,他給我推薦了兩本書,一本《深入理解計算機系統》,這本書很基礎,但是覆蓋面很全,可以幫助加深對計算機的理解,知道它底層是怎麼工作的,健全計算機體系的知識,而不是隻學一些編程技術之類的表相的東西,這樣永遠只會被別人牽着走;另外一本書是《Unix環境高級編程》,他說你以後是去做網絡方面的東西,而網絡是絕對離不開Unix,你把這本書的程序當模板背下來以後,第一、編程就不成問題,第二、可以對Unix有全面的瞭解。
好記性不如爛筆頭,看了書不能過了了事,遂做此讀書筆記,僅爲學習溫習之用,高手勿笑:)
前言囉嗦完畢,迴歸正文:
3.3數據格式(記住)
- 由於是從16位體系結構擴展成32位,intel用術語字(word)表示16位數據類型,因此32位爲雙字(double words),64位數爲4字(quad words)。
- 以下是比較容易模糊的數據類型大小:
32位機上:float 4 long int 4 double 8 longlong 8 char* 4 unsigned long 4
64位機上:float 4 long int 8 double 8 longlong 8 char* 8 unsigned long 8
另外,GCC 用long double表示擴展精度(10字節),出於存儲器性能考慮,會被存儲爲12字節
3.4訪問信息
- 一個IA32 CPU包含一組8個存儲32位值的寄存器,用以存整數數據和指針:eax,ecx,edx,ebx,esi,edi esp,ebp。大多數情況下前六個都用作通用寄存器,eax,ecx,edx的存儲和恢復慣例不同於ebx,edi,esi(前三者爲被調用者保存,後三者爲調用者保存,詳見3.7.3);最後兩個用於存儲指針,由於在過處理中非常重要,分別指向棧幀的頂部和底部,必須保持。
3.4.1操作數指示符(記住)
大多數指令有一到多個操作數,操作數有三種:
立即數:即常數值
寄存器:表示某個寄存器內容
存儲器引用:根據計算出來的地址(通常稱有效地址)訪問某個存儲器位置
因此尋址方式也有多種,如:立即數尋址、寄存器尋址、絕對尋址、間接尋址、變址尋址、伸縮化 的變址尋址……
3.4.2數據傳送指令(記住)
幾個重要數據傳送指令:mov族(之所以稱這爲族是因爲mov指令還有很多兄弟指令如movb、movw、movsb、movzb,這是我個人對它們的稱呼,便於記憶mov其他幾個比較低調的兄弟)、pop、push。
另,對於mov族,movb、movw自不必做過多解釋,movsb、movzb分別爲符號擴展、零擴
展,它們只拷貝一個字節,源操作數均爲單字節,並設置目的操作數中其餘的位,效果如下:
初始假設:%dh=8D %eax=98765432
1 movb %dh,%al ;%eax=9876548D
2 movsbl %dh,%eax ;%eax=FFFFFF8D(目的操作數高24位設爲源字節最高位,在這裏爲很顯然爲1,所以前24位爲全F)
3 movzbl %dh,%eax ;%eax=0000008D(目的操作數高24位被設爲0)
對於pushl指令等價於:
subl $4,%esp
movl %ebp,(%esp) //注意這裏的括號引起的差別
popl指令等價於:
movl (%esp),%eax
addl $4,%esp
3.4.3數據傳輸實例(理解)
通過彙編代碼可以得到兩點收穫:
1、指針其實是地址,間接引用指針就是將該指針放在一個寄存器中 ,然後在間接存儲器引
用中引用這個寄存器
2、局部變量通常保存在寄存器中,而不是存儲器(個人猜測應該是局部變量屬於動態
分配,局部變量因此被動態置入寄存器,而非存儲器)
3.5算術和邏輯操作(看看便可,不必深究)
這類操作符大致分爲四個小類:
1、加載有交地址(leal),通常用來執行簡單算術操作,目前還不太懂這個與mov的區別
2、一元或二元操作:incl decl negl notl addl subl imull xorl orl andl
3、移位操作 :sall==shll(填0) sarl(算術右移,填符號位) shrl(邏輯右移,填0)
4、特殊算術操作:imull(有符號64位乘法) mull(無符號64位乘法) cltd(轉換爲四字)
idivl(有符號除法) divl(無符號除法)