macro 大家應該都很明白就是同樣的Code在前置處理時將其代換成#define中的東西
那inline不也是代換嗎?這兩個差在哪裡?
就我所知,macro是由cpp做的,而inline是一種最佳化,所以它是由compiler做掉
所以inline並不止是代碼替換,而inline並不是在所有地方都會inline
若有個function宣告為 static inline,在其編譯單元會inline,而在其它的編譯單元會用function call,如果沒有其它程式使用到,則不會有function table
若有個function宣告為 extern inline,其都會如同macro展開程式碼,所以不會有function table
這是我google來的,不知道對不對
星期四, 9月 17, 2009
BOOTSEG = 0x07c0
最近看linux的書,從基本的boot開始看起
但是看到一堆組合語言跟register都看的霧剎剎
尤其是BOOTSEG = 0x07c0跟0x7c00的關係
BIOS會從MBR把OS的開機程式Copy到0x7c00的位址,然後從此開始執行
但在boot.s中只看的到BOOTSEG = 0x07c0卻看不到0x7c00的東西
目前大概知道是因為CS跟IP的關係,但還不是很了解
先把知道的寫在下面,之後看懂了再來補完
CS:Code Segment,指程式從何處開始
IP:Instruction Pointer,指令的位置
程式目前跑到的位置為CS + IP
DS:Data Segment,指資料從記憶體的哪個位址開始
如果在組語中用到[BX]來定址([]為Indirect Addressing),所定的位址為DS + BX
由於指令實際位址都由CPU的程式計數器(PC)來決定,因此80×86CPU的PC = CS × 16 + IP。
所以0x7c00為指令執行的位址,BOOTSEG = 0x07c0代表CS為0x07c0,而IP為零,則指到的位址就是0x7c00
如果不懂可以看看這裡
http://finalfrank.pixnet.net/blog/post/22992166
http://www.ltivs.ilc.edu.tw/kocp/mpu/m3/m3-1-2.htm
但是看到一堆組合語言跟register都看的霧剎剎
尤其是BOOTSEG = 0x07c0跟0x7c00的關係
BIOS會從MBR把OS的開機程式Copy到0x7c00的位址,然後從此開始執行
但在boot.s中只看的到BOOTSEG = 0x07c0卻看不到0x7c00的東西
目前大概知道是因為CS跟IP的關係,但還不是很了解
先把知道的寫在下面,之後看懂了再來補完
CS:Code Segment,指程式從何處開始
IP:Instruction Pointer,指令的位置
程式目前跑到的位置為CS + IP
DS:Data Segment,指資料從記憶體的哪個位址開始
如果在組語中用到[BX]來定址([]為Indirect Addressing),所定的位址為DS + BX
由於指令實際位址都由CPU的程式計數器(PC)來決定,因此80×86CPU的PC = CS × 16 + IP。
所以0x7c00為指令執行的位址,BOOTSEG = 0x07c0代表CS為0x07c0,而IP為零,則指到的位址就是0x7c00
如果不懂可以看看這裡
http://finalfrank.pixnet.net/blog/post/22992166
http://www.ltivs.ilc.edu.tw/kocp/mpu/m3/m3-1-2.htm
訂閱:
文章 (Atom)