+ -
当前位置:首页 → 问答吧 → 关于CWD指令

关于CWD指令

时间:2011-09-30

来源:互联网

C/C++ code

char *new_itoa(int val, char *buff)
{
    int l;
    int i = 0;
    int j = val;
    do
    {
        buff[i] = ((j % 10) + 0x30);    /*ascii to digit*/
        j /= 10;
        i++;
    }
    while(j != 0);
    buff[i] = 0;    /*ends with 0*/
    for(l=0,j=i-1;l<j;l++,j--)    /*reverse*/
    {
        buff[j] ^= buff[l];
        buff[l] ^= buff[j];
        buff[j] ^= buff[l];
    }
    return buff;
}



我写一个INT转CHR
new_itoa(123, buff); 这样的时候, 是正常的。没有什么问题
但是我调new_itoa(0xef61, buff);这样的时候,转换就有问题了。
我debug了一下,发现:
mov ax,si si=0xef61
mov bx,0ah (j % 10)
cwd ax=ef61 dx=ffff
idiv bx ax=fe57 dx=fffb
add dl,30h ((j % 10) + 0x30) dx=ff2b
mov bx,[bp-2]
mov [bx+di],dl buff[i] = 2b!!!

把我传的数当补码了,cwd后dx成了ffff,到最后面的存储进buff的时候取的DL就完全不对了。
我该怎么解决这个问题?
谢谢了。

作者: rotApple   发布时间: 2011-09-30

new_itoa(0x0ef61, buff);

作者: jha334201553   发布时间: 2011-09-30

你的什么编译器啊,我的VC6是两个都能正常编译通过的呀,都没有问题

作者: jha334201553   发布时间: 2011-09-30

用的TC。。。。。 郁闷的很。。。。

我用debug调试之后就是我上面写的结果,郁闷的很啊。。。

作者: rotApple   发布时间: 2011-09-30

我调new_itoa(123, buff)的时候

cwd之后ax=123 dx=0
这样的时候才是对的。

但是cwd之后ax=ef61 dx=ffff就不对了。

作者: rotApple   发布时间: 2011-09-30

哦,原来是这样啊,那是TC的问题啦,纠结的TC没有更新到32位,默认用16位

作者: jha334201553   发布时间: 2011-09-30