我正在用新的Raspberry Pi弄乱,我对组装的新手是新手。我已经搜寻了Google,因此为此解决了这个问题,这是我最接近运行程序的方法。
main.s(评论来自我在Internet上发现的解释(
.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
i然后与as main.s -o main.o
组装,并与ld main.o -o main
链接。使用./main
输出运行"非法指令(核心倾倒("。
这是一个覆盆子Pi B型B跑动臂Arch Linux在64位四核ARM Cortex-A53上。
目标:仅使用as
和ld
进行编译和链接的ARM组装程序,该程序将成功退出
在MAN页面中的syscall
中,它指出,syscalls的ARM64架构呼叫约定为:"参数:x8"one_answers"指令:SVC#0"。在这个GitHub项目中,"退出"的SYSCALL论点定义为" 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
另一个答案,因此有有关系统调用的有用信息
您将值0移至内存地址0。您不能仅写入任意内存位置。该程序失败了,因为它试图写入其不拥有的内存区域。尝试将其移至有效的寄存器。
也有很多好的教程:
https://azeria-labs.com/writing-arm-sembly-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
.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