3

我正在搞乱我的新树莓派,而且我对组装还很陌生。我已经在 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

然后我组装as main.s -o main.o并链接到ld main.o -o main. 运行./main输出“非法指令(核心转储)”。

它是在 64 位四核 ARM Cortex-A53 上运行ARM Arch Linux的 Raspberry Pi Model B。

as目标:只编译和链接一个 ARM 汇编程序,该程序ld将成功退出

4

3 回答 3

2

在手册页中syscall,它指出系统调用的 arm64 架构调用约定是:“argument: x8”和“instruction: svc #0”。在这个 github 项目中,“exit”的系统调用参数定义为“93”。因此,这是一个工作的、退出的和后续的 arm 程序,仅使用asand 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

关于 SO 的另一个答案,其中包含有关系统调用的有用信息

于 2018-02-22T14:16:58.333 回答
0

您正在将值 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

于 2018-02-22T03:37:45.380 回答
0
.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
于 2019-11-28T04:56:39.827 回答