第一種情況:分支小于4個
生成引導(dǎo)性的跳轉(zhuǎn)表
cmp ....
je ....
cmp ....
je ...
.......
cmp ..
跳轉(zhuǎn)到default或者 switch end 舵稠,不同編譯器的表達(dá)形式可能不太一樣
區(qū)分default和 switch end : 排除掉代碼外提優(yōu)化后疹鳄,找一個break的點(diǎn)看跳的地方是否一樣。
定式:
多個je跳到代碼塊,je之間只有影響標(biāo)志位的代碼垃瞧,沒有實質(zhì)性功能的代碼甩十,代碼塊在別的位置船庇,通常是連續(xù)的,因為在沒寫break的情況要順序執(zhí)行侣监,所以寫在一起可以降低代碼復(fù)雜度鸭轮。
第二種情況:多分支,且case的數(shù)據(jù)比較有線性規(guī)律橄霉,不連續(xù)的地方相差不是很多窃爷。
這種情況會做一個case的地址表
一上來先和case里最大的比較
ja ;跳default 或 switch end
.....
jmp [reg * 4 + CASE_ADDRESS_TABLE]
這個CASE_ADDRESS_TABLE就是跳轉(zhuǎn)表,anzhao case 值從小到大排序姓蜂,中間間隔的case值會跳到default按厘,如果沒有defual會跳到 switch end
如果case的最小值不是0,會做平移調(diào)整钱慢,保證最小值在0的下標(biāo)逮京。
第三種情況:多分支,case值沒有明顯順序滩字,MAX - MIN 在255以內(nèi)
采用調(diào)色板的壓縮手法:首先用一個一維數(shù)組存放所有的case數(shù)據(jù)造虏,case間隔的值填同一個數(shù)字對應(yīng)defaual,再用一個移位數(shù)組麦箍,填充對應(yīng)的跳轉(zhuǎn)地址漓藕。
根據(jù)不同的輸入,對齊0后在第一張表中找到索引挟裂,再去第二張表找到跳轉(zhuǎn)地址享钞。
這種方法拿時間換空間。
識別:第一次尋址用的是 byte數(shù)組诀蓉。 值給到reg8
第四種情況:多分支栗竖,case值沒有明顯順序,MAX - MIN > 255
以二分法判斷渠啤,很容易識別