簡體   English   中英

我如何使用WatCom生成具有聲明的段偏移量的RAW BIN

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM