运行 MacOS 上的英特尔无前缀 x86-64 程序集

Run intel no prefix x86-64 assembly on MacOS

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

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

        .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

编辑:在 VM 上设置 ssh 服务器并通过主机终端连接到 VM 使使用 VirtualBox 变得更加容易,请参阅

您正在尝试 assemble 使用 gas syntax, so you need to use an assembler that supports that -- either gas iteself, or something like yasm

的文件

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

问题不仅在于语法,事实上,部分 支持语法本身。您还将 运行 了解其他与平台相关的差异。例如,“.type”指令不会在 macOS 上使用,并且符号名称以下划线为前缀。

如果您的 VM 有键盘问题,我建议在 VM 中设置一些服务器 Linux 分布,然后 运行 它处于无头模式。通过使用 ssh 登录来访问它。这样你就可以通过终端与它交互,应该不会出现键盘问题。

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

无论如何,如果您对适用于 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" 构建,没有理由假装我们是 运行ning gcc ;)