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

2、break在switch語句的妙用
1、當(dāng)switch存在3個分支時

當(dāng)去掉break的時候

二、switch語句的反匯編
1、當(dāng)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語句無異。
當(dāng)有四個if語句的時候就會生成大表。

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

匯編代碼

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

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

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

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

就會生成小表

步驟:
1、將傳進(jìn)來的參數(shù)減去最小值,然后跟最大值相比,如果大于的話就跳到默認(rèn)的地方,不然就用差值去查小表,然后查大表。
補(bǔ)充:當(dāng)case后的常量差距較大時
編譯器按照if…else…進(jìn)行反匯編
到此這篇關(guān)于c語言switch反匯編的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c語言switch反匯編內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Cocos2d-x Schedule定時器的使用實(shí)例
這篇文章主要介紹了Cocos2d-x Schedule定時器的使用實(shí)例,本文的講解內(nèi)容包含在代碼注釋中,需要的朋友可以參考下2014-09-09
C語言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
C/C++開發(fā)中extern的一些使用注意事項(xiàng)
這篇文章主要為大家介紹了C/C++開發(fā)中extern一些使用注意事項(xiàng)的事例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
C語言 fseek(f,0,SEEK_SET)函數(shù)案例詳解
這篇文章主要介紹了C語言 fseek(f,0,SEEK_SET)函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

