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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:07:54