使用x86材料在64位操作系统上学习组装?

时间:2013-11-03 17:19:04

标签: linux assembly x86 x86-64 abi

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

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

2 个答案:

答案 0 :(得分:4)

64位Linux允许运行32位应用程序,因此您仍然可以在计算机上创建32位应用程序。通过这种方式,书籍和示例32位代码非常有用。

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

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

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

答案 1 :(得分:0)

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

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

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

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