c語言switch反匯編的實現(xiàn)
在分支較多的時候,switch的效率比if高,在反匯編中我們即可看到效率高的原因
一、switch語句
1、在正向編碼時,switch語句可以看做是if語句的簡寫

2、break在switch語句的妙用
1、當switch存在3個分支時

當去掉break的時候

二、switch語句的反匯編
1、當switch存在3個分支時
#include<stdio.h>
void Function(int x) {
switch (x) {
case 1:
printf("1");
case 2:
printf("2");
case 3:
printf("3");
default:
printf("4");
}
}
int main() {
Function(2);
return 0;
}

可以看出,此時switch的反匯編代碼與if語句無異。
當有四個if語句的時候就會生成大表。

2、當switch語句出現(xiàn)四個分支時,編譯器會產(chǎn)生大表
步驟:
1、將傳進來的數(shù)先減去1,再進行比較。判斷出該參數(shù)是否超過switch語句中最大常量還,即判斷參數(shù)是直接進入default中還是進入case中
2、 若參數(shù)<=max,則用寄存器保留該值。并代入表達式中,通過大表直接跳到相應的地址
注意
分支少于四個,則switch無意義,編譯器會按if…else…語句進行反匯編
case后的常量的順序不影響大表的生成
將常量值的順序打亂,觀察反匯編代碼
正向代碼

匯編代碼

這里可以看到大表里面都是自己排好序了。
將連續(xù)的10項中抹去1項或者2項,觀察反匯編有無變化
正向代碼是這樣的

這里可以看到有幾個地址是一樣的

可以發(fā)現(xiàn)是指向默認的地址。

3、當switch存在多個分支,常量連續(xù)性相對不高時

就會生成小表

步驟:
1、將傳進來的參數(shù)減去最小值,然后跟最大值相比,如果大于的話就跳到默認的地方,不然就用差值去查小表,然后查大表。
補充:當case后的常量差距較大時
編譯器按照if…else…進行反匯編
到此這篇關于c語言switch反匯編的實現(xiàn)的文章就介紹到這了,更多相關c語言switch反匯編內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

