Вычисление x * log_2 (y) с помощью сборки x86 - PullRequest
3 голосов
/ 22 февраля 2020

Таким образом, я пытаюсь заставить процессор вычислить x*log_2(y) ниже мой текущий код сборки (синтаксис nasm). У меня есть входное значение для y в регистре XMM0, и 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

Я проверил со значением 2,0 в регистре XMM0, но я всегда получаю простые нули. Что я тут не так делаю?

1 Ответ

3 голосов
/ 23 февраля 2020

FYL2X делает поп. После этого нет необходимости в FSTP.
Также операнды меняются местами. Сначала нужно сделать pu sh 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...