Raspberry Pi 3 模型 B ARM 程序集非法指令(核心转储)

Raspberry Pi 3 Model B ARM assembly Illegal Instruction (Core Dumped)

我正在摆弄我的新 raspberry pi,而且我对组装还很陌生。我已经搜索了 Google 和 SO 来解决这个问题,这是我最接近拥有一个 运行 程序的方法。

main.s(评论来自网上的解释)

.section .text
.global _start

_start:
    mov x0, #0 // return value 0 for success
    mov x7, #1 // 1 is exit in the vector table
    svc 0      // execute the system call to exit the program

然后我 assemble 与 as main.s -o main.o 和 link 与 ld main.o -o main。 运行 ./main 输出 "Illegal instruction (core dumped)".

它是 Raspberry Pi 模型 B 运行 ARM Arch Linux,基于 64 位四核 ARM Cortex-A53。

目标:编译一个 ARM 汇编程序并 linked 只有 asld 将成功退出

您正在将值 0 移动到内存地址 0。您不能只写入任意内存位置。该程序失败,因为它试图写入不属于它的内存区域。尝试将其移至有效寄存器。

还有很多好的教程:

https://azeria-labs.com/writing-arm-assembly-part-1/

http://www.peter-cockerell.net/aalp/html/frames.html

https://www.coranac.com/tonc/text/asm.htm

和视频:

https://www.youtube.com/watch?v=Sm6v9UyhCkA

syscall 的手册页中指出系统调用的 arm64 架构调用约定是:"argument: x8" 和 "instruction: svc #0"。在 this github project 上,'exit' 的系统调用参数定义为“93”。因此,这是一个仅使用 asld...

编译的工作、退出和成功的 arm 程序
.section .text
.global _start

_start:
    mov x0, #0  // exit with status 0
    mov x8, #93 // svc argument goes in x8, and the argument for 'exit' is 93
    svc #0      // executes a syscall in arm64

Another answer 关于系统调用的有用信息

.section .text
.global _start

_start:
    //mov r0, #0 // ARM 32-bit version
    mov x0, #0   // ARM 64-bit version
    //mov r7, #1 // ARM 32-bit version of this (Raspbian)
    mov x8, #93  // ARM 64-bit version of this (Ubuntu 64-bit, Arch64)
    svc 0        // execute the system call to exit the program