2014-10-04 53 views
3

有人可以向我解釋下面發生了什麼? 問題:學習一個簡單的代碼反彙編輸出和內存映射

  • 爲什麼不變我留在一個註冊?
  • 爲什麼寄存器rbp包含內存緩存行的地址而不是i的地址(即4個字節)?
  • 這是什麼意思? movl $0x5,-0x4(%rbp); %negative 0x4是什麼意思?

int main(int argc, char* argv[]) 
{ 
    int i = 5; // line 25 
    i ++;  // line 26 
} 
----------------------------------------------------- 

Disassembly: 
25     int i = 5; 
00000000004014f4: movl $0x5,-0x4(%rbp) 
26     i ++; 
00000000004014fb: addl $0x1,-0x4(%rbp) 
----------------------------------------------------- 

Register Values: 
rbp: 0x23fe60 
----------------------------------------------------- 

Memory map at line 25: 
Address | 0-3 | 4-7 | 8-B | C-F | 
0x23fe60 |00000000|00000000|00000000|05000000| 

Memory map at line 26: 
Address | 0-3 | 4-7 | 8-B | C-F | 
0x23fe60 |00000000|00000000|00000000|06000000| 

注:是Eclipse生成上述內容,我使用的是64位計算機上mingw的編譯。

+0

你是什麼意思現金?緩存? – ordahan 2014-10-04 15:41:57

+0

緩存不是單獨尋址的。所以我不確定你對緩存的問題意味着什麼。 – 2014-10-04 15:42:26

+0

我的意思是,我將5分配給了我。不應該5在緩存中,而不是映射到內存? – Kam 2014-10-04 15:43:07

回答

3
  • 爲什麼不變量i留在寄存器中?

因爲你的編譯器不喜歡它。它決定將變量i放置在堆棧上。

  • 爲什麼寄存器rbp包含一個內存緩存行的地址而不是i的地址(即4個字節)?

rbp不包含內存緩存的地址。 rbp基址指針,它指向堆棧的底部。 -0x4(%rbp)是變量i在內存中的位置(在堆棧上)。這意味着價值rbp減去4。爲什麼4?因爲i需要4個字節。所以它的地址i

http://en.wikibooks.org/wiki/X86_Disassembly/The_Stack

  • 這是什麼意思? movl $0x5,-0x4(%rbp); %negative 0x4是什麼意思?

有2個共同組裝語法

  1. AT & T,這是一個不可讀的混亂
  2. 「常規」 Intel語法

你的代碼是在&牛逼不幸。 %是如何在AT & T語法中引用變量。 -0x4是編號爲-4的十六進制表示(請參閱上面的答案)。

http://en.wikipedia.org/wiki/X86_assembly_language#Syntax

2
  • 沒有所謂的「高速緩存地址」沒有這樣的事 - 緩存從程序抽象,只有CPU和操作系統知道緩存以及如何內存地址轉換爲「高速緩存地址」

  • 變量i分配在堆棧上。 rbp是框架的「基指針」,指向當前函數的框架,它正在堆棧上執行。所以-0x4(%rbp)意味着在偏移4(向後 - 回到那個點)到寄存器rbp,變量i被定位。 瞭解更多關於棧作品和它的框架看起來像什麼這裏如何:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html

  • movl $0x5,-0x4(%rbp)是有效的,你是正確的,這似乎不可思議,從英特爾的語法未來世界。但實際上這是AT語法代碼的一個例子。讀到這裏作進一步的解釋:http://en.wikipedia.org/wiki/X86_assembly_language#Syntax

我真的覺得你會從閱讀這受益:http://lwn.net/Articles/250967, 思考「大局」關於內存當它真的幫了我很多。

2
  • 您的意思是「不在註冊表中嗎?」因爲你的程序沒有用高優化設置進行編譯(但是如果你使用高優化值編譯你的整個過程是空的,因爲它沒有「做任何事情」(沒有副作用)。包含你的變量的地址肯定會是帶來的內存緩存,當CPU執行這些指令

    • 寄存器RBP包含了函數的棧幀的基礎上,這也正是當地的自動變量從分配的,這是由調用約定指定的語言

    • 在這種情況下,mov指令是立即值到存儲器位置的移動,%表示一個寄存器名稱。由於堆棧傳統上向下增長,因此本地自動變量的偏移量與幀/堆棧底部之間的負偏移量。

0
  • 爲什麼不變量i留在寄存器中?

這是編譯器的決定。在過去,人們會使用關鍵字register給編譯器一個提示,說這個變量是經常使用的,這樣編譯器可能會使用這個字段的寄存器而不是棧條目。現在不推薦這樣做,因爲編譯器現在非常聰明,通常會比我們更好地優化。

  • 爲什麼寄存器rbp包含內存緩存行的地址,而不是我的地址(即4個字節)?

在輸入函數時,局部變量將被壓入堆棧。在此rbp將被設置爲rsp的值,堆棧指針。由於rsp指向下一個可用空間,因此rbp也是如此,所以需要-4來獲取推入堆棧的最後一個變量的地址,在本例中爲i

  • 這是什麼意思? movl $ 0x5,-0x4(%rbp); %和 負數0x4是什麼意思?

將值0x5放入地址rbp-4中。