64位移位的问题?
我在写一个把double转换为int的汇编代码,如下
double real = 123.456;
__int64 a = 0;
__asm
{
//取指数
mov eax,dword ptr[real+4]
and eax,0x7ff00000
shr eax,20
sub eax,1023 // 现在eax存储着指数的位数
// 由于double的符号位为1,指数位为11,尾数为52,如果要把小点部分干掉,
// 那么需要移位的总数为
mov ecx,52
sub ecx,eax //位移量不可能超过255,所以位移量位于cl
// 现在取得尾数部分
mov edx,dword ptr[real+4]
mov eax,dword ptr[real]
and edx,0x000fffff // 把指数部分干掉
or edx,0x00100000 // 恢复尾数部分的最高位
// 现在EDX,EAX存储的就是real的尾数部分
// 这一步我不知道怎么解决????????????
// 伪代码是 shr (EDX-EAX),cl
// 因为不可能使用64位寄存器,所以把它们分别放在EDX和EAX
// 我查看了VC的反汇编,它调用一个过程: call __allshr,不过这个过程我们不能使用
}
也就是说,把一个64位的数,其高位放在EDX,底位放在EAX,然后如何进行移位呢?????
[解决办法]
shrd eax,edx,cl
shr edx,cl