编译器介绍--OpenWatCOM
前言
对于16位程序的开发或许各位并不陌生。但是,随着Win32,Linux,BSD等32位操作系统的广泛应用,我想各位一定觉得:现在还有谁会用16位的开发呢?不过,你要知道,其实现在很多地方都可以有16位的开发。不但如此,因为16位的指令简洁,并没有32位的那么复杂。所以,对16位的研究就是为32位打基础。所以,即使现在32位的程序,系统广泛的应用,即使64位的系统正在陆续推出,16位仍然是不能不了解的硬件平台。
曾经看过一本上海高中学生的计算机教材,上面使用的C语言编译器是Turbo C。起先,我个人觉得很奇怪,后来才了解。原来,国内很多地方的计算机教程都是使用Turbo C作为教C语言的编译环境的。但是,Turbo C毕竟是Borland公司的产品,虽然现在你可以免费使用。但是相对来说,Turbo C已经不被Borland更新了。而且,网上很多的Turbo C的下载都不完全。
在看了FreeDOS的内核后发现,原来他们的内核的编译器用的是OpenWatCOM(虽然他也可以用Turbo C,MS C编译,但是他们推荐的是OpenWatCOM。网上下载的编译完成的内核也是OpenWatCOM编译的),所以我也就接触了一下OpenWatCOM。感觉还不错,所以在此向各位看官介绍一下。
下载,安装和设置
在盗版充斥着这个中国市场的时候,我们不得不做一个选择,购买正版,还是盗版。其实,对于前者就现在的国民收入那是不太现实的(指购买全套的开发软件)。而后者随着反盗版程序的日益先进,盗版软件也变的四处碰壁,更何况使用盗版开发工具开发出来的程序是合法的么?所以,我个人还是比较喜欢GNU和OpenSource的东西。
OpenWatCOM是一个OpenSource的工具,你可以从网上免费获得其二进制程序和源代码。并且,她也可以支持至少以下几个系统平台:DOS,Win16,Win32,OS/2。你可以从ftp://ftp.openwatcom.org/watcom/zips/ 获得最新的版本。由于,32位的开发工具现在到处都可以找到,像MinGW就是不错的开发工具。所以我们就只把OpenWatCOM作为16位开发工具吧。
你可以从上面那个FTP站点下载如下zip文件。
cm_core_all - Core binaries (All hosts)
cm_core_dos - Core binaries (DOS host)
cm_core_doswin - Core binaries (DOS & Win hosts)
cm_clib_hdr - C runtime library header files
cm_clib_a16 - C runtime libraries (16-bit all targets)
cm_clib_d16 - C runtime libraries (16-bit DOS)
clib_a16 - C runtime libraries (16-bit all targets)
clib_d16 - C runtime libraries (16-bit DOS)
core_doswin - Core binaries (DOS & Win16 hosts)
c_doswin - C compiler (DOS & Win16 hosts)
ext_dos4gw - DOS/4GW DOS extender
当然,其中有些文件如果你觉得不需要,也可以不下载。这完全取决于你自己。
当一切都下载好后,我们就要开始安装了。其实也很简单,你只要将这些ZIP文件中的文件复制到一个指定的目录中就可以了(这样的话就不用修改注册表了,也不会有无聊的垃圾文件)。当然,其中有一个文件 license.txt 会重复出现,你可以对其履盖也可以不复制,因为他们的内容都是一样的。现在我们假设你复制在 (OpenWatCOM) 处(这里是一个替代符,为了便于我后面告诉你如何设置)。
编译器的设置确实挺让人心烦的。我们要为OpenWatCOM设置如下几个环境变量,WATCOM,Path,INCLUDE,LIB。你可以通过 我的电脑->属性->高级->环境变量来设置。
添加或者修改如下变量。
WATCOM=(OpenWatCOM)
Path=%Path%;%WATCOM%/binw
INCLUDE=%WATCOM%/H
LIB=%WATCOM%/lib286;%WATCOM%/lib286/dos
注意,上面的(OpenWatCOM)是你OpenWatCOM的安装目录。另外,%Path%是指你原来Path变量的内容。
好了,直到现在你的WatCOM算是真正安装好了。现在你可以使用终端来看一下。在终端中输入 wcl 或者 wcc 可以获得一些帮助信息和版本信息。不过,wcl只是傀儡,真正有用的还是wcc。
编译程序
我们先来编译一个C文件吧。我们先生成一个如下的C文件。
//main.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("Hello World!/n");
return(0);
}
//main.c end
然后我们就用如下命令编译。
wcl main.c
我们就可以在main.c的目录中找到一个名位main.exe的程序。是不是和Turbo C的生成方式很像?
然后我们再来编译一下汇编和C结合的文件吧。不过,这里我使用的是NASM,你可以从网上免费获得,只要复制到binw目录中就可以了。(她只有两个小文件)。
我们生成如下的文件
;my.asm
global myfunction_
myfunction_:
mov ax,0x16
ret
;my.asm end
注意,这里和别的C语言有些不同,因为她的那个_是加载函数名后面。
好了,我们现在修改一下main.c
//main.c
#include <stdio.h>
#include <stdlib.h>
int myfunction(void);
int main(int argc, char *argv[])
{
printf("myfunction : %d/n",myfunction());
return(0);
}
//main.c end
如下编译
wcl -c main.c
nasm -f obj my.asm -o my.obj
wcl main.obj my.obj
编译完成后你就可以在目录中找到一个名位 main.exe的程序。运行她后,就会有如下显示。
myfunction : 22
是不是很棒?
其实还有更多的功能等你去发掘呢。如果你真的因此喜欢上16位开发,那么我推荐一个操作系统--FreeDOS。这个嘛,个人喜好。如果你像让你的程序在没有安装系统的机器上运行,FreeDOS绝对比MS-DOS来的自由。
本人就介绍到这里,希望各位如何有任何意见,问题都可以在 http://blog.csdn.net/visioncat/ 上面提出。如果您想转载我的文章或者引用我的文章,请您,当然也不是必须的,在 http://blog.csdn.net/visioncat/ 上告诉我一声。当然,这些文章你可以全篇自由复制。
我的格言:不论是程序还是思想,唯有在不断的交流下才能愈加完善。
北斗星君(黄庠魁)
二〇〇五年六月二十日
各位注意,根据某人所犯错误。让我觉得应该提醒各位。请使用 16位的 NASM编译汇编程序。因为WatCOM是16位编译器,如果用32位的NASM编译,会不出现问题。请使用16位NASM(即在DOS下运行的NASM)。谢谢