我不知道问题是什么,因为这适用于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
这可能是什么问题?
答案 0 :(得分:2)
在x86-64程序集中调用任何函数时,AL
必须包含所使用的寄存器数。这是惯例,你无法避免。
变量参数子例程需要
RAX
中的值作为数字 使用的向量寄存器。
RAX
是一个临时登记册;带有变量参数传递有关所用向量寄存器数量的信息;第一次返回登记。
您可以参考System V Application Binary Interface, 3.2.3参数传递一章。
因此,您需要指定rax
中使用的参数数量。
movq rax, 1
应该足够了。