呵呵,有时间看看汇编代码,今天看选择语句的.
- 1: #include <iostream>
- 2: using namespace std;
- 3:
- 4: int main()
- 5: {
- 00401250 push ebp
- 00401251 mov ebp,esp
- 00401253 sub esp,48h
- 00401256 push ebx
- 00401257 push esi
- 00401258 push edi
- 00401259 lea edi,[ebp-48h]
- 0040125C mov ecx,12h
- 00401261 mov eax,0CCCCCCCCh
- 00401266 rep stos dword ptr [edi]
- 6://初始化函数栈
- 7: int i=1;
- 00401268 mov dword ptr [ebp-4],1
- 8: int a=0;
- 0040126F mov dword ptr [ebp-8],0
- 9: if(i>=1)
- 00401276 cmp dword ptr [ebp-4],1
- 0040127A jl main+35h (00401285)
- 10: {
- 11: a++;
- 0040127C mov eax,dword ptr [ebp-8]
- 0040127F add eax,1
- 00401282 mov dword ptr [ebp-8],eax
- 12: };
- 13:
- 14:
- 15: }
- 00401285 pop edi
- 00401286 pop esi
- 00401287 pop ebx
- 00401288 mov esp,ebp
- 0040128A pop ebp
- 0040128B ret
由于前面的分析,if语句比较简单.看switch语句.
- --- F:/1/1.cpp ----------------------------------------------------------------------------------------------------------
- 1: #include <iostream>
- 2: using namespace std;
- 3:
- 4: int main()
- 5: {
- 00401780 push ebp
- 00401781 mov ebp,esp
- 00401783 sub esp,48h
- 00401786 push ebx
- 00401787 push esi
- 00401788 push edi
- 00401789 lea edi,[ebp-48h]
- 0040178C mov ecx,12h
- 00401791 mov eax,0CCCCCCCCh
- 00401796 rep stos dword ptr [edi]
- 6: int a=1;
- 00401798 mov dword ptr [ebp-4],1
- 7: switch(a)
- 8: {
- 0040179F mov eax,dword ptr [ebp-4]//
- 004017A2 mov dword ptr [ebp-8],eax//注意这两句,用了一个临时变量
- //注意下面这一块,一起比较,跳转
- 004017A5 cmp dword ptr [ebp-8],0
- 004017A9 je main+39h (004017b9)
- 004017AB cmp dword ptr [ebp-8],1
- 004017AF je main+44h (004017c4)
- 004017B1 cmp dword ptr [ebp-8],2
- 004017B5 je main+4Fh (004017cf)
- 004017B7 jmp main+58h (004017d8)
- 9: case 0:
- 10: a++;
- 004017B9 mov ecx,dword ptr [ebp-4]
- 004017BC add ecx,1
- 004017BF mov dword ptr [ebp-4],ecx
- 11: break;
- 004017C2 jmp main+58h (004017d8) //此处也值的注意
- 12: case 1:
- 13: a++;
- 004017C4 mov edx,dword ptr [ebp-4]
- 004017C7 add edx,1
- 004017CA mov dword ptr [ebp-4],edx
- 14: break;
- 004017CD jmp main+58h (004017d8)//此处也值的注意
- 15: case 2:
- 16: a++;
- 004017CF mov eax,dword ptr [ebp-4]
- 004017D2 add eax,1
- 004017D5 mov dword ptr [ebp-4],eax//此处也值的注意
- 17: break;
- 18: default:
- 19:
- 20: break;//注意这句没有汇编语句
- 21: }
- 22: cout<<a<<endl;
- 004017D8 push offset @ILT+195(std::endl) (004010c8)
- 004017DD mov ecx,dword ptr [ebp-4]
- 004017E0 push ecx
- 004017E1 mov ecx,offset std::cout (0047be90)
- 004017E6 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)
- 004017EB mov ecx,eax
- 004017ED call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)
- 23: return 0;
- 004017F2 xor eax,eax////此处也值的注意
- 24:
- 25: }
- 004017F4 pop edi
- 004017F5 pop esi
- 004017F6 pop ebx
- 004017F7 add esp,48h
- 004017FA cmp ebp,esp
- 004017FC call __chkesp (00420570)
- 00401801 mov esp,ebp
- 00401803 pop ebp
- 00401804 ret
总结:选择语句的实现也是用了比较和跳转的指令.