【问题标题】:How do I return floating point values in NASM?如何在 NASM 中返回浮点值?
【发布时间】:2014-10-13 01:44:24
【问题描述】:

我试图在 NASM 中返回一个浮点值。它总是显示“-nan”。

使用:

  • NASM 版本 2.10.09 于 2013 年 12 月 29 日编译
  • g++ 4.8

ma​​in.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,请链接它们。

【问题讨论】:

  • 您是否检查过您的平台对extern "C" 的调用约定?
  • 这里有一个简单的方法:编写一个返回double的C函数,将其编译为汇编,并在您自己的汇编函数中,模仿汇编代码的最后一条指令,这无疑会尊重您平台的 ABI。
  • x86-64 使用 xmm 寄存器进行浮点数。请参阅 ABI 文档,而不是尝试对编译器生成的代码进行逆向工程;)

标签: c++ assembly floating-point nasm x86-64


【解决方案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

制作并运行:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多