談一下switch語句中的jump table

2021-08-29 11:07:20 字數 2043 閱讀 2478

gcc對c語言中的switch的優化 在這裡:

接著用上次的** switch.c

[code]int switch_eg(int x)

return result;

} [/code]

我們先鍵入下面的命令:

[code]cc -o2 -c switch.c[/code]

然後新建乙個main.c的檔案,內容為:

[code]

int main()

[/code]

然後再鍵入

[code]cc -o2 -o switch switch.o main.c[/code]

這時會生成乙個switch的二進位制檔案,我們將它反彙編:

[code]objdump -d switch[/code]

會生成很多**,我這裡只把重要的貼出來:

[code]08048350 :

8048350: 55 push %ebp

8048351: 89 e5 mov %esp,%ebp

8048353: 8b 45 08 mov 0x8(%ebp),%eax

8048356: 8d 50 9c lea -0x64(%eax),%edx

8048359: 83 fa 06 cmp $0x6,%edx

804835c: 76 04 jbe 8048362

804835e: 5d pop %ebp

804835f: 31 c0 xor %eax,%eax

8048361: c3 ret

8048362: ff 24 95 80 84 04 08 jmp *0x8048480(,%edx,4)

8048369: 0f af c0 imul %eax,%eax

804836c: 5d pop %ebp

804836d: 8d 76 00 lea 0x0(%esi),%esi

8048370: c3 ret

8048371: 5d pop %ebp

8048372: b8 72 00 00 00 mov $0x72,%eax

8048377: c3 ret

8048378: 5d pop %ebp

8048379: b8 7b 00 00 00 mov $0x7b,%eax

804837e: 66 90 xchg %ax,%ax

8048380: c3 ret

8048381: 5d pop %ebp

8048382: b8 14 05 00 00 mov $0x514,%eax[/code]

注意看8048362這一行.這行就是進入跳轉表的彙編**,現在我們再進入test程式的除錯:

[code]gdb test[/code]

然後鍵入:

[code]x/6w 0x8048480[/code]

這個命令是列印出從位址0x8048480開始的6個四位元組的位址的內容.

[code]0x8048480: 0x08048381 0x0804835e 0x08048378 0x08048371

0x8048490: 0x08048369 0x0804835e

[/code]

也就是說0x8048480裡面儲存的是0x08048381,0x08048384裡面儲存的是0x0804835e,然後是 0x08048378.....

這樣的話,通過8048362那邊的計算,就可以直接跳轉到某個位址,從而把這個位址所儲存的內容提取出來.

[code]0x08048381 : case 100

0x0804835e : case 101 (不存在所以跳轉到default)

0x08048378 :case 102

0x08048371 :case 103

0x08048369 : 這邊要注意,由於104是空語句,因此104 和106的case語句,編譯器進行了合併,因此這邊 即是 case 104也是case 106.

0x0804835e :case 105 (不存在所以跳轉到default)[/code]

通過反彙編和除錯資訊,對switch的跳轉表理解的更清晰了..

switch語句中的case穿透問題

測試 int x 2 int y 3 switch x system.out.println y y 執行順序 匹配物件為x,首先進入switch語句後,不會直接進入default語句,它是在沒有匹配case的情況下最後去執行的,繼續往向下走,沒有匹配上case3,繼續往下走,依舊沒有匹配,繼續向下...

總結一下delphi中SQL語句中引號

總結一下sql語句中引號 quotedstr format 在sql語句中的用法以及sql語句中日期格式的表示 在delphi中進行字元變數連線相加時單引號用 又引號用 表示 首先定義變數 var anint integer 123 為了方便在此都給它們賦初值。雖然可能在引賦初值在某些情況下不對 a...

談一下稀疏陣列

對於乙個初窺資料結構的人來說,稀疏陣列確實可以很好的幫助你鍛鍊思維。但自從第三次科技革命後,人們都一直在做著用空間去換取時間的損事,而以時間換空間的稀疏陣列,倒也跟北大考古專業有些心心相惜。當乙個陣列中大部分元素為0,或者為同乙個值時,可以使用稀疏陣列來儲存該陣列 小規模陣列便是稀疏陣列 像在編寫的...