从13.2小节开始,本小节主要是讲如果 case太多,无法用jne/je跳转怎么办?
这里用了一组计算技巧来进行地址跳转,
jmp dword ptr $LN11@f[ecx*4]
假如ecx中存的是2,则 dword ptr $LN11@f[ecx*4] =$LN11@f[8],对应的是$LN11跳转表中
$LN4@f的地址。用ollydbg调试的时候,可以看到转移表在地址中(data字段)占了一块连续地址,
13.3 如果是多个case对应一个分支的话,那就是需要一个索引表来统一组织case,需要一个跳转表来跳转。
movzx eax,byte prt $ln10@f[eax]; movzx,较小值复制到较大值,然后0填充。
jmp dword ptr $ln11@f[eax*4]
// cl 1.15.1-switch.c /Fa1.15.1-switch.asm
// cl 1.15.1-switch.c /Ox /Fa1.15.1-switch-optimized.asm
#include <stdio.h>
void f(int a){
switch(a){
case 0:
printf("zero\n");
break;
case 1:
printf("one\n");
break;
case 2:
printf("two\n");
break;
case 3:
printf("three\n");
break;
case 4:
printf("four\n");
break;
default:
printf("Unknow Number\n");
break;
}
};
int main(){
f(2);
return 0;
}