2015-10-04 72 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