在VC++的反彙編中,正在進行函數調用。編譯器在推送寄存器之前將本地指針指向寄存器:爲什麼VC + +編譯器MOV + PUSH參數而不是隻推動它們? x86
memcpy(nodeNewLocation, pNode, sizeCurrentNode);
0041A5DA 8B 45 F8 mov eax,dword ptr [ebp-8]
0041A5DD 50 push eax
0041A5DE 8B 4D 0C mov ecx,dword ptr [ebp+0Ch]
0041A5E1 51 push ecx
0041A5E2 8B 55 D4 mov edx,dword ptr [ebp-2Ch]
0041A5E5 52 push edx
0041A5E6 E8 67 92 FF FF call 00413852
0041A5EB 83 C4 0C add esp,0Ch
爲什麼不直接推它們?即
push dword ptr [ebp-8]
此外,如果你要做一個單獨的推,爲什麼不做手動。換句話說,而不是做「推EAX」上面,做
mov [esp], eax
等等這樣做的好處是,做3個MOVS後,你可以做一個減法來設置新的堆棧指針,而不是含蓄用推動減去三次。
UPDATE --- Release版本
這是編譯版本相同的代碼:
; 741 : memcpy(nodeNewLocation, pNode, sizeCurrentNode);
00087 8b 45 f8 mov eax, DWORD PTR _sizeCurrentNode$[ebp]
0008a 8b 7b 04 mov edi, DWORD PTR [ebx+4]
0008d 50 push eax
0008e 56 push esi
0008f 57 push edi
00090 e8 00 00 00 00 call _memcpy
00095 83 c4 0c add esp, 12 ; 0000000cH
絕對比調試版本更有效,但它仍然是做了MOV/PUSH組合。
這是實際編譯在發佈模式?它看起來模糊調試 – harold
它被編譯爲調試。爲什麼在這種情況下會有所作爲? –
因爲編譯器不會在調試模式下關心這些事情。 – harold