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)会变化,等待越久差值越大。
原因分析
- 非法指令的根本原因:程序的
_start标签下仅执行了ldr x0, =list,没有添加程序退出的指令。CPU执行完这条指令后,会继续向下读取内存中的内容作为指令执行——而后续的.data段存储的是数组数据(32位的.word值),这些数据并非合法的ARM64 64位指令,因此触发“illegal hardware instruction”错误。 - 进程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
相关产品推荐
相关产品推荐

