我试着理解[c code - >汇编]代码

时间:2015-10-21 08:27:45

标签: c assembly

我试着理解[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]
  1. 我不确定这条线的作用 这一行是什么意思,

    push esi
    mov esi,ecx
    
  2. ecx是我知道的计数值。 为什么要在ecx中保存esi的值?

    mov eax,dword ptr [esi+50h]
    
  3. 这是什么意思,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
    

1 个答案:

答案 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

有时候你并不担心编译器生成的汇编程序。它可能是次优的,或者可能是如此优化,以至于您无法识别原始陈述。