【发布时间】:2010-09-13 08:16:15
【问题描述】:
我想学习汇编。然而,用 OS X 做汇编的资源很少。
有没有人在 Mac 上进行过汇编编程?你在哪里学的?
还有,我有什么理由不应该组装吗?我是否会冒着(严重)使我的计算机无法修复的风险?
【问题讨论】:
我想学习汇编。然而,用 OS X 做汇编的资源很少。
有没有人在 Mac 上进行过汇编编程?你在哪里学的?
还有,我有什么理由不应该组装吗?我是否会冒着(严重)使我的计算机无法修复的风险?
【问题讨论】:
你没有理由不这样做;在汇编语言中没有什么是在 C 等高级语言中无法做到的。
就工具而言,您可能需要安装MacPorts 并获取 GNU 汇编器。这可能是也可能不是最简单的方法,但它是免费的,您可能可以在网上的某个地方找到使用 GNU 汇编器编写 Unix 程序的教程文档。
【讨论】:
XCode(即 GCC)对编写汇编程序有很好的支持。学习它是一件有趣的事情(尽管你不太可能需要它),最糟糕的情况就是让你正在编写的程序崩溃,就像在 C 中一样。只需谷歌搜索“gcc inline asm x86 tutorial”,你就可以应该找到很多起点。不要担心有些看起来是特定于 Linux 的,它们通常在 XCode 中也能正常工作。
(edit) ...当然假设您有一台 Intel Mac;如果不是,则将 'x86' 替换为 'ppc'。
【讨论】:
如果您使用的是 PowerPC Mac,请查看 gcc 内联汇编程序。否则,请查看 nasm。我不能给出任何关于 PPC ASM 的体面参考(它们很少而且相距甚远),但我建议学习 x86 asm 的以下内容:
此外,如果您不在内核模式下,那么实际上就没有机会搞砸任何东西,即使您处于内核模式,也很难真正破坏任何东西。
编辑:另外,从 XCode 获取 gcc 等,而不是 Macports 等。如果您不这样做,您将进入一个格式错误的 Mach-O 文件的世界。刚开始进行 asm hacking 时诊断文件格式问题并不有趣。
【讨论】:
Nasm/yasm 是你最好的选择; gcc 内联语法非常严重,有时使用起来非常痛苦,而且确实有一些事情它不能 做。 Nasm 的宏语法也更加有用,它是一种像汇编这样没有内置模板功能的语言的天赐之物。
【讨论】:
汇编语言由硬件平台决定,而不是操作系统。鉴于 OS X 在 Intel 平台上运行并且是 64 位的,您应该查找有关 x64(也称为 AMD64)汇编程序的信息。查看 Wikipedia 文章 (http://en.wikipedia.org/wiki/X86-64) 以获取有关 x64 文档的大量链接。
此外,OS X 工具文档可能包含大量有关 x64 汇编器的信息。特别是,Netwide Assembler (NASM - http://developer.apple.com/documentation/DeveloperTools/nasm/nasmdoc0.html) 可能有关于如何使用汇编器构建 OS X 应用程序的文档。
【讨论】:
我在 Mac 上编写了汇编程序。它是使用 MPW 的 Motorola 680x0 汇编程序。我已经在 CodeWarrior 和 ProjectBuilder 中多次接触过 PowerPC 汇编器。现在ProjectBuilder叫XCode,还有Intel。汇编器是 XCode 中的众多工具之一。
我最初是在 Apple II 上学习汇编程序的:ROM 中内置的 6502 机器语言监视器、Sweet16 迷你汇编程序等。后来,我使用 Intel 80186 汇编器来加速慢速 C 代码,并在一所大学支付了为期一天的 Intel 80186 汇编器课程。后来,我不得不为 Mac 维护一些 680x0 的程序集。那是很久以前的事了。
我认为没有任何理由不进行组装。学习很棒。尽你所能学习。放入足够低级别的调试器并查看反汇编代码。
我的建议是:
别害怕。
【讨论】:
要开始学习汇编,您可能想从简单的 C 程序开始,并要求 GCC 使用 -S 选项为其生成汇编代码:
gcc -S hello.c -o hello.asm
然后您将能够了解如何调用函数、传递参数等。
【讨论】:
在具有操作系统的系统上编写汇编语言需要了解两三件事(与自成一体的“裸机”汇编相反):
指令集的工作原理 - 如果您有 Intel Mac,则为 Intel X86 加载资源,对于 PPC 仍然是合理的设置,例如 Mac OS X Internals。
如何组装链接您的程序 - 如果您安装了开发工具,则您有 GCC 和相关工具
如何与操作系统对话 - Mac 程序集很多的文档记录不如 Windows 或 Linux。可能您必须编写等效的 C 程序并使用“gcc -S”来查看哪些调用/堆栈恢复约定是合适的。这取决于您想要做什么,但至少您需要操作系统系统调用来进行 IO 和内存分配。
一个好的起点是here。
【讨论】:
如果您已安装开发者工具,您只需打开终端并输入as (GNU Assembler em> - Binutils 的一部分)。
【讨论】:
PPC 试试 Lightsoft
【讨论】: