无法将浮点值从 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 已经在 上写了一个完整的答案,将其作为副本关闭。)
我在 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 已经在