我希望学习x86的汇编语言。我在Mac上,我假设大多数x86教程/书籍都使用适用于Windows的代码。
运行代码的操作系统如何影响代码的作用,或者确定代码是否有效?我可以遵循基于Windows的教程,并修改一些命令,使其适用于Mac相对容易吗?更一般地说,Mac程序集程序员,特别是应该知道的是否有什么棘手的问题?谢谢!
答案 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
仅获得bin
,aout
和elf
文件格式,则man ld
没有更多帮助 - macho
是为OS X制作Mach-O格式的选项:
nasm -f macho hello.asm
我wrote up the journey here(包含指向汇编和其他信息的好TextMate包的链接),但是 - 简而言之 - 以上是您需要开始使用的内容。