簡體   English   中英

解釋程序集跳轉表

[英]Interpreting an assembly jump table

我試圖逐行解釋這個匯編代碼在做什么,但是當我看到這個匯編中的跳轉表時,我發現自己真的很困惑。這是從教科書練習題 3.63 中摘錄的,但沒有解釋 -因此我為什么在這里問它。 目標是對提供的裝配清單進行逆向工程,並編寫可以生成它的 C 代碼(感覺 switch 語句體)。 請幫忙:(

教科書是:Randal E. Bryant, David R。 O'Hallaron - 計算機系統。 程序員的視角 [第 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  

跳轉表位於 memory 的不同區域。 我們可以從第 5 行的間接跳轉中看到,跳轉表從地址 0x4006f8 開始。 使用 GDB 調試器,我們可以使用命令 x/6gx 0x4006f8 檢查包含跳轉表的 memory 的六個 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語句的不同情況。

任何幫助表示贊賞,謝謝:)

顯然有(5 或) 6 個case的連續值,以及無所不在的default

跳轉表每個案例包含一個地址,您將在列表中找到這些地址。

比如0x00000000004005a1就是這部分的地址:

    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的每個分支的解釋都留給你作為練習,因為這似乎是家庭作業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM