修改ASM中的给定变量

时间:2013-02-18 21:07:12

标签: 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 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

1 个答案:

答案 0 :(得分:2)

在汇编时无法对表达式进行任意嵌套。这就是发明高级语言的原因。换句话说,是的,如果要取消引用它,则必须将t的值加载到寄存器中。程序集不支持像

这样的结构
mov     dword ptr [[ebp+28]], 0

这是你的目标。 ebp+28不是t->a的地址;它是t的地址,t->a的地址。

此外,程序集片段将t->at->b都清零,而C只执行a。它们并不等同。