於淵前輩有這麼一句注釋:
------------------------------------------------------
org07c00h ;告訴編譯器載入到7c00h處
------------------------------------------------------
到了第三章,編譯com檔案時,要把07c00h改成0100h。如果按照之前的邏輯,就應該這樣注釋:
-----------------------------------------------------
org0100h ;告訴編譯器,這個com檔案將來肯定被載入到0100h處
-----------------------------------------------------
明顯不對頭:com檔案的載入地址是隨機的,不可能總是載入到0100h處!
那就是我之前對org的理解有問題了。
我想這樣表述才對:org力求告訴nasm編譯器:“你正在編譯的這段程式,它的第一條指令相對CS的位移數值”。編譯器據此,能夠計算出程式中每個標籤的準確位移數值(相對於CS的)。
再回頭看於淵前輩的注釋: org07c00h ;告訴編譯器載入到7c00h處
這句注釋是沒有問題的。為什嗎?因為bios初始化完成之後,會將cs:ip設定為0000h:7c00h。看到沒,cs是0,所以位移地址就是物理地址了。
最後說一句:許多人都說masm的offset多餘,醜陋,說nasm的標籤直接取址,很簡潔。我想各有千秋吧:至少對新手來說,offset操作符無疑是個醒目的提示:你正在對某個標籤取位移值!------org也只是協助定位標籤的位移值,因為我們程式的第一條指令可能已經位移cs若干個byte了。
以上說明都是在nasm下:masm下面可以有多個org,nasm只能有一個。
感謝JerKii的這篇文章,文章結的十分漂亮:http://topic.csdn.net/t/20051116/16/4397624.html
這篇文章也有涉及:http://hi.baidu.com/lewutian/item/a34dd72ea3a853cdddf69a78