c++ - 内联汇编程序直接将 double 转换为 long long

标签 c++ visual-studio-2005 x86 inline-assembly

由于优化原因,我想到了直接调用(使用内联汇编程序) 到功能“fldl”和“拳头”。可悲的是,我不知道如何运行它,因为我不是汇编程序的神。

我没有比这更进一步:

double* input;         
long long output;

__asm fldl input;      
__asm fist output;

最佳答案

__asm fld input 实际上会尝试读取您的指针 值,就好像它是一个浮点值一样。如果要读取指针指向的浮点值,则必须经过两步过程:将地址读入寄存器,然后使用寄存器中的地址读取数据.在 32 位平台上,它将类似于

__asm {
  mov eax, input
  fld qword ptr [eax]
  fistp output
}

我刚刚在 VS2005 中尝试过,它可以工作。 (请注意,正如其他人在评论中所述,fist 不支持存储到 64 位 long long,而 fistp 支持。但是你无论如何,可能都需要 fistp,即快闪店。)

关于c++ - 内联汇编程序直接将 double 转换为 long long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649475/

相关文章:

c++ - 如何在没有额外拷贝的情况下从 std::map 安全地获取 "pop-front"?

c++ - 在 C++ 中替换对象自身

c# - WinForms TabOrder 工具 : Broken or just confusing?

assembly - JE 的跳跃距离有限制吗?

c++ - 在没有指针的情况下复制 C 字符串中的单个字符

c++ - Qt - 关于如何在 UI 窗体之间实现导航的任何指南?

visual-studio-2005 - 是什么导致 UMDH 无法提供堆栈跟踪

visual-studio - 在VS 2005中使用Vista图标的最简单方法?

c++ - 使用 SSE 内在函数编译一个简单的 c++ 程序

c - 避免 gcc 函数序言开销?