1

C++ ビジュアルで、インライン アセンブリを使用する必要があるときにラベルを設定する方法を教えてください。たとえば、次のようになります...

__asm
{
    PUSH EAX
    PUSH VAR1
    MOV ECX,DWORD PTR DS:[VAR2]
    CALL DWORD PTR DS:[VAR3]
    JMP VAR4
}

VAR変数が値またはアドレスにリンクする場所

私は次のことを試しました

DWORD   VAR2 = 0x991770;    //0x991770 is the location of the function

__asm
{
    ..code
    MOV ECX,DWORD PTR DS:[VAR2]
    ..code
}

しかし、その後アプリがクラッシュします。これはどのように行われますか?

4

2 に答える 2

1

offset variableNameインライン アセンブリから変数にアクセスするために使用します。こちらのリファレンスを参照してください

例:

char format[] = "%s %s\n";
char hello[] = "Hello";
char world[] = "world";
int main( void )
{
   __asm
   {
      mov  eax, offset world
      push eax
      mov  eax, offset hello
      push eax
      mov  eax, offset format
      push eax
      call printf
      //clean up the stack so that main can exit cleanly
      //use the unused register ebx to do the cleanup
      pop  ebx
      pop  ebx
      pop  ebx
   }
}
于 2012-07-02T16:10:37.987 に答える
0

C 変数名はインライン アセンブリで表示されます。したがって、データ アクセスが必要な場合は、var 名を記述します。

int var2 = 3;
__asm
{
    mov ecx, var2

これは、適切なメモリ アクセス ステートメントにコンパイルされます。

コード ラベルの場合は、実際のアセンブリのように宣言するだけです。

Label1:
    mov ecx, 0
    jmp Label1    

外部関数もラベルと見なされます。ただし、名前マングリングは適用されます。

汎用レジスタとして現在の IP の数値が必要な場合、直接コマンドはありませんが、非常に簡単な回避策があります。

    call Next
Next:
    pop eax ; eax now is the value of IP at the current point

ああ、そのことは忘れてくださいds:。あなたは今フラットランドにいます - ドアでセグメント登録をチェックしてください.

于 2012-07-02T16:10:46.373 に答える