c - 如何使用 WatCom 生成带有声明的段偏移量的 RAW BIN

标签 c assembly watcom

我在NASM中编写了一个引导加载程序,它将64kb的程序数据从磁盘加载到内存中,从地址0060:0000 [SEG:OFF]开始。我通过在程序集(NASM)中编写一些代码并将其放入磁盘来测试了我的项目的这一部分。工作正常!

完整的项目对于完全用汇编语言编写来说有点复杂。所以我决定进一步使用 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 指令从具有声明的段:偏移量的 C 源代码生成 16 位实模式 RAW BIN 文件?可以使用 WatCom 还是我需要使用其他东西?

最佳答案

由于 C 函数的顺序在某种程度上是不可预测的,因此在实际入口点需要一些特殊的初始化代码。在这种情况下,入口点始终位于文件的开头。该初始代码的编码偏移量还决定了所有其他地址的偏移量(段并不重要,编译器对此不做任何假设)。您可能想编写自己的非常精简的初始化代码。默认的初始化代码位于文件 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

关于c - 如何使用 WatCom 生成带有声明的段偏移量的 RAW BIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29577167/

相关文章:

c - 这两个 C 声明之间有什么区别?

c++ - strlen 和 sizeof 对于基于指针和数组的 String 初始化的不同答案

c - 如何覆盖二维数组中的第一行?

c - 指向函数指针的指针数组的声明、分配和赋值

assembly - x86 操作码对齐引用和指南

linux - 插入排序不起作用,32 位程序集

c - 调用 fread 后奇怪的 printf 行为

c - DOS/4GW fatal error (1307) : not enough memory

汇编条件跳转

c - 16 位 DOS 中的 XMS 分配