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 只有 as
和 ld
将成功退出
您正在将值 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
和视频:
在 syscall
的手册页中指出系统调用的 arm64 架构调用约定是:"argument: x8" 和 "instruction: svc #0"。在 this github project 上,'exit' 的系统调用参数定义为“93”。因此,这是一个仅使用 as
和 ld
...
编译的工作、退出和成功的 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
我正在摆弄我的新 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 只有 as
和 ld
将成功退出
您正在将值 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
和视频:
在 syscall
的手册页中指出系统调用的 arm64 架构调用约定是:"argument: x8" 和 "instruction: svc #0"。在 this github project 上,'exit' 的系统调用参数定义为“93”。因此,这是一个仅使用 as
和 ld
...
.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