这是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
答案 0 :(得分:2)
在汇编时无法对表达式进行任意嵌套。这就是发明高级语言的原因。换句话说,是的,如果要取消引用它,则必须将t
的值加载到寄存器中。程序集不支持像
mov dword ptr [[ebp+28]], 0
这是你的目标。 ebp+28
不是t->a
的地址;它是t
的地址,t->a
的地址。
此外,程序集片段将t->a
和t->b
都清零,而C只执行a
。它们并不等同。