【问题标题】:Run intel no prefix x86-64 assembly on MacOS在 MacOS 上运行英特尔无前缀 x86-64 程序集
【发布时间】:2018-10-15 22:18:19
【问题描述】:

作为课程的一部分,我需要编写具有特定格式的汇编代码。老师称之为“Intel syntax x86-64”。我尝试使用给定的命令 (gcc -O3 -o op sc.s) 编译它,尽管在 linux PC 上运行良好,但在 Mac 上却失败了。经过一些研究,我发现 Mac OS 不支持这种语法,并按照老师的建议,我尝试从可启动的 USB 密钥和虚拟机(使用 VirtualBox)上运行 Linux,但由于键盘兼容性问题,两者都失败了。我搜索了一些在线解决方案,但没有一个可以毫无问题地编译源代码。如何在不购买新计算机的情况下运行它?如果可能的话,我想运行这个确切的语法。
感谢您阅读我!

这是他给我们的代码示例:

        .intel_syntax noprefix
        .data
msg:    .asciz "Hello, world!\n"
        .text
        .global main
        .type main, @function
main:   PUSH RBP
        MOV RBP, RSP
        MOV RDI, offset flat:msg
        CALL printf
        MOV EAX, 0
        POP RBP
        RET 

With 可以用 gcc 编译(现场显示)但用 gcc -o hw1 hw.sgcc -o hw1 -masm=intel hw.s 编译它会给我以下错误:

hw.s:6:9: error: unknown directive
        .type main, @function
        ^
hw.s:9:29: error: unknown token in expression
        MOV RDI, offset flat:msg

编辑:在虚拟机上设置 ssh 服务器并通过主机终端连接到虚拟机使 VirtualBox 的操作变得更加容易,请参阅 https://stackoverflow.com/a/10532299/5770818

【问题讨论】:

  • macOS 使用不支持此语法的不同汇编程序。你可以安装 GNU assembler gas 来让它工作。但即便如此,您也必须注意其他差异(例如符号装饰)。
  • 附带说明,“键盘兼容性问题”不相关。任何操作系统都可以安装在任何键盘布局上
  • @PaulR 我尝试使用自制软件安装 nasm,但是我收到其他错误,让我认为预期的语法和我的文件写入的语法之间可能存在一些语法差异。
  • @fuz 不是 gcc 的 GNU 部分吗?难道没有办法编译这个确切的语法吗?
  • @LưuVĩnhPhúc 我使用了 linux 无法很好识别的 MacOS-Belgian 键盘,因此无法在 VM 中写入某些基本字符(即使使用可视键盘)并且可启动安装无法识别键盘或触控板。我写这个是为了暗示经典引导或模拟效果不佳。

标签: macos assembly x86-64 intel-syntax


【解决方案1】:

我认为 macOS 上没有好的解决方案。据我所知,GNU binutils 不支持 macOS 上的 Mach 二进制格式,这意味着您不能只使用与 Linux (gas) 上相同的汇编程序。

问题不仅在于语法,事实上,这种语法是部分支持的。您还将遇到其他与平台相关的差异。例如,“.type”指令不会在 macOS 上使用,并且符号名称带有下划线前缀。

如果您在使用虚拟机时遇到键盘问题,我建议您在虚拟机中设置一些服务器 Linux 发行版,然后在无头模式下运行它。通过使用 ssh 登录来访问它。这样你就可以通过终端与之交互,并且不应该有键盘问题。

Docker 也可能是一种选择,因为它实际上在 macOS 上的虚拟机中运行 Linux,但可能需要更多工作才能弄清楚。

无论如何,如果您对适用于 macOS 的代码版本感兴趣:

        .intel_syntax noprefix
        .data
msg:    .asciz "Hello, world!\n"
        .text
        .global _main
_main:  PUSH RBP
        MOV RBP, RSP
        LEA RDI, [RIP + msg]
        CALL _printf
        MOV EAX, 0
        POP RBP
        RET 

我删除了“.type”行,在 main 和 printf 中添加了下划线,并将“MOV RDI,offset flat:msg”更改为“LEA RDI,[RIP + msg]”。

使用“clang -o hw1 hw1.s”构建,没有理由假装我们正在运行 gcc ;)

【讨论】:

  • 您可以安装自制(或 macports,从头开始构建您自己的)版本的 GCC 和 binutils(包含 as)来生成 macho64 可执行文件。
  • 你错了,自制的 binutils 不包含气体。如果你从源代码构建 binutils,configure 会告诉你它不会构建 gas。您可以做的是在 macOS 上为 ELF 构建 binutils(配置 --target=x86_64-apple-elf),但接下来您的工作是编写实现 ELF 加载的内核扩展。
  • @snowcat 非常感谢!我将获得有关 ssh 计划的更多信息,但这似乎是一个不错的选择,我不知道这是否可行。
【解决方案2】:

您正在尝试使用 gas 语法组装文件,因此您需要使用支持该语法的汇编程序 -- gas iteself 或类似 yasm 的东西

【讨论】:

  • 或 clang,MacOS 自带的。 (不过,它不接受 MacOS 目标的 .type 指令。而且 MacOS 在符号名称上使用前导下划线修饰符,并且不允许 32 位绝对地址,但语法相同。)
猜你喜欢
  • 2014-04-02
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多