2

アセンブリ関数内の構造体フィールドに直接アクセスすることは可能ですか?また、アセンブリを介してグローバル変数にアクセスするにはどうすればよいですか?

Intel構文のインラインアセンブリでは、次のことができます。

 struct str
 {
   int a;
   int b;
 }
 int someGlobalVar;

 __declspec(naked)   void __fastcall func(str * r)
 {
    __asm
    {
       mov dword ptr [ecx].a, 2
       mov dword ptr [ecx].b,someGlobalVar
    }
}

ATT構文(gcc)を使用してアセンブリx64関数(インラインではない)でこれを行うにはどうすればよいですか?それが不可能な場合は、インライン関数でこれを行うにはどうすればよいですか?

4

1 に答える 1

3

この多くの同様の問題に対する最も簡単な解決策は、C で必要な処理を行う例を記述し、それを使用gcc -m64 -S ...してアセンブラー ソースを生成し、そのソースを独自のアセンブリ コードのテンプレートとして使用することです。

次の例を検討してください。

#include <stdio.h>

typedef struct
{
    int a;
    int b;
} S;

int foo(const S *s)
{
    int c = s->a + s->b;

    return c;
}

int main(void)
{
    S s = { 2, 2 };

    printf("foo(%d, %d) = %d\n", s.a, s.b, foo(&s));

    return 0;
}

asm を使用して生成するgcc -Wall -O1 -m64 -S foo.c -o foo.Sと、「foo」関数について次のようになります。

.globl _foo
_foo:
LFB3:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    (%rdi), %eax
    addl    4(%rdi), %eax
    leave
    ret

ご覧のとおりmovl (%rdi), %eax、構造体の要素 a を取得し、addl 4(%rdi), %eax要素 b を追加すると、関数の結果が に返され%eaxます。

于 2011-02-07T13:09:34.553 に答える