【问题标题】:Compiling 32 bit assembly on 64bit system (Ubuntu)在 64 位系统 (Ubuntu) 上编译 32 位程序集
【发布时间】:2023-03-20 14:41:01
【问题描述】:

我正在尝试通过"Programming from the ground up" 这本书了解组装。本书仅涵盖 32 位指令。有没有办法在 64 位 Ubuntu 系统上运行示例代码?我无法理解 GNU 汇编器手册页上的内容,但我听说 -m32 标志应该这样做。但这不是公认的选择。

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

【问题讨论】:

  • 你能给出这本书的参考吗?或者展示一些样品?
  • 现在给出了链接。第一个程序是我要运行的程序。
  • 我认为最好的方法是在 VirtualBox 中安装 32 位 Ubuntu。还有其他选择(见help.ubuntu.com/community/32bit_and_64bit),但这真的很难。

标签: assembly


【解决方案1】:

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

as --32
ld -m elf_i386

您不必因为使用汇编代码而使用asld。可以使用gcc,在这种情况下,您将使用-m32

gcc -m32 -nostdlib myprog.s -o myprog

【讨论】:

  • 太棒了!感谢您的提示。
【解决方案2】:

来自 as 手册页:

   Target i386 options:
      [--32|--n32|--64] [-n]
      [-march=CPU[+EXTENSION...]] [-mtune=CPU]

我不确定它是否有效,请尝试--32--n32

(-m32 好像是 ge 对应的 gcc 标志。)

【讨论】:

  • 手册页中的--n32 似乎是--x32 的拼写错误。对于本书中的旧代码,您需要--32--x32 适用于使用 x86_64 功能但需要 32 位指针的较新代码。使用as --32 时,您可能还需要-m elf_i386 来执行ld 命令。
  • @WumpusQ.Wumbley 很好用!如果您发布一个,我会检查您的答案。 :) 附带说明一下,这是当今学习装配的推荐方式吗?我知道这本书有点老了,但它似乎是一本好书。任何与本书一样好的 64 位替代资源都会有所帮助。 :)
【解决方案3】:

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

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

$ ld -o eat eat.o -melf_i386

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

感谢@Jeff Duntemann

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 2011-11-11
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多