2016-11-04 50 views
0

我試圖破譯簡單的彙編代碼,但我對該語言不是很有經驗。如果我的代碼主要以下塊:如何確定地址中的內容彙編正在調用

push %ebp 
8048a45:  89 e5     mov %esp,%ebp 
8048a47:  53      push %ebx 
8048a48:  83 e4 f0    and $0xfffffff0,%esp 
8048a4b:  83 ec 10    sub $0x10,%esp 
8048a4e:  8b 45 08    mov 0x8(%ebp),%eax 
8048a51:  8b 5d 0c    mov 0xc(%ebp),%ebx 
8048a54:  83 f8 01    cmp $0x1,%eax 
8048a57:  75 0c     jne 8048a65 <main+0x21> 
8048a59:  a1 c4 d7 04 08   mov 0x804d7c4,%eax ?? 
8048a5e:  a3 f0 d7 04 08   mov %eax,0x804d7f0 ?? 
8048a63:  eb 74     jmp 8048ad9 <main+0x95> 
8048a65:  83 f8 02    cmp $0x2,%eax 
8048a68:  75 49     jne 8048ab3 <main+0x6f> 
8048a6a:  c7 44 24 04 e8 a2 04 movl $0x804a2e8,0x4(%esp) 

上線8048a59和048a5e,在那裏我已經把問號,我猜想它試圖設置無論是在地址0x804d7f0什麼是地址0x804d7c4,但是我怎麼知道這些地址具體是什麼?

+0

如果您不知道該程序是什麼以及它在做什麼,則不這樣做。 – Hannu

+1

如果你可以讓連接器吐出一個地圖文件,你應該得到你的變量的所有絕對地址列表。 – Lundin

回答

1

首先你需要確定哪個部分對應這個地址。你可以這樣做objdump像這樣objdump -h

然後,你可以拆卸你感興趣的部分,就像它完成here

Here有關查看段落及其地址的一些有用信息。

其他方法是使用運行時調試器,只是打印出內存,例如gdb的x addr


P.S.如果你想恢復變量名,這可能是不可能的,因爲編譯器通常會去除大多數符號的那種信息。

+1

當地址可用時,使用'objdump -d -r'打印地址的符號信息(「重定位」)。它貼着像#61d0c8 '這樣的評論。注意像這樣的情況,它與stderr沒有任何關係,只是這是最後一個二進制文件中仍然存在的最近的符號。它對'.o'文件的處理比可執行文件好得多,因爲鏈接器還沒有拋棄非全局靜態數據的符號信息。 –

+0

我實際上使用'alias disas ='objdump -drwC -Mintel''來做到這一點,解壓C++名稱並使用Intel風格的語法。 (而不是長時間指令換行機器碼)。 –

相關問題