[March , 25, 2008] 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

发表评论

电子邮件地址不会被公开。 必填项已用*标注