【问题标题】:MASM32 function that multiplies two double precision numbers and returns itMASM32 函数,将两个双精度数相乘并返回
【发布时间】:2014-03-28 17:46:23
【问题描述】:

我需要编写应该使用 SSE2 将弧度转换为度数的函数。 这是为了分配。我不知道该怎么做。

_180_PI 是等于 180/3.141592 的数字... 我的函数只需要返回return rad * _180_PI

这个函数在 dll 中,它是这样声明的:

__declspec(dllexport) double __stdcall RadToDegAsm(double rad);

我有:

.DATA
    _180_PI dq 57.2957795130823208767981548141

.CODE

RadToDegAsm PROC rad: QWORD
    movupd xmm0, rad
    mulsd xmm0, _180_PI
    ;I need to somehow return it
RadToDegAsm ENDP

主要问题: 如何返回 xmm0 寄存器的 64 位(双)内容,以便它适用于给定的声明?

【问题讨论】:

  • 你应该使用movsd 来加载参数并且你在最后缺少一个ret,除非ENDP 把它放在那里。否则应该没问题,请问您遇到了什么问题?
  • C 代码是构建为 64 位还是 32 位代码?
  • 它是 x86。而且我没有完成那个函数,因为我不知道如何从 asm __stdcall 函数返回 double 。在 eax 中返回正常的 32 位数字。但是双倍(64 位)?

标签: assembly x86 sse masm32 sse2


【解决方案1】:

搞定了:

.DATA
    _180_PI dq 57.2957795130823208767981548141
.CODE

RadToDegAsm PROC rad: QWORD
    LOCAL returnValue: QWORD
    movsd xmm0, rad
    mulsd xmm0, _180_PI
    movsd returnValue, xmm0
    fld return
    ret
RadToDegAsm ENDP

double 值通过浮点寄存器 (fld) 指令返回。

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 2012-11-19
    • 2019-08-27
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多