无法将浮点值从 fpatan 汇编程序函数返回到 C++ 程序

Trouble returning float value from fpatan assembler function back into c++ program

我在 linux 中有一个用 AT&T 汇编程序为 x64 处理器编写的小程序,并使用 fpatan 函数使用 Gnu 汇编程序对其进行了编译。我知道我可以通过其他方式获得 atan 值。我无法理解如何将在 st0-st7 寄存器中创建的浮点值移动到 C++ 程序中。

在这个例子中,我可以使用GDB查看结果值。

我的代码如下:

# trigtest1.s - An example of using the FPACOS instructions
.section .data
y: 
    .float 1.625
x: 
    .float .25

.section .bss
   .lcomm result, 4

.section .text
.globl _start
_start:
   nop
   finit
   flds y
   flds x
   fpatan
   fsts result

   movl , %eax
   movl [=10=], %ebx
   int [=10=]x80

我可以编译并link它:

as -gstabs trigtest1.s -o trigtest.o ld trigtest.o -o trigtest

在断点设置为 movl $1, %eax 单步执行程序后,使用 GDB 我得到: (gdb)x/f &结果 0x6000e0 : 1.41814697

这正是我所期待的。当我尝试在 C++ 程序中使用它时,问题就来了。首先是函数。

# asm.s - An example of using the FPATAN function
.global ArcTan
.section .data
y: 
    .float 1.625
x: 
    .float .25

.section .bss
   .lcomm result, 4

.section .text
ArcTan:
   nop
   finit
   flds y
   flds x
   fpatan
   fsts result
   nop

   ret

下面是调用汇编函数的 C++ 程序:

#include <iostream>

using namespace std;

extern "C" float ArcTan();

int main()
{

cout<<"Arctan is "<<ArcTan()<<endl;

cout<<endl;

return 0;
}

我编译并 link 使用: 作为-gstabs asm.s -o asm.o g++ -gstabs -O0 main.cpp asm.o -o runme

当我用GDB查看时,result中的值一直没有更新,一直为0。我想在C++程序中使用fpatan计算的值,但没有成功返回价值。任何帮助将不胜感激。

x86-64 returns float 在 XMM0 中,而不是旧版 x87 st0。使用
构建您的代码 g++ -m32 asm.s main.cpp -o runme 如果您想将旧版 x87 用于 FP 数学,则构建使用 32 位调用约定的 32 位代码。

请注意,您的 C++ 代码不是在读取 result,而是在读取它期望在寄存器中的函数的 return 值。如果你确实在你的 C++ 代码中使用了 extern float result;,你可以很好地阅读它。

(事实证明 Michael Petch 已经在 上写了一个完整的答案,将其作为副本关闭。)