电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

汇编CPU执行指令的最小单元[2]


发布日期:2019/7/3
 

《Windows 用户态程序高效排错》市场价元 特价元 购买>>

代码中的std::transform和for loop的作用都是对整个vector调用func_template作转换可以比较transform和for loop的执行情况进行比较分析看看func_template的执行过程有什么区别在VS里面利用main函数设定断点停下来后用 ctrl+alt+D进入汇编模式单步跟蹤下面的分析证明了这是编译器的bug

在VisualStudio附带的STL源代码中发现 std::transform的实现中用这样的代码来调用传入的转换函数

*_Dest = _Func(*_First);

编译器对于该代码的处理是

EAX = FEA EBX = C ECX = BC EDX = ESI = EDI = B EIP = ESP = FE EBP = FEA EFL =

: *_Dest = _Func(*_First);

push esi

call dword ptr [esp+h]

D fstp dword ptr [edi]

ESI寄存器中保存的是需要传入_Func的参数*_First可以看到std::transform把这个参数通过push指令传入stack给_Func调用

对于for loop中的*_Dest = func_templatefloatstd::string>(*_First);编译器是这样处理的

EAX = B EBX = ECX = BC EDX = ESI = EDI = C EIP = ESP = FE EBP = B EFL =

: *_Dest = func_template<floatstd::string>(*_First);

mov ebxesi

call func_template <floatstd::basic_string<charstd::char_traits<char>std::allocator<char> > > (Ah)

fstp dword ptr [ebp]

可以看到使用for loop的时候参数通过mov指令保存到ebx寄存器中传入func_template调用

最后看一下func_template函数是如何来获取传入的参数的

A push esi

A push edi

: std::cout<<u<<std::endl;

A push ebx

A push offset std::cout (h)

[] [] []

上一篇:专家心得:网路管理中的三个难题[2]

下一篇:汇编CPU执行指令的最小单元[1]