我在NASM中编写了一个引导加载程序,它将一个64 in的程序数据从磁盘加载到内存中,由地址0060:0000、SEG:OFF启动。我通过编写一些代码组装(NASM)并将其放入磁盘来测试我的项目的这一部分。工作得很好!
整个项目,它有点复杂,完全写在程序集中。因此,我决定,我将使用C与内嵌程序集的进一步。为此,我下载了一个名为open-watcom-c-win32-1.9.的环境,我有一个简单的C代码,用于测试一些WatCom编译器和链接器指令,以生成原始BIN文件。bin文件是生成的,但不会在引导加载程序将其加载到内存后运行。我尝试了很多wlink指令来设置段和偏移值,但是没有工作。
void main()
{
__asm
{
mov ah, 0x0E
mov al, '!'
int 0x10
}
}我认为问题在于编译器和链接器在生成代码时使用了错误的段和偏移地址。因为Wlink在任何情况下都会删除以下错误。
警告!W1023没有找到起始地址,使用0000:0000
我不知道如何正确设置段偏移地址,但这将是一个工作程序的巧用。我的问题是,我使用什么样的WatCom指令从C源代码生成16位真实模式原始BIN文件,并声明段:偏移量?使用WatCom是可能的,还是我需要使用其他东西?
发布于 2015-08-03 02:35:13
由于C函数的顺序有些不可预测,所以在实际入口点需要一些特殊的init代码。在这种情况下,入口点总是在文件的开头。该初始代码的编码偏移量还指示所有其他地址的偏移量(段段无关紧要,编译器对此不作任何假设)。您可能希望编写自己的非常精益的init代码。默认的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 _STACKhttps://stackoverflow.com/questions/29577167
复制相似问题