1. 程式人生 > >switch語句反彙編分析

switch語句反彙編分析

假設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