由于我無法確定的原因,在我的引導加載程式中使用變數會導致它被標記為未定義的符號。
.386
option segment:use16
.model tiny, stdcall
;------------------------------
; CODE
;------------------------------
.code
org 07c00h
Print PROTO lpStr:WORD
_start:
INVOKE Print, OFFSET bootInfo
cli
hlt
error:
cli
hlt
Print PROC USES ax si lpStr:WORD
mov si, lpStr
mov ah, 0Eh
@@loop:
lodsb
cmp al, 0
je @@done
int 10h
jmp @@loop
@@done:
ret
Print ENDP
;------------------------------
; DATA
;------------------------------
bootInfo db "Booting CompatOS...", 0
;------------------------------
; PADDING
;------------------------------
byte 510-($-_start) dup (0)
dw 0AA55h
END _start
我已經搜索并查看了我宣告變數的方式是否有問題,但顯然,它應該像這樣作業。對于背景關系,我將自己定位在這個。
任何幫助深表感謝。謝謝。
編輯:
MASM 和聯結器用于編譯源代碼。生成檔案:
.PHONY: clear
clear:
rm -f -r -d ./tmp/
rm -f -r -d ./bin/
.PHONY: build_debug
build_debug:
mkdir -p tmp
mkdir -p bin
masm_615/bin/ml /nologo /AT /c /Febin\\CompatOS.img /Fotmp\\boot.obj src\\boot\\boot.asm
masm_615/bin/link /nologo /TINY /NOD tmp\\boot.obj, bin\\CompatOS.img, NUL, NUL, NUL
錯誤:
1>src\boot\boot.asm(14): error A2006: undefined symbol : bootInfo
1>src\boot\boot.asm(14): error A2114: INVOKE argument type mismatch : argument : 1
uj5u.com熱心網友回復:
錯誤是因為您正在使用invoke帶有前向參考的指令。bootInfo使用后宣告invoke。這個問題已經在MASM32 論壇上討論過了。解決此問題的一種方法是不使用invoke并執行call. 這將要求您必須自己將地址推送到bootInfo堆疊上,如下所示:
; INVOKE Print, OFFSET bootInfo
mov ax, OFFSET bootInfo
push ax ; Push register since original 8086
; didn't have a push IMMediate instruction
call Print
另一個編碼選項是將資料移動到引導加載程式的開頭附近,引導加載程式的第一條指令將資料跳轉到代碼。這將放在bootInfothe 之前invoke,您將不再有前向參考。像這樣的東西:
;------------------------------
; CODE
;------------------------------
.code
org 07c00h
Print PROTO lpStr:WORD
_start:
jmp skipdata
;------------------------------
; DATA
;------------------------------
bootInfo db "Booting CompatOS...", 0
skipdata:
INVOKE Print, OFFSET bootInfo
cli
hlt
解決這個問題的另一種方法是使用JWASM(一種開源 MASM 兼容的匯編器)。我注意到 JWASM 在使用invoke.
筆記
我意識到您受到了一些限制,因為這是一個引導加載程式,您不能只放入
bootInfo一個.data部分并將其放在該部分之前.code,這將是一個可以在引導加載程式之外作業的解決方案。您需要一個解決方案,將代碼正確放置在資料(或由代碼包圍的資料)之前,然后在 512 位元組扇區的末尾放置引導簽名 0xaa55。我建議在開發引導加載程式時查看我的引導加載程式提示,了解常見問題,包括在真實硬體上測驗時的建議。
您可能希望使用該
.8086指令,而不是.386打算在可能早于 386 的真實硬體上運行。傳統引導加載程式通常在開發時考慮到最低公分母 - 8086 處理器。如果您不打算在古老的硬體上運行,那么這可能不是問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/519514.html
標籤:Intel Collective 部件x86masm引导加载程序操作系统开发
下一篇:僅使用加法和按位非的二進制函式
