switch語句反彙編分析
阿新 • • 發佈:2019-01-30
假設switch語句的分支比較少的時候(例如3,少於4的時候沒有意義)沒有必要使用此結構,相當於if(可觀察反彙編得出此結論)。
1、各個分支常量的差值較大的時候,編譯器會在效率還是記憶體進行取捨,這個時候編譯器還是會編譯成類似於if,else的結構。
2、在分支比較多的時候:在編譯的時候會生成一個大表(跳轉表每個地址四個位元組)且各個分支常量的差值較小(或者連續)的時候,儲存各個分支執行的程式碼首地址。
3、當差值較大的時候且(最大值和最小值)差值於256時,編譯器會生成一個小表(跳轉表每個位元組儲存的是相對於首地址低偏移量)。
查詢方式:
在傳入引數的時候,系統會利用引數計算出一個地址,直接調轉到執行部分。
在分支常量表達式為不連續的值時,編譯器會編譯成類似搜尋二叉樹的結構。
多分支的switch反彙編結果:
temp:x-1 temp和3作比較,若temp大於3,則跳轉到default分支。
不跳,則:edx=temp
下一步的跳轉地址的地址:edx*4+0AA53BCh
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