熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows系統管理 >> 正文

匯編CPU執行指令的最小單元[2]

2022-06-13   來源: Windows系統管理 

《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)

[]  []  []  


From:http://tw.wingwit.com/Article/os/xtgl/201311/10162.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.