为何运行x86-64 Intel汇编代码无输出?期望打印hello
问题分析与修复方案
你的代码无法输出"hello"的核心问题是错误地将字符串字面量直接赋值给rsi寄存器——在Linux x86_64系统调用中,write(rax=1)要求rsi传入的是字符串的内存地址,而非字符的ASCII值。
修复后的代码
section .data msg db "hello" ; 定义字符串数据,存储在内存中 section .text global _start _start: mov rax, 1 ; sys_write系统调用号 mov rdi, 1 ; 文件描述符1(标准输出) mov rsi, msg ; 传入字符串的内存地址 mov rdx, 5 ; 字符串长度 syscall mov rax, 60 ; sys_exit系统调用号 xor rdi, rdi ; 退出码0 syscall
关键说明
- 新增
.data段存储字符串:字符串需要被加载到内存中,才能通过地址引用它。db指令用于定义字节数据,"hello"会被依次存储为'h'、'e'、'l'、'l'、'o'的ASCII值。 - 修正rsi的赋值:
mov rsi, msg将字符串的起始地址加载到rsi,这符合write系统调用的参数要求。
编译运行命令
用nasm和ld编译运行:
nasm -f elf64 yourfile.asm -o yourfile.o ld yourfile.o -o yourfile ./yourfile
执行后就能在终端看到"hello"输出。
内容的提问来源于stack exchange,提问作者BenefactorKrieger
相关产品推荐
相关产品推荐

