如何让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
相关产品推荐
相关产品推荐

