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
相关产品推荐
相关产品推荐

