Watcom C 的笔记13 Watcom C (13)
生成 .COM 文件的 BUG? 如下程序: #include <stdint.h> main () { uint32_t wsize=64*1024,length=0x12345678; return length/wsize; } 编译命令: SET WATCOM=\watcomc set include=%watcom%\h path %watcom%\binw wcc bbb.c /ms wlink system com file bbb.obj 运行期会出现除零错误 “Divide overflow”。 查看代码发现它使用下面的代码处理这个乘法 seg000:030F mov ax, 5678h seg000:0312 mov dx, 1234h seg000:0315 xor bx, bx seg000:0317 xor cx, cx seg000:0319 call sub_104DB seg000:031C pop dx seg000:031D pop cx seg000:031E pop bx seg000:031F retn seg000:031F sub_10306 endp 子程sub_104DB是使用bx作为除数的除法过程。计算这个除法的 过程很有意思,是分开,先计算 1234h / bx ,再计算 (余数+5678h)/ bx 的。也许这样处理应该是防止结果过大溢出的吧。 如果让代码生成 DOS4GW的 EXE文件就不会有这样的问题。 暂时的猜测是 Watcom C 生成 COM 是默认在16位代码方式下的。它在处理 32位的数据上是有问题的,应该避免这样的情况。 Zoologist 2008-3-25