C 反彙編 if語句分析

2021-06-21 11:44:07 字數 2723 閱讀 8407

#include void main()

{ std::cout<<"hello world"<7?1:4;

if (b==1)

{ std::cout<<"b equal 1"<

判斷語句有幾種

1.條件表示式:表示式1?表示式2:表示式3  

2.if語句

3.switch語句

首先來分析if語句吧:

debug版:

0040117d . 68 3c404300 push offset test3.??_c@_0m@bni@hello?5wo>; ascii "hello world"

00401182 . 68 50b54300 push offset test3.std::cout

00401187 . e8 14ffffff call test3.004010a0

0040118c . 83c4 08 add esp,8 ; a賦值為8

0040118f . 8bc8 mov ecx,eax ; 申明b

00401191 . e8 ddfeffff call test3.00401073

00401196 . c745 fc 08000>mov dword ptr ss:[ebp-4],8 ; 傳值8到 ebp-4 中

0040119d . 33c0 xor eax,eax ; 清空eax

0040119f . 837d fc 07 cmp dword ptr ss:[ebp-4],7 ; 8與7比較

004011a3 . 0f9ec0 setle al ; 是否大於7 大於則al為1

004011a6 . 48 dec eax ; 運算元自減1 eax為0

004011a7 . 24 fd and al,0fd ; al與 11111101作與運算

004011a9 . 83c0 04 add eax,4 ; eax加4

004011ac . 8945 f8 mov dword ptr ss:[ebp-8],eax ; 4 mov 到 b中

004011af . 837d f8 01 cmp dword ptr ss:[ebp-8],1 ; 比較指令 b值與1比較

004011b3 . 75 20 jnz short test3.004011d5 ; 與1不相等則跳轉到 位址004011ee 輸出b equal 2語句

004011b5 . 68 28104000 push test3.00401028

004011ba . 68 30404300 push offset test3.??_c@_09mflh@b?5equal?>; 相等 則輸出b equal 1

004011bf . 68 50b54300 push offset test3.std::cout

004011c4 . e8 d7feffff call test3.004010a0

004011c9 . 83c4 08 add esp,8

004011cc . 8bc8 mov ecx,eax

004011ce . e8 a0feffff call test3.00401073

004011d3 . eb 1e jmp short test3.004011f3

004011d5 > 68 28104000 push test3.00401028

004011da . 68 24404300 push offset test3.??_c@_09dkao@b?5equal?>; ascii "b equal 2"

004011df . 68 50b54300 push offset test3.std::cout

004011e4 . e8 b7feffff call test3.004010a0

004011e9 . 83c4 08 add esp,8

004011ec . 8bc8 mov ecx,eax

004011ee . e8 80feffff call test3.00401073

004011f3 > 68 1c404300 push offset test3.??_c@_05pbcn@pause?$aa>; /command = "pause"

004011f8 . e8 737e0000 call test3.system ; \system

if語句主要呼叫了 cmp指令 和 jnz指令。

switch語句反彙編分析

switch語句如下 反彙編 為 將區域性變數flag存放現在棧底即 ebp 8 然後通過 eax做中轉,在 ebp 4 存放乙個 flag 的備份,複製到 ecx中對其進行減一操作,其中的1則是 case 分支中的最小值,然後將操作完的數儲存到 ebp 4 中,此時為 flag 1 2 接著進行 ...

switch語句反彙編分析

假設switch語句的分支比較少的時候 例如3,少於4的時候沒有意義 沒有必要使用此結構,相當於if 可觀察反彙編得出此結論 1 各個分支常量的差值較大的時候,編譯器會在效率還是記憶體進行取捨,這個時候編譯器還是會編譯成類似於if,else的結構。2 在分支比較多的時候 在編譯的時候會生成乙個大表 ...

C 反彙編四 SWITCH語句

004015d0 push ebp 004015d1 mov ebp,esp 004015d3 sub esp,48h 004015d6 push ebx 004015d7 push esi 004015d8 push edi 004015d9 lea edi,ebp 48h 004015dc mo...