c ++ __asm代码(如何将double转换为ax)

时间:2013-05-10 13:55:31

标签: c++ assembly

这可能听起来很愚蠢或懒惰。我知道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

3 个答案:

答案 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寄存器(哇)