2017-10-09 14 views
0

실행 파일의 어셈블리 코드를 디버깅하는 데 WinDBG를 사용하면 컴파일러가 두 개의 순차적 명령문 사이에 다른 코드를 삽입하는 것처럼 보입니다. 문장은 매우 간단합니다. 함수 호출을 위해 복잡한 객체에서는 작동하지 않습니다.Visual Studio의 디스 어셈블리 코드

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

그리고 분해는

@@ 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 

분해 목록에서 @@, %%##이 대응하는 C++ 라인을 보여 있습니다입니다.

그래서 무엇입니까 call, cmp, jnepush?

enter image description here

답변

1

그것은 검사 컴파일러 런타임 오류 (RTC) 인, 초기화되지 않은 변수의 RTC 스위치 검사, 당신은 비주얼 스튜디오 (컴파일러 옵션)에서 관리 할 수 ​​있다고 생각합니다.

자세한 내용은 this을 참조하십시오. 섹션 /RTCu switch