Как вернуть значения с плавающей точкой в NASM?

0

Я пытаюсь вернуть значение с плавающей запятой в NASM. Он всегда отображает "-nan".

С помощью:

  • NASM версии 2.10.09 составлен на 29 декабря 2013 года
  • g++ 4,8

main.cpp:

#include <iostream>
extern "C" double _main();

int main()
{
    std::cout << _main() << std::endl;

    return 0;
}

_main.asm:

global _main

segment .data
val: dq 123.321

segment .text
_main:

    PUSH rbp
    MOV rbp, rsp

    FINIT
    FLD qword [val]

    MOV rsp, rbp
    POP rbp

RET

Если у кого-то есть учебники и/или инструкции, например, для онлайн-использования в NASM, пожалуйста, соедините их.

  • 0
    Вы проверили соглашения о вызовах вашей платформы для extern "C" ?
  • 4
    Вот простой способ: написать функцию C, которая возвращает double , скомпилировать ее в ассемблер, и в вашей собственной функции ассемблировать имитировать последние инструкции кода ассемблера, которые, несомненно, будут уважать ABI вашей платформы.
Показать ещё 1 комментарий
Теги:
floating-point
assembly
x86-64
nasm

1 ответ

1
Лучший ответ

Используйте movsd для загрузки скалярного double в регистр XMM.

Для файлов:

caller.cpp:

#include <iostream>
using namespace std;
extern "C" double asmfunc();

double val = 123.321;

double dubidoo ()
{
    return val;
}

int main ()
{
    cout << "dubidoo: " << dubidoo() << endl;
    cout << "asmfunc: " << asmfunc() << endl;

    return 0;
}

callee.asm:

segment .data
    val: dq 123.321

section .text
global asmfunc

asmfunc:
    movsd    xmm0, [val]
    ret

make & run:

nasm -felf64 callee.asm
g++ Wl,callee.o caller.cpp
./a.out

Ещё вопросы

Сообщество Overcoder
Наверх
Меню