c語言switch反匯編的實現(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項中抹去1項或者2項,觀察反匯編有無變化
正向代碼是這樣的
這里可以看到有幾個地址是一樣的
可以發(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反匯編的實現(xiàn)的文章就介紹到這了,更多相關(guān)c語言switch反匯編內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言 fseek(f,0,SEEK_SET)函數(shù)案例詳解
這篇文章主要介紹了C語言 fseek(f,0,SEEK_SET)函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08