2017-10-09 127 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开关检查,我认为你可以从Visual Studio(编译器选项)对其进行管理。请致电this。部分/RTCu switch