这个程序给你一个机会,从反汇编机器代码逆向工程一个switch语句。在下面这个过程中,去掉了switch语句的主体:
1 long switch_prob(long x, long n) { 2 long result = x; 3 switch(n) { 4 /* Fill in code here*/ 5 6 } 7 return result; 8 }
图3-53给出了这个过程的反汇编机器代码。
跳转表驻留在内存的不同区域中。可以从第5行的间接跳转看出来,跳转表的起始地址为Ox 4006f8。用调试器GDB,我们可以用命令x/6gx 0x4006f8来检查组成跳转表的6个8字节字的内 存。GDB打印出下面的内容:
(gdb)x/6gx 0x4006f8
0x4006f8: 0x00000000004005a1 0x00000000004005c3
0x400708: 0x00000000004005a1 0x00000000004005aa
0x400718: 0x00000000004005b2 0x00000000004005bf
用C代码填写开关语句的主体,使它的行为与机器代码一致。