c++ - 如何将 float 作为参数传递(内联汇编)?

标签 c++ assembly x86 inline-assembly calling-convention

如何将 float 作为函数参数(外部调用)传递并在内联汇编中返回 float?下面的示例不起作用并且使应用程序崩溃。这些评论是我的,所以它们也可能是错误的。

前两行是我自己加的,只是为了这个例子。最初我从 st(0) 和 st(1) 上的两个浮点值开始,对此我无能为力。

fld     a               ; load float 'a' on st(0)
fld     b               ; load float 'b' on st(0), 'a' is now st(1)
sub     esp, 4          ; make room for float 
fstp    dword ptr [esp] ; push st(0) on stack, pop st(0)
mov     ecx, ebp        ; move 'this' on ecx
call    Class::ModValue ; returns float on st(0)
fcompp                  ; compare returned st(0) with st(1)    
fnstsw  ax
test    ah, 41h
jnz     Exit_label

上面的代码片段在 asm{} block 中,前后有更多不重要的代码。崩溃发生在该代码片段的第一行和 ModValue 函数调用之间。

函数签名:

float Class::ModValue(float value)
{
    _LOG("ModValue") // doesn't show
    return value;
}

编译器:VisualStudio,架构:x86,调用约定:__thiscall

最佳答案

如果它是一个__thiscall

根据msdn:

__thiscall 调用约定用于成员函数,是不使用可变参数的 C++ 成员函数使用的默认调用约定。在 __thiscall 下,被调用者清理堆栈,这对于 vararg 函数来说是不可能的。在 x86 架构上,参数从右到左压入堆栈,this 指针通过寄存器 ECX 传递,而不是压入堆栈。

来源:https://msdn.microsoft.com/en-us/library/ek8tkfbw.aspx

然后是一个小例子:

float DoStuffs(void *pThis, float a)
{
    float flResult = 0.0f;

    __asm
    {
        push a;
        mov ecx, pThis;
        call Class::ModValue;
        fstp[flResult];
    }
    return flResult;
}

一些扩展示例:

class Test
{
public:
    float b;   
    float Add(float a);

};

float Test::Add(float a)
{
    return a + this->b;
}

float CallTest(void* pThis, float x)
{
    float flResult = 0.0f;

    __asm
    {
        push x;
        mov ecx, pThis;
        call Test::Add;
        fstp[flResult];
    }

    return flResult;
}

int main()
{
    void* m = malloc(4);

    *(float*)m = 2.0f;

    std::cout << CallTest(m, 2.1f) << std::endl;

    return 0;
}

关于c++ - 如何将 float 作为参数传递(内联汇编)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49590137/

相关文章:

assembly - 在我的程序启动之前堆栈上有什么?

x86 - 当我从内联汇编中调用 C++ 函数时,如何将参数传递给它们

assembly - 如何在 Assembly 中使用 scasb 查找字符串长度

C++比较一个字符

c++ - Python ctypes 调用简单的 c++ dll

c++ - 推导除一个模板参数外的所有参数?

c++ - 找到相对于任意原点的两点之间的顺时针角度

ios - XCode 7 : How to assemble armv7, arm64 和 x86 .S 文件分开?

python - 你对这些汇编助记符有什么建议吗?

c++ - 如何做类似 "is_atomically_assignable"的事情?