0

これは ASM コードです。

__declspec(naked) void foo(something* t)
{
__asm {
push    ebp
mov ebp, esp
mov eax, dword ptr [t]
mov dword ptr [eax], 0
mov dword ptr [eax+4], 0
mov esp, ebp
pop ebp
}

これはコードの C バージョンになります。

struct something {
_int64 a;
_int64 b;
_int64 c;
};

void foo(struct* something) {
something->a = 0;
}

さて、t を eax に格納せずに同じことができるかどうか疑問に思っています。代わりに ebp を使用してください。しかし、「a」がどこにあるのか (ebp+28 または ebp)、それが可能かどうかさえわかりません。これはうまくいかないようです。これが可能なら誰でも、どうやって?

mov     dword ptr [ebp+28], 0
mov     dword ptr [ebp+24], 0
4

1 に答える 1

2

アセンブリでは、式を任意にネストすることはできません。それが、高水準言語が発明された理由です。言い換えれば、はい、t逆参照したい場合は、の値をレジスタにロードする必要があります。アセンブリは次のような構造をサポートしていません

mov     dword ptr [[ebp+28]], 0

それはあなたが目指しているものです。ebp+28のアドレスではありませんt->a。のアドレスです。tこれは のアドレスですt->a

また、アセンブリ スニペットは と の両方t->aをゼロに設定しますt->bが、C のスニペットは のみを設定しaます。それらは同等ではありません。

于 2013-02-18T21:25:07.117 に答える