2014-12-07 42 views
-2

我在linux 64位上链接我的汇编函数与GCC。我使用的库是math.h中的TAN。我把它链接起来;C函数的TAN在64位GCC中返回值的位置?

gcc -s prog.o -o prog -lm 

该程序的工作原理,但返回值为0.0000000(3.4弧度)。我在汇编代码中使用extrn;

extrn tan 
extrn printf 

我使用xmm0将参数(弧度)传递给TAN函数。现在我不确定哪个寄存器用于从TAN返回值。是xmm0,st0还是RAX?我找不到一个体面的参考。

+4

这是'xmm0'。参考文献是[x86-64 abi文档](http://www.x86-64.org/documentation_folder/abi.pdf),不知道为什么找不到它。 – Jester 2014-12-07 02:34:09

+0

然后确定它的xmm0。 TBH,我无法阅读AT&T。看到这样一个重要的参考文献是用AT&T编写的,这让我感到很伤心。大声笑。谢谢。 – royalfinest 2014-12-07 02:38:02

+2

在&t学习大约需要5分钟的时间。无论如何,对于它所说的“xmm0”用于返回值的部分,您甚至不需要那么多。 – Jester 2014-12-07 02:46:33

回答

0

对于我的gcc,它是xmm0。

这里有一个C程序:

#include <stdio.h> 
#include <math.h> 

int main() { 

    double x = tan(M_PI/4.0); 
    // RESULT: x=1.000000 
    printf ("x=%f\n", x); 
    return 0; 
} 

而这里的相应的 “GCC -S”:

.Ltext0: 
     .section  .rodata 
.LC1: 
     .string "x=%f\n" 
     .text 
     .globl main 
     .type main, @function 
main: 
.LFB0: 
     .file 1 "x.cpp" 
     .loc 1 4 0 
     .cfi_startproc 
     pushq %rbp 
     .cfi_def_cfa_offset 16 
     .cfi_offset 6, -16 
     movq %rsp, %rbp 
     .cfi_def_cfa_register 6 
     subq $32, %rsp 
.LBB2: 
     .loc 1 6 0 
     movabsq $4607182418800017407, %rax 
     movq %rax, -8(%rbp) 
     .loc 1 8 0 
     movq -8(%rbp), %rax 
     movq %rax, -24(%rbp) 
     movsd -24(%rbp), %xmm0 
     movl $.LC1, %edi 
     movl $1, %eax 
     call printf 
     .loc 1 9 0 
     movl $0, %eax 
.LBE2: 
     .loc 1 10 0 
     leave 
     .cfi_def_cfa 7, 8 
     ret 
     .cfi_endproc 
+0

我无法在&t处阅读。但是,嘿,谢谢你提供的答案。 – royalfinest 2014-12-07 02:41:00

+0

任何地方都不会调用'tan()',也不会在该汇编列表中提供任何浮点指令。请注意[tan(pi/4)= 1.0](https://www.google.com/search?safe=off&q=tan(pi%20%2F%204))。编译器认识到这一点,并在*编译时*执行计算。如果你看看你发布的代码,你会看到'movabsq $ 4607182418800017407,%rax'。将该值解释为“双”,我们可以看到它是〜'1.0'。进入'xmm0'的mov设置为调用'printf' - 第一个浮点参数在'xmm0'中传递。 – 2014-12-07 15:06:51