<分区>
编辑:看起来问题在于适用于 Linux 的 Windows 子系统无法处理 32 位。
此处的汇编和 Linux 新手尝试在 Windows 上的 64 位 Ubuntu 上编译 32 位汇编(AT&T 语法)。我的情况实际上是 this other stackoverflow question 的精确复制品但出于某种原因,那里的解决方案(我在许多其他帖子中重复看到)对我不起作用。我正在通过从头开始编程这本书学习 x86 汇编,但我无法在 Windows 上的 Ubuntu 上的 Bash 上编译程序。
我在我的命令中尝试了多种选项组合,有些显然可以编译,但我要么无法执行二进制文件(格式错误),要么我可以但是当我到达 movl 8(%ebp), %eax
in my source file (我读到这可能是由于在64位环境中设置了32位堆栈)。
没有 .32code
作为我程序的第一行,并且 as
有一个 --32
选项,没有尝试 ld
产生任何有用的东西:without .32code and with --32 (还不能在我的帖子中嵌入图片,所以用链接代替)。
仍然没有 .32code
而现在有 --x32
( without .32code and with --x32 ) 我发现如果你不这样做的话,它在推送、弹出等方面有问题包含 .32code
所以我将它包含在我的源文件中:with .32code and with --x32 .
然后,我可以用 gcc
而不是 as
和 ld
进行类似的尝试,但我不确定它是否有意义包括所有不同的失败组合并打开蠕虫 jar ,因为这样我们就可以了解 gcc 是否具有它需要的库(?)。例如,使用 gcc -m32 -nostdlib factorial.s -o factorial
我得到“无法执行二进制文件:Exec 格式错误”消息,有或没有 .32code
。尝试诸如 sudo apt-get install lib32gcc-4.8-dev
之类的尝试,似乎没有任何效果,而且很多时候我都遇到了 qemu-user-static
的问题可能是因为我曾经安装过它,但现在全是 f%^#!d。
一个答案建议只安装 32 位 gcc,但这似乎对我没有任何作用。另一种解决方案是手动将书中的所有示例转换为 64 位,然后忘记所有这些。我想这意味着重新设想堆栈包含 8 个而不是 4 个(即 4(%esp)
之类的东西会变成 8(%esp)
)但是例如,也可能将一些 movl
更改为 movq
,或者将一些 %eax
更改为 %rax
等。但是我觉得应该有一些解决方案,尤其是 how the poster in 2013似乎解决了确切的问题。也许我需要用 -march=CPU[+EXTENSION...]
或 -mtune=CPU
之类的东西再试一次?也许我只是缺乏架构、Linux 或 as/gcc 方面的基础知识?