使用x86程序集计算x * log_2(y)

问题描述 投票:2回答:1

所以我正试图让处理器计算下面的x*log_2(y),这是我当前的汇编代码(nasm语法)。我在XMM0寄存器中输入了y的输入值,X的常数为10。

    MOVSD QWORD [RSP], XMM0 ;Copy result of prev calculation to the stack
    FLD QWORD [RSP] ;Load the float from XMM0 to the fpu stack

    ;Load number 10 to the fpu stack
    MOV RAX, 10
    PUSH RAX
    FLD QWORD [RSP] ;ST(0)
    POP RAX
    ;Do the math y = xmm0, x=10 X*LOG2(Y)
    FYL2X ;ST(1) = OUT
    FSTP ;just remove ST(0), no need to preserve
    FSTP QWORD [RSP];Pop the result from the logarithm to the stack

    MOV RDI, QWORD [RSP]

    call printfcallfloat

我已经在XMM0寄存器中测试了2.0的值,但是我总是得到纯零。我在这里错了吗?

assembly floating-point x86-64 logarithm
1个回答
1
投票

FYL2X弹出。之后不需要FSTP。此外,操作数是相反的。它需要先推10。要加载整数,请使用FILD,而不是FLD。

;Load number 10 to the fpu stack
PUSH 10
FILD QWORD [RSP]

MOVSD QWORD [RSP], XMM0 ;Copy result of prev calculation to the stack
FLD QWORD [RSP] ;Load the float from XMM0 to the fpu stack

;Do the math x = xmm0, y = 10; y * LOG2(x)
FYL2X
FSTP QWORD [RSP];Pop the result from the logarithm to the stack

POP RDI
call printfcallfloat
© www.soinside.com 2019 - 2024. All rights reserved.