我在NASM中编写了一个启动加载程序,它将一个64kb的程序数据从磁盘加载到内存中,地址为0060:0000 [SEG:OFF]。我通过在Assembly(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指令从C源代码生成16位实模式RAW BIN文件,声明的段为:offset? WatCom或我需要使用其他东西吗?
答案 0 :(得分:0)
由于C函数的顺序有些不可预测,因此在实际入口点需要一些特殊的初始化代码。在这种情况下,入口点始终位于文件的最开头。这个初始代码的编码偏移量也决定了所有其他地址的偏移量(segemnt并不重要,编译器也不做任何假设)。您可能希望编写自己的非常精简的初始化代码。默认的初始化代码位于文件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