【问题标题】:Illegal Instruction ARM Assembly Raspberry Pi 4非法指令ARM组装树莓派4
【发布时间】:2021-04-04 14:35:39
【问题描述】:

我第一次在我的 Raspberry Pi 4 上尝试汇编代码(对不起,如果代码没有以标准方式格式化)并且我正在尝试执行我的 Hello World 代码

.global _start

_start:
mov r0, #1
ldr r1, =helloworld
mov r2, #12
mov r8, #64
svc 0
mov r0, #0
mov r8, #93
svc 0

.data
helloworld: .ascii "Hello World\n"

代码编译没有错误,但是当我尝试使用 ./HelloWorld 执行我的代码时,我得到错误“非法指令”,没有其他消息。有什么想法吗?

【问题讨论】:

  • 使用调试器和/或 strace。我假设你最后一次 svc 调用是错误的,所以它不会终止进程并且 cpu 继续执行。
  • 另请参阅文档。使用r8 是可疑的,数字也很奇怪。您使用的是什么操作系统?
  • 我发现了我的问题,我正在学习的书说我需要在我的树莓派上运行 64 位版本的 Linux,但现在我正在运行 32 位树莓派。跨度>
  • @LordBobbiousX 用于 ARM64 和 ARM32 的程序集有很大不同。我很惊讶你没有注意到。你不能在 32 位 Raspbian 上运行 ARM64 程序。

标签: assembly arm raspberry-pi4


【解决方案1】:

您在 32 位汇编语言中使用 64 位系统调用号和 ABI,这可能是在 32 位进程中不起作用。

要么将 32 位系统调用号放入 r7(写入 = 4,退出 = 1),要么在 64 位进程中使用 64 位汇编语言(不同的寄存器名称)。

【讨论】:

  • 请注意,Linux 系统调用号在所有架构上都不同。没有“64 位系统调用号”或“32 位系统调用号”。相反,有“i386 系统调用号”、“amd64 系统调用号”、“ARM EABI 系统调用号”等等。
猜你喜欢
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
相关资源
最近更新 更多