[英]How to generate 16-bit executable BINARY RAW format from C by Watcom compiler?
[英]How I generate RAW BIN with declared segment offset using WatCom
我在NASM中編寫了一個引導加載程序,該加載程序從磁盤將64kb程序數據加載到內存中,其地址為0060:0000 [SEG:OFF]。 我已經通過在匯編中編寫一些代碼(NASM)並將其放入磁盤來測試了項目的這一部分。 工作正常!
完整的項目對於在Assembly中進行完全編寫有些復雜。 因此,我決定進一步將C與內聯匯編一起使用。 為此,我下載了一個名為open-watcom-c-win32-1.9的環境。 我有一個簡單的C代碼,用於測試某些WatCom編譯器和鏈接器指令以制作RAW BIN文件。 生成了bin文件,但在我的引導加載程序將其加載到內存后無法運行。 我嘗試了很多wlink指令來設置段和偏移量值,但是不起作用。
void main()
{
__asm
{
mov ah, 0x0E
mov al, '!'
int 0x10
}
}
我認為問題是在代碼生成時,編譯器和鏈接器使用了錯誤的段和偏移地址。 因為無論如何Wlink都會丟棄以下錯誤。
警告! W1023找不到起始地址,使用0000:0000
我不知道如何正確設置段偏移地址,但是對於一個運行中的程序來說,它是非常必要的。 我的問題是,我要使用哪種類型的WatCom指令從帶有聲明的segment的C源代碼中生成16位實模式RAW BIN文件:偏移量? WatCom是否有可能,或者我需要使用其他東西?
由於C函數的順序有些不可預測,因此在實際的入口點需要一些特殊的初始化代碼。 在這種情況下,入口點始終位於文件的開頭。 此初始代碼的編碼偏移量還指示所有其他地址的偏移量(段無關緊要,編譯器對此不作任何假設)。 您可能會想要編寫自己的非常精簡的init代碼。 默認的初始化代碼在文件cstart_t.obj中,因此您需要替換它。 確切地說,您需要在其中放置什么內容取決於您的需求,如果鏈接器抱怨某些丟失的符號,則可能需要將其放入其中。 最小限度的這樣的代碼可以與您的示例代碼一起使用,但是可能會使某些C函數無法使用(以Nasm語法編寫):
global __STK
extern main_ ; The actual name of the main function depends on the memory model I think.
section _INIT class=CODE
resb 0 ; The expected offset of the code.
..start:
jmp main_ ; Don't expect main() to return.
section _STACK stack class=STACK
__STK:
group DGROUP _INIT _STACK
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.