【发布时间】:2012-12-27 02:14:17
【问题描述】:
我刚刚开始学习使用 GCC 编译器来组装我的代码的 mac 程序集。不幸的是,如果您是初学者,学习如何做到这一点的资源非常有限。我终于设法找到了一些简单的示例代码,我可以开始琢磨它,并且我得到了它的组装和正确运行。这是代码:
.text # start of code indicator.
.globl _main # make the main function visible to the outside.
_main: # actually label this spot as the start of our main function.
push %rbp # save the base pointer to the stack.
mov %rsp, %rbp # put the previous stack pointer into the base pointer.
subl $8, %esp # Balance the stack onto a 16-byte boundary.
movl $0, %eax # Stuff 0 into EAX, which is where result values go.
leave # leave cleans up base and stack pointers again.
ret
cmets 在代码中解释了一些事情(我有点理解第 2 到 5 行的作用),但我不明白其中大部分是什么意思。我确实了解寄存器是什么以及这里的每个寄存器(rbp、rsp、esp 和eax)的基本用途以及它们有多大,我也(通常)了解堆栈是什么,但这仍然超出了我的想象。谁能告诉我这是在做什么?另外,任何人都可以为我指出一个适合初学者的好教程的方向吗?
【问题讨论】:
-
如果你不懂汇编,x86 是最差的先学。拥有硬件是我听过的最糟糕的第一次学习 x86 的借口(你不想第一次在硬件上学习)。
-
如果你想通过做一些有用的事情来学习,并且你在 x86 上分析一些东西,你不妨先学习 x86 asm。现代用户空间 x86 还不错。是的,如果您尝试编写操作系统,而不是查看普通程序的编译器输出,这很复杂,但不要先这样做。 the x86 tag wiki 中有很多很好的参考和学习手册链接。
标签: macos gcc assembly stack x86-64