1

我正在自学/阅读有关装配的信息。大多数关于汇编的书籍都提到 x86 - 代码中的所有寄存器名称都以“e”而不是“r”开头(就像在 x86-64 中一样)。但是,我使用的是 64 位 Linux,我想知道这些书是否有任何价值,因为它们不是指 x86-64。

简而言之,我使用这些资源来学习 x86-64 真的值得吗?或者换个不同的措辞,除了寄存器命名约定的不同——两者之间是否还有其他差异可能使学习 x86 材料变得困难?

4

2 回答 2

4

64 位 Linux 允许运行 32 位应用程序,因此您仍然可以在计算机上创建 32 位应用程序。这样,书籍和示例 32 位代码就完全有用了。

您可能遇到的唯一问题是程序集应用程序是否动态链接到某个 32 位共享库。为了解决这个问题,您应该安装 32 位兼容层。

只使用 Linux 系统调用的汇编程序在没有这一层的情况下也能正常工作,这实际上是为 32 位编译的共享库集。

顺便说一句,在我看来,如果您希望您的程序对更多人有用,那么编写 32 位代码仍然更好。周围还有很多 32 位计算机,它们不会很快消失。

于 2013-11-03T17:28:23.973 回答
0

在 32 位上学习汇编确实容易一些,因为调用约定和堆栈管理更简单。

在 64 位上,您需要担心 ABI。不仅如此,每个操作系统的约定也不相同。例如,Mac OS X 上的 ABI 规则与 Windows 上的不同(寄存器不一样,在 Windows 上它只使用 4 个寄存器)。

您可以使用带有汇编器 (as) 的 -arch i386 编译您的汇编代码。使用 clang 或 gcc 您可以使用 -m32 (至少在 Mac OS X 上,因为我没有在 Linux 上使用它)。您将无法链接具有不同位数(32 位与 64 位)的模块。

一旦你准备好切换或编译你的 64 位程序,你必须确保当你处理堆栈时,你需要推送 64 位字而不是 32 位字,但这有点说得过去。

于 2013-11-05T01:03:02.283 回答