6

インラインアセンブラについて質問です。同じ関数内でインラインアセンブラから別のアセンブラサブルーチンを呼び出すことは可能ですか? 例えば:

void FindValidPID(unsigned int &Pid) 
{
    __asm
    {
        sub esp, 20h
        mov eax, Pid
        add eax,eax
        call sub123 ; another assm subroutine
        mov Pid, eax
        add esp, 20h
    }
}

サブルーチン sub123 はどこに、どのように記述すればよいですか?

乾杯、
トーマス

4

4 に答える 4

2

サブルーチン全体をアセンブリで記述している場合は、インラインではなくファイル レベルのアセンブラを使用することを検討する必要があります。

于 2010-02-08T11:16:39.680 に答える
1

アセンブラで書かれたサブルーチンがあるとします_func2(私は NASM 構文しか知りません)。

    global  _func2

    section .text
_func2:
    ret

このサブルーチンは、次のように C++ コードから呼び出すことができます

extern "C" {
void func2();
}

void func1()
{
    __asm {
        call func2
    }
}

int main()
{
    func1();
}

もちろんfunc2、ブロックを持つ C/C++ 関数にすることもでき__asmます。

于 2010-02-08T13:01:11.610 に答える
1

構文から、使用されているコンパイラは VC++ であると思いますか? その場合、ネイキッド関数 ( http://msdn.microsoft.com/en-us/library/5ekezyy2(VS.80).aspx ) を使用すると、アセンブリ言語コードから簡単に呼び出すことができる関数を定義できます。

(Naked 関数は C++ にも表示されるため、C++ からも呼び出すことができ、間違った結果が得られる可能性があります...そのため、注意が必要です!)

于 2010-02-08T13:14:42.357 に答える
0

最初の関数と同じように他の関数を作成してから、のようなマングル名で呼び出すことで、これを行うことができますcall __GLOBAL__I_sub123;

extern "C"物事を簡単にするためにそれを宣言するのは良い考えかもしれません。

gcc -S file.cppgccでは、関数のマングルされた名前を確認するために使用できます。

于 2010-02-08T13:09:46.073 に答える