首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释程序集跳转表

解释程序集跳转表
EN

Stack Overflow用户
提问于 2021-05-27 13:56:18
回答 1查看 463关注 0票数 2

我试图逐行解释这个汇编代码是干什么的,但是当我看到这个跳转表时,我发现自己真的很困惑,它在assembly.This中摘自教科书的练习题3.63,但是没有解释--因此我在这里问它的原因。目标是反向工程,提供装配清单,并编写C代码,可以生成它(感觉开关语句体)。请帮助:(

教科书是:兰德尔·E·布莱恩特,大卫·R·奥哈拉龙--计算机系统。程序员的视角3rd ed.

qn 3.63

代码语言:javascript
复制
long switch_prob(long x, long n) { 
    long result = x;  
    switch(n) {  
            /* Fill in code here */  
    }  
    return result;  
}  

我不知道如何“解码”它,也不知道它指向哪里。

代码语言:javascript
复制
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/6gx0x4006f8检查包含跳转表的6个8字节的内存字。GDB打印以下内容:

(gdb) x/6gx 0x4006f8

0x4006f8: 0x00000000004005a1 0x000000004005c3

0x400708: 0x00000000004005a1 0x000000004005aa

0x400718: 0x000000004005b2 0x000000004005bf

我知道这行40059a: ff 24 f5 f8 06 40 00 jmpq *0x4006f8(,%rsi,8)

跳到桌子上,但我不知道该怎么做

1)解释跳转表[每个地址对应什么,6个值中每个对应什么?

平均[持有]

2)逆向工程,得到开关语句的不同情况。

感谢您的帮助,谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-27 14:27:38

有明显的(5或)6case的连续值,和无所不在的default

跳转表每个案例包含一个地址,您将在列表中找到这些地址。

例如,0x00000000004005a1是本部分的地址:

代码语言:javascript
复制
    4005a1: 48 8d 04 fd 00 00 00     lea 0x0(,%rdi,8),%rax  
    4005a8: 00  
    4005a9: c3                         retq  

因为表中的第二个条目指向与默认地址相同的地址(由cmp $0x5,%rsija 4005c3 <switch_prob+0x33>检测到),所以我们可以假设没有显式列出这个case。这就是为什么可能只有5个case的原因。

减去的值0x3c可能是ASCII中的字符'<'。你也可以用十进制来解释它。

switch的每个分支的解释都是留给您的练习,因为这似乎是家庭作业。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67723676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档