x86汇编控制台打印异常求助:无法输出非预定义变量内容
x86_64 Linux Write系统调用打印问题排查
问题1:非法内存访问导致浮点异常
你第一段代码的核心错误有两个:
- Linux的
write系统调用(rax=1)要求rsi是指向输出内容的内存缓冲区地址,而非直接存储字符的ASCII值。你用movzx rsi, dx把字符值存入rsi,这是一个无效的内存地址,内核访问时触发内存错误,表现为「Floating point exception (core dumped)」。 - 遗漏了
write系统调用的第一个参数:rdi需要设置为文件描述符(stdout对应1),未设置会导致系统调用行为异常。
修正后的代码:
section .data char db 0 ; 预留存储单个字符的内存空间 section .text global _start _start: mov dx, 5 ; 示例:0-9之间的数值 add dx, 48 ; 转换为对应ASCII字符 mov [char], dl ; 将字符存入内存(取dx的低8位dl) mov rax, 1 ; write系统调用号 mov rdi, 1 ; stdout文件描述符 mov rsi, char ; 指向内存中的字符 mov rdx, 1 ; 输出长度(1字节) syscall ; 正常退出程序 mov rax, 60 mov rdi, 0 syscall
问题2:立即数作为地址导致无输出
第二段代码的问题同样是rsi传值错误:mov rsi, 'test'是把四个字符的ASCII值打包成64位立即数,而非合法的内存地址,内核无法从该地址读取数据,因此没有输出。
修正后的代码:
section .data msg db 'test' ; 存储字符串到数据段 section .text global _start _start: mov rax, 1 ; write系统调用号 mov rdi, 1 ; stdout文件描述符 mov rsi, msg ; 指向字符串的内存地址 mov rdx, 4 ; 字符串长度(4字节) syscall ; 正常退出程序 mov rax, 60 mov rdi, 0 syscall
内容的提问来源于stack exchange,提问作者suqayzsyz
相关产品推荐
相关产品推荐

