You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM64汇编程序执行触发illegal hardware instruction错误求助

ARM64汇编程序执行出现“illegal hardware instruction”的问题解决

问题重现

编写的ARM64汇编代码如下:

.global _start

_start:
    ldr x0, =list

.data
list:
    .word 1,-2,3,-4,5,-6

通过以下命令汇编、链接:

as -arch arm64 -o play.o play.s
ld -o play play.o -lSystem -syslibroot `xcrun -sdk macosx --show-sdk-path` -e _start -arch arm64

执行程序时触发错误:

$ ./play
[1]    2274 illegal hardware instruction  ./play

且每次执行前的数字(进程ID)会变化,等待越久差值越大。

原因分析

  1. 非法指令的根本原因:程序的_start标签下仅执行了ldr x0, =list,没有添加程序退出的指令。CPU执行完这条指令后,会继续向下读取内存中的内容作为指令执行——而后续的.data段存储的是数组数据(32位的.word值),这些数据并非合法的ARM64 64位指令,因此触发“illegal hardware instruction”错误。
  2. 进程ID变化的原因:错误信息中的数字是系统分配给进程的PID(进程标识符),系统每次启动新进程都会分配不同的PID,等待时间越久,期间系统创建的其他进程越多,PID的增量自然越大,这是正常的系统行为,和程序本身的错误无关。

解决方案

在_start的代码末尾添加ARM64架构下macOS的退出系统调用,让程序执行完成后正常终止,避免执行非法指令。修改后的代码如下:

.global _start

_start:
    ldr x0, =list
    ; 执行退出系统调用,x0为退出码(这里设为0表示正常退出)
    mov x0, #0
    mov x8, #1          ; macOS ARM64下exit的系统调用号为1
    svc #0              ; 触发系统调用

.data
list:
    .word 1,-2,3,-4,5,-6

重新汇编、链接后执行,程序将正常退出,不会再出现非法指令错误。

内容的提问来源于stack exchange,提问作者AsianDora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:20:08