《30天自制作業系統》避坑排雷指南和命令大全
前言
《30天自制作業系統》是日本Coder川合秀實先生的著作,對於想了解作業系統原理或者有志於底層開發的同學們好處多多。近幾日我開始閱讀這本著作,順便製作一個避坑排雷指南,防止在無用的事情上浪費時間,附帶收集一下常用命令,方便自己同時分享出來方便他人。
使用指南
這篇文章的推薦使用方法是:發現書裡難懂的地方->根據頁碼檢視避坑排雷指南->檢視命令大全或知識點合集。
避坑排雷
坑點 | 頁碼 | 詳細描述 |
---|---|---|
檔案路徑的連線符不正確 | 全域性 | 書裡的檔案路徑連線符多使用的是’/’而實際上本人在Win7系統中發現應該是’\’,但又有部分路徑確實應該是’/’,如果有錯就多試幾次吧! |
檔案路徑中的’¥’無意義 | 全域性 | 書裡的檔案路徑很多都有’¥’這個字元,其實毫無意義,直接忽略掉即可,應該是印刷問題。 |
EDX、DX、DL到底什麼關係 | P82 | 書裡對EDX、DX、DL之間的關係好像沒仔細講,特別是看到P82程式碼會比較懵,詳細解釋請參考知識點合集。 |
調色盤色號為什麼要除以4 | P77、P79 | 注意寫入RGB顏色時都除以了4,我在網上搜了半天又想了好久也不知道為什麼,事實上不除以4完全可以正確執行,這讓我感到更加奇怪,為啥除以4和不除以4表示的顏色一樣?!明明色號都不一樣了啊喂!這個問題真的不知道怎麼回事,暫且擱置吧!看到一些人說除以4是一種亮度調整,我倒是沒看出有什麼區別。。。 |
彙編命令/語法大全
宣告常量(EQU)
語法:常量名 EQU 數值
說明:宣告一個常量,接下來可以用常量名指代該值,EQU是equals的縮寫。
舉例:例如“COUNT EQU 1”相當於C語言裡“#define COUNT 1”的作用,接下來“MOV CX,COUNT”在編譯後就會直接變成“MOV CX,1”,這種宣告常量的方式是不佔據空間的。
組合語言和C語言聯合使用時的引數傳遞
舉例:
_function:
MOV ECX,[ESP+4]
MOV AL,[ESP+8 ]
MOV [ECX],AL
RET
彙編程式碼如上,除此函式主體內容之外,還需要寫GLOBAL指令與C語言函式連結,寫section分段提示劃分出程式碼段等等。這些內容參考書P62左右內容和《最簡單的彙編程式》即可。
再看C程式碼
void function(int addr, int data);
如上,C程式碼中只需要加入這樣的一行函式宣告即可,編譯器會幫你在彙編程式碼原始檔中找到對應的函式主體。
注意彙編程式碼的函式名必須是C程式碼中宣告的函式名在開頭加上一個’_’,這是規定啦。
然後解釋一下引數傳遞,ESP是extended stack pointer的意思,也就是擴充套件棧指標,是傳入引數的地址變數(應該說跟傳入引數的所在地址有直接關係),引數的存放地址依次是:
第一個引數的存放地址:ESP+4
第二個引數的存放地址:ESP+8
第三個引數的存放地址:ESP+12
以下略…
也就是說function的第一個引數addr的值被存在了ESP+4這個地址上,[ESP+4]就可以取到這個值啦,所以上面的彙編程式碼會有“MOV ECX,[ESP+4]”這樣的語句。
底層小知識合集
EDX、DX、DL之間的關係
stackOverflow上有人問過這個問題:點此連結,回答的非常好,其實DX就是指EDX的低16位,同理EDX也就是RDX的低32位,參見下面:
[76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210] bits
[ RDX ]
[ EDX ]
[ DX ]
[ DH ][ DL ]
資料推薦
這裡推薦一些學習資料: