这可能听起来很愚蠢或懒惰。我知道ax寄存器是16位,双倍是64位。如何使用__asm将双精度转移到ax?问题更多的是,我如何将它们分解为4(16位)或者可能使用asm访问3(16位)进入双精度轴?
2部分 如何将16位(按位)传回i?
int main(void)
{
double i= 0;
__asm
{
MOV ax, i;
//Some calucation
MOV i, ax;
}
std::cout << i << std::endl;
return 0;
}
最后,什么是MOVSX和MOVSZ
答案 0 :(得分:1)
如果要将double的值转换为16位int: -
double d=3.1415;
__asm
{
push ax
fld [d]
fistp word ptr [esp]
pop ax ; ax = 3
}
并将值作为32位int: -
double d=3.1415;
__asm
{
push eax
fld [d]
fistp dword ptr [esp]
pop eax ; eax = 3
}
如果要获得浮点值的最低有效位的逐位表示: -
double d=3.1415;
__asm
{
lea edx,[d]
mov ax,[edx] ; for the lowest 16 bits
mov eax,[edx] ; for the lowest 32 bits
mov eax,[edx+4] ; for bits 32-63
; etc
}
但这并不是很有用,也很难处理,除非你做的事情就像臭名昭着的inv-sqrt技巧(在现代处理器上可能没有太大的速度)。
注意:这都是使用DevStudio 2005编写的。
答案 1 :(得分:0)
使用可以使用位掩码和位移来将您选择的16位存储在ax寄存器中。在这种情况下,您将不得不考虑位移是否将您的数字从负数变为正数(使用右移算术)。要将值移回,请在将其移动到正确位置(可能是64位)后按位或使用i和ax 位寄存器)使用位左移位。
答案 2 :(得分:0)
“我知道ax寄存器是16位,双精度是64位。如何使用__asm将双精度转换为ax?”
一个字节是8
一个单词是16
双字是32
四字是64
所以你必须说“双重双字”是64
就进入ax问题而言,我会把64位吸入堆栈,然后从其中取出4x 16位轴咬,或者2x 32位eax咬一样的东西
请记住,除非您使用堆栈地址作为指针,否则您的操作系统将决定您的pop的大小
16bit pop将指针移动2bytes
32位pop将指针移动4个字节
编辑: 如果你想做怪物寄存器那么你需要查看并研究adc和sbb,这将允许16位单位执行64位数字和32位单位来操作128位数字
所以在16位你会创建一个ax-bx-cx-dx寄存器(哇)