2017-10-09 6 views
0

En utilisant WinDBG pour déboguer le code d'assembly d'un exécutable, il semble que le compilateur insère d'autres codes entre deux instructions séquentielles. Les déclarations sont assez simples, par ex. ils ne fonctionnent pas avec des objets complexes pour les appels de fonction;Code de désassemblage de Visual Studio

int a, b; 
char c; 
long l; 
a = 0;   // @@ 
b = a + 1;  // %% 
c = 1;   // ## 
l = 1000000; 
l = l + 1; 

Et le démontage est

@@ 008a1725 c745f800000000 mov  dword ptr [ebp-8],0 
008a172c 80bd0bffffff00 cmp  byte ptr [ebp-0F5h],0  ss:002b:0135f71f=00 
008a1733 750d   jne  test!main+0x42 (008a1742) 
008a1735 687c178a00  push offset test!main+0x7c (008a177c) 
008a173a e893f9ffff  call test!ILT+205(__RTC_UninitUse) (008a10d2) 
008a173f 83c404   add  esp,4 
008a1742 8b45ec   mov  eax,dword ptr [ebp-14h] 
%% 008a1745 83c001   add  eax,1 
008a1748 c6850bffffff01 mov  byte ptr [ebp-0F5h],1 
008a174f 8945ec   mov  dword ptr [ebp-14h],eax 
## 008a1752 c645e301  mov  byte ptr [ebp-1Dh],1 

S'il vous plaît noter que @@, %% et ## dans la liste désassemblage afficher les lignes C++ correspondantes.

Alors qu'est-ce que call, cmp, jne et push?

enter image description here

Répondre

1

Il est l'erreur compilateur d'exécution de vérification (RTC), le contrôle du commutateur RTC pour les variables non initialisées, je pense que vous pouvez le gérer à partir de Visual Studio (options du compilateur). Pour plus d'informations, consultez le this. Section /RTCu switch