【问题标题】:Errors on assembling ARM asm on an x86 PC with GCC or `as`使用 GCC 或 `as` 在 x86 PC 上组装 ARM asm 时出错
【发布时间】:2018-03-14 10:39:41
【问题描述】:

所以我一直在做组装教程,一开始就卡住了。

项目名称:asmtut.s

代码:

.text

.global _start

start:
  MOV R0, #65
  MOV R7, #1

SWI 0

一开始,我在尝试此行后收到 3 条错误消息:

as -o asmtut.o asmtut.s

asmtut.s:6:错误:在“,”之后需要操作数;一无所有
asmtut.s:7:错误:在“,”之后需要操作数;一无所有
asmtut.s:9:错误:没有这样的指令:'swi 0'

我很困惑,因为这是教程中的确切代码,并且完全可以正常工作。

谁能帮帮我这是什么原因造成的?

【问题讨论】:

  • 您使用哪个as 变体?您遵循哪个教程?
  • 我怀疑您使用的是 x86 Linux 系统,as 正在等待 x86 指令。 # 是注释字符,x86 没有 swi 指令。本教程可能在 ARM 系统上 运行 as。在 x86 上,安装交叉汇编程序。 (顺便说一句,你的标签应该是_start:,而不是start:。不过,它仍然可以工作,因为ld 默认将.text 部分的开头作为入口点,如果没有_start 符号。
  • 谢谢,这可以解释。非常感激。我正在 youtube 上做 Derek Banas 的组装教程。 youtube.com/watch?v=ViNnfoE56V8

标签: assembly arm cross-compiling


【解决方案1】:

您正在尝试使用 x86 汇编器来汇编 ARM 代码。它们使用不同的指令集和语法。

x86 Linux 系统上的原生 gccas 工具会阻塞,就像您尝试使用 Java 编译器编译 C++ 一样,反之亦然。例如,# 是 GAS x86 语法中的注释字符,因此 mov r0, 甚至在注意到r0 不是有效的 x86 寄存器名称之前就是一个语法错误。


您正在学习在基于 x86 的 PC 上在 Raspberry Pi(一种 ARM 架构)上进行组装的教程。 在 Raspberry Pi 上运行 as,或者为 Rasperry Pi/ARM 安装交叉编译工具链。

一些 Linux 发行版具有提供 arm-linux-gnueabi-as...-gcc 的软件包。例如,https://www.acmesystems.it/arm9_toolchain 包含 Ubuntu 的详细信息。

要实际运行生成的二进制文件,您可以在 ARM 系统上运行它们,或者您需要像 qemu-arm 这样的 ARM 模拟器。 How to single step ARM assembly in GDB on QEMU?How to run a single line of assembly, then see [R1] and condition flags 有这样做的演练。

【讨论】:

  • 但请注意,如果没有模拟器或类似设备,您将无法在 x86 上运行 ARM 程序。
  • @Zeta:如果您愿意,我可以将我的版本作为新答案发布。我没想到;通常在旧问题上,有一个需要改进的被接受或高度投票的答案,而我在寻找副本时就是这种心态。我个人不从事 RPi 开发,因此将这些链接作为社区 wiki 答案的一部分供其他人维护似乎是个好主意。
  • @PeterCordes 是的。特别是因为它是一个不断变化的主题,带有新的工具链等;希望伟大的画面不再改变太多。只是想确保您获得适当的声誉。我对正在编辑的答案很好,毕竟这是一个 wiki 答案:)。
  • 谢谢,但我想我会不理会这个问题,而不是用第二个答案来混乱这个问题。我不需要另外几个非常糟糕的书呆子点:P
【解决方案2】:

试试这个

 global _start  

 _start:
         MOV eax, 1
         MOV ebx, 65
         int 0x80

然后安装nasm并用这个命令编译它nasm -f elf32 asmtut.s -o asmtut.o

【讨论】:

  • 感谢您的贡献,但您正在回答没有被问到的问题。问题是关于跨平台/架构编译,而不是关于 x86 程序集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多