#include<iostream> | #include<iostream> | #include<iostream> |
using namespace std; | using namespace std; | using namespace std; |
int main() | int main() | int main() |
{ | { | { |
int i=0; | int i=0; | |
cout<<"Good"; | cout<<"Good"<<i; | |
cout<<i; | cout<<"Good"<<"Bad"; | |
} | } | } |
var_4= dword ptr -4 | var_4= dword ptr -4 | |
argc= dword ptr 8 | argc= dword ptr 8 | argc= dword ptr 8 |
argv= dword ptr 0Ch | argv= dword ptr 0Ch | argv= dword ptr 0Ch |
envp= dword ptr 10h | envp= dword ptr 10h | envp= dword ptr 10h |
push ebp | push ebp | push ebp |
mov ebp, esp | mov ebp, esp | mov ebp, esp |
push ecx | push ecx | |
mov [ebp+var_4], 0 | mov [ebp+var_4], 0 | |
push offset aGood ; "Good" | mov eax, [ebp+var_4] | |
push offset unk_421838 ; int | push eax | push offset aBad ; "Bad" |
call sub_4023E0 | push offset aGood ; "Good" | push offset aGood ; "Good" |
add esp, 8 | push offset unk_421838 ; int | push offset unk_41A468 ; int |
mov eax, [ebp+var_4] | call sub_4023D0 | call sub_401030 |
push eax | add esp, 8 | add esp, 8 |
mov ecx, offset unk_421838 | mov ecx, eax | push eax ; int |
call sub_401040 | call sub_401030 | call sub_401030 |
xor eax, eax | xor eax, eax | add esp, 8 |
mov esp, ebp | mov esp, ebp | xor eax, eax |
pop ebp | pop ebp | pop ebp |
反思: | 可以见得不管使用了几个cout,调用的函数的次数都会根据输出元素的个数而决定,而调用函数的个数和输出参数的种类决定。注意在如果程序中存在输出变量,则在函数头部会出现push ecx。这个入栈操作可能是在某个输出变量的函数中被清理。是不是如果有非char变量输出就会有push ecx之类的操作? |
下步: | 证明以上猜想 |