我试着理解[c code - >汇编代码
void node::Check( data & _data1, vector<data2*>& _data2)
{
-> push ebp
-> mov ebp,esp
-> push ebx
if (TryToCheck(_data1.a, _data1.b))
-> mov ebx,dword ptr [_data1]
我不确定这条线的作用 这一行是什么意思,
push esi
mov esi,ecx
ecx
是我知道的计数值。
为什么要在ecx
中保存esi
的值?
mov eax,dword ptr [esi+50h]
这是什么意思,50h
?
mov eax,dword ptr [eax+4]
lea edx,[ebx+40h]
lea ecx,[esi+50h]
push edx
lea edx,[ebx+50h]
push edx
call eax
test al,al
je node::Check+7Fh
答案 0 :(得分:0)
push ebp
mov ebp,esp
这会保存调用者的堆栈帧指针(push ebp
)并设置堆栈帧指针(mov ebp,esp
)。
push ebx
这会在堆栈上保存ebx
。稍后,在返回之前,您将看到pop ebx
。
mov ebx,dword ptr [_data1]
这会将位置_data1
的内容移动到ebx
寄存器中。调试器显示符号名称;如果你仔细观察,你会看到move ebx,dword ptr [ebp+12]
。这里使用ebp
中的堆栈帧指针访问调用者的参数。
push esi
mov esi,ecx
这会保存esi
,然后将ecx
的值移至esi
。
mov eax,dword ptr [esi+50h]
这会将esi+50h
的内存位置值移动到eax
。
有时候你并不担心编译器生成的汇编程序。它可能是次优的,或者可能是如此优化,以至于您无法识别原始陈述。