4

nasmとC++へのリンクについて質問があります。litteテスト関数を次のように宣言します

extern "C" void __cdecl myTest( byte i1, byte i2, int stride, int *width );

そして私はそれをこのように呼びます:

byte i1 = 1, i2 = 2;
int stride = 3, width = 4;
myTest( i1, i2, stride, &width );

このメソッドは、アセンブリをデバッグし、スタックポインタを使用して引数を取得する方法を確認するためにのみ機能します。それを超えると、ポインタ引数の値を7に設定して、それがどのように機能するかを理解する必要があります。これは次のように実装されます。

    global _myTest

_myTest:
    mov     eax, [esp+4]     ; 1
    mov     ebx, [esp+8]     ; 2
    mov     ecx, dword [esp+16]    ; width
    mov     edx, dword [esp+12]    ; stride

    mov eax, dword [esp+16]
    mov dword [eax], 7

    ret

経由してコンパイル

yasm -f win32 -g cv8 -m x86 -o "$(IntDir)\$(InputName).obj" "$(InputPath)"

、次にc++アプリにリンクします。デバッグモードでは、すべてが正常に機能します。関数は数回呼び出され、期待どおりに機能しますが、リリースモードでは、関数は1回機能しますが、後続のプログラム操作は失敗します。スタック/フレームポインタの近く/遠くに何か問題があるように思えますが、私はこの主題にまったく慣れておらず、少し助けが必要です。前もって感謝します!a。

4

2 に答える 2

1

ebxさて、私はプッシュ/ポップを介して保存する必要があるようです。

于 2010-03-19T21:05:59.580 に答える
0

これが役立つかもしれません:FLACは、nasmによってコンパイルされることを意図したアセンブラーでいくつかのソースを使用します。

于 2010-03-19T21:46:18.997 に答える