FASM:从 GCC 调用 Tangent
FASM: Calling Tangent from GCC
我不知道问题出在哪里,因为这对 SIN 和 COS 非常有效。对于 TAN,它 returns 0.0000 代表 50.0 弧度。但如果我启用注释行,它会按预期工作。这很奇怪,因为 TAN 应该 return 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
这可能是什么问题?
在 x86-64 程序集中调用任何函数时,AL
必须包含使用的寄存器数。这是惯例,你无法避免。
Variable-argument subroutines require a value in RAX
for the number
of vector registers used.
RAX
is a temporary register; with variable arguments passes information about the number of vector registers used; 1st return register.
可以参考System V Application Binary Interface章节3.2.3参数传递。
因此,您需要在rax
中指定您使用的参数个数。
movq rax, 1
应该够了。
我不知道问题出在哪里,因为这对 SIN 和 COS 非常有效。对于 TAN,它 returns 0.0000 代表 50.0 弧度。但如果我启用注释行,它会按预期工作。这很奇怪,因为 TAN 应该 return 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
这可能是什么问题?
在 x86-64 程序集中调用任何函数时,AL
必须包含使用的寄存器数。这是惯例,你无法避免。
Variable-argument subroutines require a value in
RAX
for the number of vector registers used.
RAX
is a temporary register; with variable arguments passes information about the number of vector registers used; 1st return register.
可以参考System V Application Binary Interface章节3.2.3参数传递。
因此,您需要在rax
中指定您使用的参数个数。
movq rax, 1
应该够了。