Function 修改ASM中的给定变量

Function 修改ASM中的给定变量,function,variables,assembly,x86,Function,Variables,Assembly,X86,这是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 f

这是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;
}
现在,我想知道我是否可以做同样的事情,而不必在eax中存储t。只需使用ebp即可。但我不确定“a”会在哪里(ebp+28或ebp),以及是否可能。这似乎不起作用。是否有人认为这是可能的,以及如何做到

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

无法在程序集中任意嵌套表达式。这就是高级语言被发明的目的。换句话说,是的,如果要取消引用,必须将
t
的值加载到寄存器中。程序集不支持类似的构造

mov     dword ptr [[ebp+28]], 0
这就是你的目标
ebp+28
不是
t->a
的地址;这是
t
的地址,它是
t->a
的地址

此外,程序集代码段将
t->a
t->b
都归零,而C代码段只将
a
归零。它们不是等价物