我一直在努力学习如何准确地解释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
有人可以帮助我绘制出我写的这个非常简单的程序吗?
谢谢
答案 0 :(得分:-3)
汇编程序代码不会精确映射到c#/ c ++ / c代码。
当代码在内存中创建一个保留位置时,将val推入其中(1a为十六进制),然后从内存中删除它。它正在做很多在“背景”中发生的事情,而更高级的语言隐藏在你身上。
将%rbp推入堆栈:
push %rbp
将%rbp内存中的任何内容移动到%rsp:
mov %rsp,%rbp
xor是一个逻辑操作,答案是0.这会初始化内存,就像你明确地做int joe = 0
一样,这是c中int的默认值。为什么不将0移入var?可能是因为xor比将值移动到内存中的位置更快:
xor %eax,%eax
将1a(十六进制)的值移动/加载到rdp
中movl $0x1a,-0x4(%rbp)
从堆栈中删除rbp:
pop %rbp
出口:
retq