2015-10-04 75 views
0

我一直在努力學習如何準確解密assembly程序與相同的c程序相比在做什麼。組裝的基本c的說明

例如: Ç

#include<stdio.h> 
#include<limits.h> 

int main() { 

int joe = 26; 

} 

裝配

push %rbp 
mov %rsp,%rbp 
xor %eax,%eax 

movl $0x1a,-0x4(%rbp) 
pop %rbp 
retq 

有人可以幫助我繪製出這真的微不足道的程序我寫的?

謝謝

+1

它CREA測試其值爲26的局部變量(在函數的堆棧幀上),然後返回。與C代碼中的內容完全相同。 –

+0

@DanielKamilKozar - 你會介意寫一個答案,更詳細地解釋嗎?謝謝! – CodeTalk

回答

-3

彙編代碼不準確映射到C#/ C++/C++代碼。

由於代碼在內存中創建了一個保留位置,因此將val壓入(1a爲十六進制),然後將其從內存中刪除。它正在做一個高級語言隱藏在你的背景中發生的很多事情。

推%RBP到堆棧中:

push %rbp 

移動原子%RBP在存儲器無論是給%RSP:

mov %rsp,%rbp 

XOR是邏輯運算,答案是0。此初始化內存,就像你明確做的int joe = 0這是c中int的默認值。爲什麼不將0移入var?可能是因爲異或比存儲器移動的值到一個地方更快:從棧

xor %eax,%eax 

移動/加載1A(十六進制)的值成RDP

movl $0x1a,-0x4(%rbp) 

刪除RBP:

pop %rbp 

退出:

retq 
+0

是1a的26的值嗎?你能否逐行解釋更多細節線?我將非常感激! – CodeTalk

+0

已更新的答案。 – user3791372

+0

這並不能解釋「-0x4(%rbp)」的作用,也不能解釋「retq」的作用。基本上你已經評論了你從OP複製的一些代碼 - 這不是一個答案。 – user3728501