【问题标题】:Using x86 materials to learn assembly on a 64 bit OS?使用 x86 材料在 64 位操作系统上学习汇编?
【发布时间】:2013-11-03 17:19:04
【问题描述】:

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

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

【问题讨论】:

  • 调用约定会有所不同,其他的差别真的不大。
  • 除了调用约定之外,要记住的一件事是,使用 32 位寄存器作为目标寄存器始终会将相应 64 位寄存器的前 32 位归零。还有一些其他的问题。并非所有 32 位指令(即使是相对常见的指令)都是有效的 64 位指令,请参阅我的(已关闭)问题 stackoverflow.com/questions/11897116/…

标签: linux assembly x86 x86-64 abi


【解决方案1】:

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

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

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

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

【讨论】:

  • 您还应该知道,由于更复杂的调用约定(不是基于堆栈、特殊堆栈指针对齐...),64 位汇编程序更难学习。所以写 32 位对初学者来说肯定更好。
【解决方案2】:

在 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 位字,但这有点说得过去。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2023-03-12
    • 2012-05-14
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多