操作系统如何影响汇编代码的运行方式?

时间:2009-07-24 01:22:51

标签: macos assembly x86 x86-64

我希望学习x86的汇编语言。我在Mac上,我假设大多数x86教程/书籍都使用适用于Windows的代码。

运行代码的操作系统如何影响代码的作用,或者确定代码是否有效?我可以遵循基于Windows的教程,并修改一些命令,使其适用于Mac相对容易吗?更一般地说,Mac程序集程序员,特别是应该知道的是否有什么棘手的问题?谢谢!

5 个答案:

答案 0 :(得分:20)

答案 1 :(得分:6)

一般来说,只要您使用相同的汇编程序和相同的体系结构(例如,NASM和x86-64),您就应该能够在Windows和Mac上组装程序集。

但是,请务必记住可执行格式和执行环境可能不同。例如,Windows可能会以不同的方式模拟/处理某些特权指令,从而导致不同的行为。

答案 2 :(得分:2)

差异的另一大部分在于程序如何与外界沟通。

例如,如果要向用户显示消息或读取文件或分配更多内存,则必须通过进行某种系统调用来要求操作系统执行此操作。那会 OS之间存在很大差异。

只要您使用相同的汇编程序,语言语法本身应该基本相同。不同的汇编程序有时在语法或不同的宏上有不同的顺序,但没有什么是太难以习惯的。

答案 3 :(得分:2)

英特尔汇编语言的巨大鸿沟介于AT& T语法和英特尔语法之间。你需要一个Mac的汇编程序,它使用与你使用的任何教程相同的语法。由于我认为BSD变体MacOS Darwin使用AT& T语法,而Microsoft汇编程序使用Intel语法,因此您需要小心。

要注意的另一个区别是系统的应用程序二进制接口(ABI),它涵盖了调用约定,堆栈布局,系统调用等。它们可能在操作系统之间存在很大差异,特别是在与位置无关的代码动态链接时。我有一些模糊的不愉快的回忆,说PIC在PowerPC MacOS上特别复杂,但也许它在英特尔上更简单。

一条建议:学习x86_64 (也称为AMD64) - 手动编写汇编代码会更有趣,而且你会更加面向未来。

答案 4 :(得分:1)

当我在编程旅游访问期间进入大会时,在每个教程中阻碍我的问题是无法以正确的二进制格式编译。大多数教程都提供elf(对于Linux)和aoutb(对于BSD),但后者(逻辑选择?)OS X抱怨:

ld: hello.o bad magic number (not a Mach-O file)

Mach-O格式失败,如果您man nasm仅获得binaoutelf文件格式,则man ld没有更多帮助 - macho是为OS X制作Mach-O格式的选项:

nasm -f macho hello.asm

wrote up the journey here(包含指向汇编和其他信息的好TextMate包的链接),但是 - 简而言之 - 以上是您需要开始使用的内容。