2013-02-18 46 views
0

给出的变量这是ASM代码:修改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 

回答

2

表达式的任意嵌套在汇编中是不可能的。这就是发明高级语言的原因。换句话说,是的,如果你想解引用它,你必须将t的值加载到寄存器中。大会不支持结构像

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

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

另外,汇编代码段为零,同时t->at->b,而C只有a。它们不相同。