switch語句反彙編分析

2021-07-29 18:45:38 字數 1462 閱讀 9771

假設switch語句的分支比較少的時候(例如3,少於4的時候沒有意義)沒有必要使用此結構,相當於if(可觀察反彙編得出此結論)。

1、各個分支常量的差值較大的時候,編譯器會在效率還是記憶體進行取捨,這個時候編譯器還是會編譯成類似於if,else的結構。

2、在分支比較多的時候:在編譯的時候會生成乙個大表(跳轉表每個位址四個位元組)且各個分支常量的差值較小(或者連續)的時候,儲存各個分支執行的**首位址。

3、當差值較大的時候且(最大值和最小值)差值於256時,編譯器會生成乙個小表(跳轉表每個位元組儲存的是相對於首位址低偏移量)。

查詢方式:

在傳入引數的時候,系統會利用引數計算出乙個位址,直接調轉到執行部分。

在分支常量表示式為不連續的值時,編譯器會編譯成類似搜尋二叉樹的結構。

多分支的switch反彙編結果:

temp:x-1 temp和3作比較,若temp大於3,則跳轉到default分支。

不跳,則:edx=temp

0aa533e mov eax,dword ptr [x]

00aa5341 mov dword ptr [ebp-0c4h],eax

00aa5347 mov ecx,

dword ptr [ebp-0c4h]

temp

00aa534d sub ecx,1

00aa5350 mov dword ptr [ebp-0c4h],ecx

00aa5356 cmp dword ptr [ebp-0c4h],3

00aa535d ja $ln7+0dh (0aa53a6h) e

00aa535f mov edx,dword ptr [ebp-0c4h]

00aa5365 jmp dword ptr [edx*4+0aa53bch]

00aa536c push offset string "1" (0aa7b30h)

00aa5371 call _printf (0aa1401h)

00aa5376 add esp,4

00aa5379 jmp $ln7+0dh (0aa53a6h)

00aa537b push offset string "2" (0aa7b34h)

00aa5380 call _printf (0aa1401h)

00aa5385 add esp,4

00aa5388 jmp $ln7+0dh (0aa53a6h)

00aa538a push offset string "3" (0aa7b38h)

00aa538f call _printf (0aa1401h)

00aa5394 add esp,4

00aa5397 jmp $ln7+0dh (0aa53a6h)

00aa5399 push offset string "4" (0aa7b3ch)

00aa539e call _printf (0aa1401h)

00aa53a3 add esp,4

switch語句反彙編分析

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

C 反彙編 if語句分析

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 ...