You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让64位主机的Watcom Compiler 2.0beta输出8086汇编至ASM文件?

用Watcom Compiler 2.0beta生成适配EMU8086的8086汇编代码

我来帮你搞定这个需求——让Watcom输出8086汇编文件,还能直接在EMU8086里运行,分两步操作:

一、生成8086汇编文件的正确编译命令

你当前用的wcc -0 main.c只生成OBJ文件,要输出汇编,需要添加几个关键选项,同时确保编译器针对8086架构生成代码:

wcc -bt=dos -ml -s -c main.c

逐个解释下这些选项的作用:

  • -bt=dos:指定目标平台为DOS,强制编译器生成8086兼容的16位代码
  • -ml:启用小内存模型,这是8086环境下最常用的模型,代码段和数据段各自不超过64KB,完美适配EMU8086的运行环境
  • -s:告诉编译器输出对应的汇编源文件(会自动生成和C文件同名的.asm文件,比如main.asm)
  • -c:只执行编译步骤,不进行链接,避免生成多余的OBJ或EXE文件

执行完这个命令,你就能在当前目录找到生成的汇编文件了。

二、调整汇编文件适配EMU8086

Watcom生成的汇编直接复制到EMU8086可能会报错,因为它带了一些编译器专属的伪指令和格式,需要做几个小修改:

1. 段名调整

Watcom默认用_TEXT(代码段)和_DATA(数据段),EMU8086更习惯CODE和DATA的命名,你可以全局替换:

  • 把_TEXT SEGMENT BYTE PUBLIC 'CODE'改成CODE SEGMENT,对应的_TEXT ENDS改成CODE ENDS
  • 把_DATA SEGMENT WORD PUBLIC 'DATA'改成DATA SEGMENT,对应的_DATA ENDS改成DATA ENDS

2. 入口点与初始化调整

Watcom生成的C程序入口是_main,EMU8086需要明确的入口标记:

  • 如果是做COM程序(适合小内存模型),在代码段开头添加org 100h
  • 把_main标签改成START,然后在文件末尾加上END START
  • 补充数据段初始化代码:在START开头加上
    MOV AX, DATA
    MOV DS, AX
    

3. 移除编译器专属内容

删掉Watcom添加的无关伪指令,比如:

  • PUBLIC _main、EXTRN ___WATCOM_XXXX:NEAR这类内部库引用
  • 任何以;开头的Watcom专属注释(保留也没关系,但删掉更简洁)

4. 注意标准库依赖

如果你的C代码用了printf这类标准库函数,Watcom生成的汇编会引用Watcom的DOS库,EMU8086没有这些库,所以建议改用纯DOS中断的无库代码,比如直接调用int 21h来输出字符串,这样生成的汇编就能直接在EMU8086运行。

举个无库C代码示例:

void print_char(char c) {
    __asm {
        mov ah, 02h
        mov dl, c
        int 21h
    }
}

void print_str(const char* s) {
    while (*s != '\0') {
        print_char(*s++);
    }
}

int main() {
    print_str("Hello EMU8086!\n");
    return 0;
}

用之前的命令生成汇编,调整后就能直接在EMU8086里运行了。

内容的提问来源于stack exchange,提问作者melanie93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:31:37