2014-12-07 2 views
-2

저는 리눅스 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 documentation] (http://www.x86-64.org/documentation_folder/abi.pdf)입니다. 왜 찾을 수 없는지 확실하지 않습니다. – Jester

+0

그런 다음 xmm0을 입력하십시오. TBH, 나는 AT & T를 읽을 수 없다. 그것은 AT & T에서 쓰여진 중요한 참고 자료를보기 위해 내 마음을 아프게합니다. LOL. 감사. – royalfinest

+2

& t에서 배우는 데는 약 5 분이 걸립니다. 어쨌든'xmm0'가 값을 반환하는 데 쓰이는 부분에 대해서는 그렇게 많이 필요하지 않습니다. – Jester

답변

0

내 gcc는 xmm0입니다.

#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"를 다음과 같습니다 :

는 여기에 C 프로그램의

.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

+0

어디서나'tan()'을 호출하거나 그 어셈블리 목록에있는 부동 소수점 명령어가 없습니다. [tan (pi/4) = 1.0] (https://www.google.com/search?safe=off&q=tan (pi % 20 % 2F % 204))에 유의하십시오. 컴파일러는 이것을 인식하고 * compile time *에서 계산을 수행했습니다. 게시 한 코드를 보면'movabsq $ 4607182418800017407, % rax'라고 표시됩니다. 이 값을'double'으로 해석하면 ~ 1.0입니다. 'xmm0'에 대한 mov가'printf'에 대한 호출을 설정하고 있습니다 - 첫 번째 부동 소수점 인수는'xmm0'에 전달됩니다. –

관련 문제