来自 visual studio 的反汇编代码
Disassembly code from visual studio
使用 WinDBG 调试可执行程序的汇编代码,编译器似乎在两个顺序语句之间插入了一些其他代码。这些语句非常简单,例如他们不使用复杂对象进行函数调用;
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
、jne
和 push
是什么?
它是编译器 运行-time error checking (RTC),RTC 开关检查未初始化的变量,我认为你可以从 Visual Studio(编译器选项)管理它。
有关详细信息,请查看 this。第 /RTCu switch
节
使用 WinDBG 调试可执行程序的汇编代码,编译器似乎在两个顺序语句之间插入了一些其他代码。这些语句非常简单,例如他们不使用复杂对象进行函数调用;
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
、jne
和 push
是什么?
它是编译器 运行-time error checking (RTC),RTC 开关检查未初始化的变量,我认为你可以从 Visual Studio(编译器选项)管理它。
有关详细信息,请查看 this。第 /RTCu switch