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