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,或者為同乙個值時,可以使用稀疏陣列來儲存該陣列 小規模陣列便是稀疏陣列 像在編寫的...