FASM:从GCC调用Tangent

时间:2015-06-07 11:31:37

标签: gcc assembly fasm

我不知道问题是什么,因为这适用于SIN和COS。对于TAN,它返回0.0000表示50.0弧度。但是,如果我启用了注释行,它将按预期工作。这很奇怪,因为TAN应该在XMM0中返回一个双精度数,而不是RAX。

;./fasm testing.asm
;gcc -s testing.o -o testing -lm
format elf64
extrn printf
extrn tan

section '.data' writeable align 16
rad dq 50.0
fmt db "%.5lf",0ah,0

section '.text' executable align 16
public main
main:
    push rbp
    mov rbp,rsp

    pxor xmm0,xmm0
    movq xmm0,[rad]
    call tan
    ;movq rax,xmm0  ;works if I enable this. but SIN and COS don't need this
    mov rdi,fmt
    call printf

    mov rsp,rbp
    pop rbp
    ret

这可能是什么问题?

1 个答案:

答案 0 :(得分:2)

在x86-64程序集中调用任何函数时,AL必须包含所使用的寄存器数。这是惯例,你无法避免。

  

变量参数子例程需要RAX中的值作为数字   使用的向量寄存器。

     

RAX是一个临时登记册;带有变量参数传递有关所用向量寄存器数量的信息;第一次返回登记。

您可以参考System V Application Binary Interface 3.2.3参数传递一章。

因此,您需要指定rax中使用的参数数量。

movq rax, 1

应该足够了。