我正试图在 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
但效果不佳..
答案 0 :(得分:4)
jumptable
是一个指针数组。不要尝试缩放偏移量,只需索引要引用的指针。
void dohandler(int a, int b, void (*jumptable[4]) (int x))
if (a >= 0 && a < 4)
jumptable[a](b);
}
答案 1 :(得分:3)
不确定,但我认为你有几个问题:
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);
}
答案 2 :(得分:3)
switch
就会像你想要的那样编译成跳转表。为表达式设置一个小尺寸类型(如unsigned char
)或掩盖高位可能会有所帮助,因此编译器在跳转跳转之前不会添加额外的“if-in-range”条件,但这可能不那么重要。
最重要的是,实验。使用gcc -S
检查程序集输出。