簡體   English   中英

如何將float作為參數傳遞(內聯匯編)?

[英]How to pass float as argument (inline-assembly)?

如何將float作為函數參數傳遞(外部調用)並在內聯匯編中返回float? 下面的示例不起作用,並且使應用程序崩潰。 這些評論是我的,因此它們也可能是錯誤的。

僅針對此示例,我自己添加了前兩行。 最初,我從st(0)和st(1)上的兩個float值開始,對此我無能為力。

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{}塊中,在此之前和之后還有更多不重要的代碼。 崩潰發生在此代碼片段的第一行和ModValue函數調用之間。

功能簽名:

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

編譯器:VisualStudio,體系結構:x86,調用約定: __thiscall

如果是__thiscall

根據msdn:

__thiscall調用約定在成員函數上使用,並且是不使用變量參數的C ++成員函數使用的默認調用約定。 在__thiscall下,被調用方將清理堆棧,這對於vararg函數是不可能的。 在x86架構上,參數從右向左推入堆棧,並且此指針通過寄存器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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM