【问题标题】:Return float st(0) or xmm0 [closed]返回 float st(0) 或 xmm0 [关闭]
【发布时间】:2020-10-07 07:12:23
【问题描述】:

用于确定将在 C++ 代码中的汇编程序块中返回的浮点值在哪个寄存器(st(0)xmm0)中的指令。

__declspec(naked) float __fastcall ln(float flt)
{
    float buf;

    _asm {
        mov buf, eax
        fld buf             // Return st(0)
    };
};

【问题讨论】:

  • 那么问题是什么?你想要什么?这只是没有上下文或真正含义的词。请阅读How to Askedit您的问题
  • 除非您的代码针对最通用的不支持 SSE 的 i386 处理器,否则编译器会更喜欢 *MM 寄存器而不是 i387 堆栈。
  • 对不起。英语不是我的母语。有一个 C++ 程序代码,在 C++ 代码里面有一个汇编块,它计算一个数的自然对数,在编译 Visual Studio 程序代码时,在某些情况下,程序期望汇编代码的结果在寄存器 st (0) 中在寄存器 xmm0 中的其他寄存器中。如何告诉visual studio汇编器插入返回xmm0寄存器中的结果?
  • 用您的代码编辑问题(可能还有生成的胶水程序集)
  • 编辑你的问题,不要放外部链接。如果你必须缩短代码。

标签: c++ visual-studio x86 calling-convention x87


【解决方案1】:

对于 32 位 x86 代码,Visual Studio 将 always use the i387 stack,因为它是调用约定。
对于 64 位 x64 代码,使用 XMM 寄存器exclusively

恐怕你别无选择,只能为不同的架构编写单独的 asm 块。如果你有一种更高级的语言,可以为它支持的每个架构生成特定的汇编代码……;)

【讨论】:

  • 我使用 /arch:SSE2 键,但 Visual Studio 仍会创建一个代码,在该代码中,当退出程序集块时,结果会从寄存器 st (0) 中保存。
  • 在一台计算机上编译时,C++代码在st(0)中等待结果,在另一台计算机上编译时,C++代码在寄存器xmm0中等待结果跨度>
  • 您确定您使用的是相同的编译器版本、编译器选项和相同的目标平台吗?
  • 我确保不同版本的做法不同,现在我正在尝试找出哪个键对此负责。
猜你喜欢
  • 2016-03-16
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
相关资源
最近更新 更多