我正在尝试将汇编语言作为“丰富”练习来学习。我有一台 Mac,似乎最好的学习资源是 Linux。我唯一的 Linux 在 Parallels Desktop for OSX 上运行。由于汇编是基于操作系统和芯片组的,我在尝试通过虚拟机汇编 Linux 汇编语言时会遇到很多额外的问题吗?我知道 OSX Assembly 不是最好的学习工具。
谢谢!!
-J.P
我正在尝试将汇编语言作为“丰富”练习来学习。我有一台 Mac,似乎最好的学习资源是 Linux。我唯一的 Linux 在 Parallels Desktop for OSX 上运行。由于汇编是基于操作系统和芯片组的,我在尝试通过虚拟机汇编 Linux 汇编语言时会遇到很多额外的问题吗?我知道 OSX Assembly 不是最好的学习工具。
谢谢!!
-J.P
x86-64 上的Linux 和OS X使用相同的ABI - 至少,调用约定、堆栈设置等。汇编指令略有不同。它们的不同之处在于系统调用,但如果您只是编写函数,尤其是简单的叶函数,则无关紧要。无论如何,优化热点是在用户空间中组装的少数原因之一。一个最小的 OS X 函数可能如下所示:
.text
.p2align 4 ## 16-byte aligned start.
.globl _foo_bar ## leading underscore in name.
_foo_bar:
## your code ##
L__some_label_for_jump_destination
## more code ##
ret
它被组装成 Mach-O 文件格式。对于 Linux(GNU 汇编器):
.text
.p2align 4 ## or other.
.globl foo_bar ## no leading underscore in name.
.type foo_bar,@function
foo_bar:
## your code ##
.L__some_label_for_jump_destination ## dot before label
## more code ##
ret
.size foo_bar,[.-foo_bar] ## not strictly needed - ELF object info.
该指令有不同的变体.align
,但我发现.p2align 4
涵盖了 ELF 平台和 OS X,所以我不会.align 4,0x90
在 OS X 上打扰。如果有疑问,只需查看一个简单函数的一些 C 代码汇编输出:clang/gcc -c -S foo.c
也许您想先尝试内联汇编。我不能推荐这个教程。Clang 接受GCC 的内联汇编语法。