我有一个用AT&T汇编器编写的用于Linux 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 $1, %eax
movl $0, %ebx
int $0x80
我可以编译并链接到:
as -gstabs trigtest1.s -o trigtest.old trigtest.o -o trigtest
使用GDB在程序中设置断点为movl $ 1之后,%eax,我得到:(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;
}
我使用以下命令进行编译和链接:as -gstabs asm.s -o asm.og ++ -gstabs -O0 main.cpp asm.o -o runme
[当我使用GDB查看正在发生的情况时,结果的值永远不会更新,并保持为0。我想在C ++程序中使用通过fpatan计算的值,但未成功返回该值。任何帮助将不胜感激。
x86-64在XMM0中返回float
,而不是旧版x87 st0
。使用构建代码g++ -m32 asm.s main.cpp -o runme
如果您想将旧版x87用于FP数学,则构建使用32位调用约定的32位代码。
[请注意,您的C ++代码没有读取result
,它正在读取它期望在寄存器中的函数的返回值。如果确实在C ++代码中使用了extern float result;
,则可以正常阅读。