我尝试理解[c代码 -> 汇编]代码
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
最佳答案
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
中。
有时您不必太担心编译器生成的汇编程序。它可能不是最优的,也可能是优化过度导致您无法识别原始语句。
关于c - 我尝试理解 [c 代码 -> 汇编] 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33254393/