[英]Using x86 style jump table in C
我試圖像這樣在C中做一個跳轉表
cmp eax, dword 3 ;max number
ja invalid ;default
jmp [eax*4+jumptable] ;jump to handler
invalid:
retn
jumptable:
dd handle0, handle1, handle2, handle3
handle0:
....
等等
我從這開始
void dohandler(int a, int b, void (*jumptable[4]) (int x))
if (a > 3) return
else jumptable[3 * 4](b);
}
int main() {
void (*jumptable[4]) (int x);
jumptable[0] = &handler1;
... etc
dohandler(1,2,jumptable);
}
void handler1(int x) { ... }
.. etc
但它運作不好..
jumptable
是一個指針數組。 不要嘗試縮放偏移量,只需索引要引用的指針。
void dohandler(int a, int b, void (*jumptable[4]) (int x))
if (a >= 0 && a < 4)
jumptable[a](b);
}
不確定,但我認為你有幾個問題:
void dohandler(int a, int b, void (*jumptable[4]) (int x))
if (a > 3) return
else jumptable[3 * 4](b);
}
首先,你不使用a
在引用您的跳表,而我認為,對應於eax
在裝配版本寄存器。 其次,不要將它乘以4.我認為這是指針的大小,數組引用就是為你做的。 所以你最終得到這個:
void dohandler(int a, int b, void (*jumptable[4]) (int x))
if (a > 3) return
else jumptable[a](b);
}
只要標簽值不太稀疏, switch
就會像你想要的那樣編譯成一個跳轉表。 為表達式設置一個小尺寸類型(如unsigned char
)或掩蓋高位可能會有所幫助,因此編譯器在跳轉跳轉之前不會添加額外的“if-in-range”條件,但是可能不那么重要。
最重要的是,實驗。 使用gcc -S
檢查程序集輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.