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

标签 c assembly

我尝试理解[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]
  1. 我不确定这一行的作用 这行的含义是什么,

    push esi
    mov esi,ecx
    
  2. 据我所知,
  3. ecx 是一个计数值。 为什么要将ecx的值保存在esi中?

    mov eax,dword ptr [esi+50h]
    
  4. 这个值 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/

相关文章:

performance - 哪个英特尔微体系结构引入了ADC reg,0单uop特殊情况?

assembly - 将常量值添加到 x86 中的 xmm 寄存器

linux nasm程序集查找变量中保存的位数

memory - 硬件和编译器如何处理跨入不可执行页面的 x86 指令?

c - 在 C 程序中获取 shell 脚本的退出代码

python - 如何正确使用 Python 的 C API 和异常?

c - "double free"是什么意思?

c - 使用 "core clock cycles"的 Intel CPU 上的时序代码?

c - 没有全局变量的 pthreads 互斥锁,只返回 thread_struct 中的数组

缩放时开罗图像模糊