Assembly 在64位系统(Ubuntu)上编译32位程序集

Assembly 在64位系统(Ubuntu)上编译32位程序集,assembly,Assembly,我想通过这本书来学习组装。这本书只涉及32位指令。有没有办法在64位Ubuntu系统上运行示例代码?我无法理解GNU汇编程序手册页上的内容,但我听说-m32标志应该可以做到这一点。但这不是一个公认的选择 如何让书中的示例轻松使用?来自as手册页: Target i386 options: [--32|--n32|--64] [-n] [-march=CPU[+EXTENSION...]] [-mtune=CPU] 我不确定它是否有效,只要试试--32或--n32

我想通过这本书来学习组装。这本书只涉及32位指令。有没有办法在64位Ubuntu系统上运行示例代码?我无法理解GNU汇编程序手册页上的内容,但我听说
-m32
标志应该可以做到这一点。但这不是一个公认的选择

如何让书中的示例轻松使用?

来自as手册页:

   Target i386 options:
      [--32|--n32|--64] [-n]
      [-march=CPU[+EXTENSION...]] [-mtune=CPU]
我不确定它是否有效,只要试试
--32
--n32

gcc -m32 -nostdlib myprog.s -o myprog

-m32
似乎使用了相应的gcc标志。)

当汇编器和链接器是x86_64版本时,生成i386(32位)输出的选项是

as --32
ld -m elf_i386
您不必仅仅因为使用汇编代码就使用
as
ld
<可以使用code>gcc,在这种情况下,您可以使用
-m32

gcc -m32 -nostdlib myprog.s -o myprog

在64位PC上创建32位可执行文件需要“警告”链接器32位elf文件即将出现:

$nasm-f elf-g-f stabs eat.asm

$ld-o吃东西。o-melf_i386

这就是melf_i386指令的作用:它告诉ld eat.o文件是一个elf32可链接的对象文件。NASM的调用与您在32位PC上使用的调用相同


谢谢@Jeff Duntemann

你能给我一本参考书吗?或者显示一些示例?现在提供链接。第一个程序就是我正在尝试运行的程序。我认为最好的方法是在VirtualBox中安装32位Ubuntu。还有其他选项(请参阅),但这确实很困难。手册页中的
--n32
似乎是
--x32
的打字错误。对于像本书中的内容这样的旧代码,您需要
--32
<代码>--x32用于使用x86_64功能但需要32位指针的较新代码。使用
as--32
时,您可能还需要
-melf_i386
来执行
ld
命令。@WumpusQ.Wumbley很好,它可以工作!如果你发一个,我会检查你的答案。:)另一方面,这是当今学习组装的推荐方法吗?我知道这本书有点旧,但它似乎是一本好书。任何与本书一样好的64位替代资源都会很有帮助。:)伟大的谢谢你的提示。