2015-06-07 4 views
2

Я не знаю, в чем проблема, потому что это отлично работает для SIN и COS. Для TAN он возвращает 0.0000 для 50.0 радиан. Но если я включил прокомментированную строку, она работает так, как ожидалось. Это странно, потому что TAN должен возвращать двойной в XMM0, а не RAX.FASM: Calling Tangent from GCC

;./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

'RAX' (фактически' AL') ​​должно содержать количество используемых регистров XMM – user35443

+0

Теперь вот в чем проблема. RAX не должен участвовать. Я ожидал, что возвращаемое значение в XMM0 будет использоваться далее printf как 2-й аргумент. – royalfinest

ответ

2

При вызове любой функции в сборке x86-64, AL должен содержать количество используемых регистров. Это соглашение, вы не можете этого избежать.

переменной аргумент подпрограмма требует значения в RAX для числа векторных регистров, используемого.

RAX - временный регистратор; с переменными аргументами передает информацию о количестве используемых векторных регистров; 1-й регистр возврата.

Вы можете ознакомиться с System V Application Binary Interface, глава 3.2.3 Передача параметров.

Следовательно, вам необходимо указать количество параметров, которые вы используете в rax.

movq rax, 1 

должно быть достаточно.

+0

Был ли у вас «mov rax, 1»? Благодарим вас за ответ. Но проблема в том, что я не должен явно устанавливать RAX в 1 при использовании SIN и COS. – royalfinest

+0

'movq' и' mov' - это просто альтернативы. В любом случае, вам это не нужно, потому что 'sin' и' cos' не имеют переменного количества параметров, например 'printf'; им просто нужен один вход, поэтому они не требуют '1' в' rax'. – user35443

+0

Я смущен, брат. Предполагаете ли вы, что TAN нуждается в RAX = 1? – royalfinest