繁体   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