2013-03-04 133 views
0

我在寫一個bootloader,但我不確定我所做的是否正確。首先,我使用這個批處理腳本編譯我的bootloader:org 0C700h給出奇怪的輸出

dm\bin\dmc.exe -msdo -c -cpp bootloader.cpp 
masm\bin\ml.exe -c bootloaderASM.asm 
dm\bin\link.exe /BINARY bootloaderASM.obj bootloader.obj 

我使用DMC的編譯器和連接器,與MASM 615彙編一起,他們都應該是16位(DMC是16和32) 。 現在在我的彙編文件bootloaderASM.asm,如果我添加「組織07C00」,輸出文件bootloaderASM.sys變得充滿0的,直到07C00,那麼預期的代碼填寫。但是,如果我刪除它,輸出文件如預期。 據我瞭解,組織指令簡單地調整我的指令使用的地址,以便基地是07C00,我想它不應該用零填充我的輸出文件?

從編譯器和彙編的.obj文件似乎是確定。它們在0x07c00之前不包含前導零,但鏈接器的最終輸出是錯誤的。

現在是連接器的問題?我該如何解決它/你建議一個不同的(16位)鏈接器?另外 - 如果我簡單地忽略我的引導加載程序的組織指令,可以嗎?

此外 - 我已經編寫了一個程序來讀取我的引導程序並將其寫入虛擬硬盤驅動器的引導扇區中,我可以簡單地修改它以忽略鏈接程序輸出中的前導零 - 是否可行?

謝謝。

+0

我沒有使用數字火星的鏈接器,但也許'/BASE和'/ FIXED'開關可以完成你想要的(與'ORG 0'結合)。 – Michael 2013-03-04 11:29:25

+0

謝謝你的回覆。所以我不知道/固定選項如何幫助,但如果我使用/ BASE:31744(07C00十進制)會使得它確定在引導裝載程序組織0? – 2013-03-04 11:55:58

+0

基地址應該以十六進制給出,而不是十進制。不管它是否工作,我都不知道,因爲我沒有使用它。我只是建議它作爲你可以嘗試的東西。 – Michael 2013-03-04 12:01:54

回答

0

我的理解,該組織指令簡單地調整使用 我的指令,因此該基地是07C00的地址,我想它不應該填充零 我的輸出文件?

根據該NASM Manual,所述MASM實施ORG實際移動後續輸出到給定的偏移量。

至於你的觀察,因爲有可能是點之前來自其他模塊的代碼,在obj文件只存儲偏移,期待連接到正確位置,也由簡單的填充的情況。

現在爲與連接體問題?我該如何解決它/你建議一個 不同的(16位)鏈接器?

的接頭不是這裏有毛病。這是MASN表演的怪癖。

另外 - 如果我只是忽略我的 引導加載程序的組織指令?

而且 - 我已經寫了一個程序來讀取我的引導程序,它在 寫一個虛擬硬盤的引導扇區,我可以簡單地將它修改爲 忽略連接器輸出的前導零 - 將這項工作?

從閱讀OSDev Wiki,如果段寄存器相應地處理,兩者都可能工作。我的理解是輸出應該放在硬盤分區的0位置,並加載到偏移量0x7c00。只要它按照這個規範運行,它就「應該工作」。

下可能提供進一步有用的閱讀:

MASM在相關的帖子SEGMENT(msdn.microsoft.com/en-us/library/d06y3478%28v=vs.80%29.aspx)指令(計算器.com/questions/12552072/masm-segment-directive)

PS。 (我「至少需要10個聲望」,我沒有考慮這是我的第一篇文章,「發佈超過2個鏈接」。)