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

AArch64 Linux下Hello World汇编程序段错误原因排查

AArch64汇编Hello World段错误的原因分析及修复

你的汇编程序存在几处关键错误,导致运行时触发段错误,以下是具体问题和修复方案:

1. 符号名大小写不匹配

代码中adr x1, hello_String引用的符号是hello_String(首字母大写S),但.data段定义的字符串标签是hello_string(小写s)。汇编器区分大小写,这会导致x1指向非法内存地址,触发段错误。

2. 字符串长度赋值错误

mov x2, x1这行错误地将字符串地址赋值给x2,而系统调用要求x2传入字符串的字节长度。"Hello World!\n"共包含13个字节(含换行符),需要将x2设置为对应数值。

3. AArch64系统调用软中断指令错误

Linux AArch64架构下,触发系统调用需使用svc #0,而非svc #0x80。0x80是x86架构的系统调用软中断号,AArch64使用svc #0作为系统调用触发指令。

4. 立即数加载指令语法错误

ldr x8, #64不符合AArch64汇编规范,加载小立即数应使用mov指令(如mov x8, #64),ldr指令通常用于从内存加载数据,而非直接加载立即数。


修正后的汇编代码

// 程序2:Hello World
// 一个向标准输出(终端)打印"Hello World!"的程序

.global _start
.text
_start:

    // 向标准输出写入消息的代码
    mov x8, #64       // 将write系统调用号存入寄存器x8
    mov x0, #1        // 将文件描述符存入寄存器x0(1表示标准输出)
    adr x1, hello_string   // 将字符串地址存入寄存器x1
    mov x2, #13       // 将字符串长度存入寄存器x2("Hello World!\n"共13字节)
    svc #0            // 向操作系统发起系统调用

    // 程序退出代码
    mov x8, #93       // 将exit系统调用号存入寄存器x8
    mov x0, #0        // 将返回值存入寄存器x0(0表示无错误)
    svc #0            // 向操作系统发起系统调用

.data
hello_string: .ascii "Hello World!\n"
// 程序结束

编译运行指令(假设文件名为hello.s):

as -o hello.o hello.s
ld -o hello hello.o
./hello

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:57:35