0

作为课程的一部分,我需要编写具有特定格式的汇编代码。老师称之为“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

4

2 回答 2

2

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

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

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

Docker 也可能是一种选择,因为它实际上在 macOS 上的 VM 中运行 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 ;)

于 2018-05-05T17:44:19.207 回答
0

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

于 2018-05-05T17:31:33.623 回答