首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用WatCom使用已声明的段偏移量生成原始BIN

如何使用WatCom使用已声明的段偏移量生成原始BIN
EN

Stack Overflow用户
提问于 2015-04-11 11:07:00
回答 1查看 296关注 0票数 1

我在NASM中编写了一个引导加载程序,它将一个64 in的程序数据从磁盘加载到内存中,由地址0060:0000、SEG:OFF启动。我通过编写一些代码组装(NASM)并将其放入磁盘来测试我的项目的这一部分。工作得很好!

整个项目,它有点复杂,完全写在程序集中。因此,我决定,我将使用C与内嵌程序集的进一步。为此,我下载了一个名为open-watcom-c-win32-1.9.的环境,我有一个简单的C代码,用于测试一些WatCom编译器和链接器指令,以生成原始BIN文件。bin文件是生成的,但不会在引导加载程序将其加载到内存后运行。我尝试了很多wlink指令来设置段和偏移值,但是没有工作。

代码语言:javascript
复制
void main()
{ 
 __asm 
      { 
       mov ah, 0x0E
       mov al, '!' 
       int 0x10 
      }
}

我认为问题在于编译器和链接器在生成代码时使用了错误的段和偏移地址。因为Wlink在任何情况下都会删除以下错误。

警告!W1023没有找到起始地址,使用0000:0000

我不知道如何正确设置段偏移地址,但这将是一个工作程序的巧用。我的问题是,我使用什么样的WatCom指令从C源代码生成16位真实模式原始BIN文件,并声明段:偏移量?使用WatCom是可能的,还是我需要使用其他东西?

EN

回答 1

Stack Overflow用户

发布于 2015-08-03 02:35:13

由于C函数的顺序有些不可预测,所以在实际入口点需要一些特殊的init代码。在这种情况下,入口点总是在文件的开头。该初始代码的编码偏移量还指示所有其他地址的偏移量(段段无关紧要,编译器对此不作任何假设)。您可能希望编写自己的非常精益的init代码。默认的init代码在文件cstart_t.obj中,所以您需要替换它。确切地说,您需要在那里放什么取决于您需要什么,如果链接器抱怨缺少的符号,您可能需要把它扔到那里。这样的最小值将用于示例代码,但可能会使一些C函数无法使用(用Nasm语法编写):

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29577167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档