我试图逐行解释这个汇编代码在做什么,但当我看到这个汇编中的跳转表时,我发现自己真的很困惑。这是从教科书练习问题 3.63 中摘录的,但没有解释 -因此我为什么在这里问它。目标是对提供的汇编列表进行逆向工程,并编写可以生成它的 C 代码(感觉 switch 语句体)。请帮忙 :(
教科书是:Randal E. Bryant, David R. O'Hallaron - Computer Systems。程序员的视角 [第 3 版](2016 年,Pearson)
qn 3.63
long switch_prob(long x, long n) {
long result = x;
switch(n) {
/* Fill in code here */
}
return result;
}
我不确定如何“解码”它或如何知道它指向的位置。
0000000000400590 <switch_prob>:
400590: 48 83 ee 3c sub $0x3c,%rsi
400594: 48 83 fe 05 cmp $0x5,%rsi
400598: 77 29 ja 4005c3 <switch_prob+0x33>
40059a: ff 24 f5 f8 06 40 00 jmpq *0x4006f8(,%rsi,8)
4005a1: 48 8d 04 fd 00 00 00 lea 0x0(,%rdi,8),%rax
4005a8: 00
4005a9: c3 retq
4005aa: 48 89 f8 mov %rdi,%rax
4005ad: 48 c1 f8 03 sar $0x3,%rax
4005b1: c3 retq
4005b2: 48 89 f8 mov %rdi,%rax
4005b5: 48 c1 e0 04 shl $0x4,%rax
4005b9: 48 29 f8 sub %rdi,%rax
4005bc: 48 89 c7 mov %rax,%rdi
4005bf: 48 0f af ff imul %rdi,%rdi
4005c3: 48 8d 47 4b lea 0x4b(%rdi),%rax
4005c7: c3 retq
跳转表位于不同的内存区域。我们可以从第 5 行的间接跳转中看到,跳转表从地址 0x4006f8 开始。使用 GDB 调试器,我们可以使用命令 x/6gx 0x4006f8 检查组成跳转表的六个 8 字节内存字。GDB 打印以下内容:
(gdb) x/6gx 0x4006f8
0x4006f8: 0x00000000004005a1 0x00000000004005c3
0x400708: 0x00000000004005a1 0x00000000004005aa
0x400718: 0x00000000004005b2 0x00000000004005bf
我知道这行 40059a: ff 24 f5 f8 06 40 00 jmpq *0x4006f8(,%rsi,8)
正在跳转到表格,但我不确定如何
1) 解释跳转表 [每个地址对应于什么, 6 个值中的每一个是什么
意思/保持]
2)对其进行逆向工程以获得 switch 语句的不同情况。
任何帮助表示赞赏,谢谢:)