-3

这听起来可能很愚蠢或懒惰。我知道 ax 寄存器是 16 位的,而 double 是 64 位的。如何使用 __asm 将 double 转移到 ax?问题更多的是,我如何将它们分解为 4(16 位)或访问 3(16 位)以使用 asm 进入双轴?

Part2 如何将 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

4

3 回答 3

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 编写的。

于 2013-05-11T09:45:55.343 回答
0

“我知道 ax 寄存器是 16 位,双精度是 64 位。如何使用 __asm 将双精度转移到 ax?”

一个字节是 8

一个字是16

双字是32

一个四字是64

所以你一定是说“双双字”是64

就将其放入 ax 而言,我会考虑将 64 位放入堆栈,然后从中取出 4x 16 位 ax 咬,或者 2x 32 位 eax 咬有点东西

请记住,除非您使用堆栈地址作为指针,否则您的操作系统将决定弹出窗口的大小

16bit pop 将指针移动 2bytes

32bit pop 将指针移动 4 个字节

编辑:如果你想做怪物寄存器,那么你需要查看并研究 adc 和 sbb 这将允许 16 位单元处理 64 位数字和 32 位单元来操作 128 位数字

因此,在 16 位中,您将创建一个 ax-bx-cx-dx 寄存器(哇)

于 2013-05-11T09:27:04.890 回答
0

使用可以使用位掩码和位移位将您选择的 16 位存储在 ax 寄存器中。在这种情况下,您将不得不考虑位移是否将您的数字从负数更改为正数(使用右移算术)。要将值向后移动,请在使用向左移位将其移动到正确位置(可能在 64 位寄存器中)后,按位或在 i 和 ax 上使用。

于 2013-05-10T14:17:08.423 回答