2013-02-18 43 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。它們不相同。