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

NASM编写的汇编程序无法正确打印输入数字,运行出现乱码如何解决

代码问题排查

你的代码存在以下几处错误,直接导致输出异常:

  • message_done字符串长度计算错误
    定义message_done_length时你错误写成了message_done_length equ $-message,引用了起始的message标签,正确写法应为message_done_length equ $-message_done。当前错误逻辑得到的长度是从第一个字符串message的起始地址到当前地址的总长度,远大于message_done本身的实际长度,输出时会读取超出字符串本身的内存数据,这是乱码的核心来源。
  • read系统调用文件描述符错误
    读取用户输入的read系统调用需要使用标准输入的文件描述符0(STDIN_FILENO),你的代码中写的是mov ebx, 2,2是标准错误的文件描述符,虽然部分环境下标准错误也可读,但不符合POSIX规范,可能导致部分环境下读取输入失败。
  • 输入内容输出长度不合理
    你输出用户输入的num时固定写了mov edx, 5,但read系统调用执行后会在eax寄存器中返回实际读取到的字节数,直接使用这个返回值作为输出长度即可,避免输出未使用的残留内存数据。
  • 语法规范瑕疵
    section .data:、section .bss:、section .text:后的冒号是非必要的,标准NASM语法中section声明不需要加冒号,部分汇编器可能会因此抛出警告或错误。

修正参考

section .data
        message: db "please enter a number: "
        message_length equ $-message
        message_done: db "you have entered the number "
        message_done_length equ $-message_done ; 修正长度计算
section .bss
        num resb 5

section .text
        global _start
_start:
        ; 输出提示输入的信息
        mov eax, 4
        mov ebx, 1
        mov ecx, message
        mov edx, message_length
        int 0x80

        ; 读取用户输入
        mov eax,3
        mov ebx, 0 ; 修正为标准输入描述符0
        mov ecx, num
        mov edx, 5
        int 0x80
        push eax ; 暂存实际读取的字节数

        ; 输出结果提示
        mov eax, 4
        mov ebx, 1
        mov ecx, message_done
        mov edx, message_done_length
        int 0x80

        ; 输出用户输入的内容
        mov eax, 4
        mov ebx ,1
        mov ecx, num
        pop edx ; 取出之前暂存的实际读取长度
        int 0x80

        ; 退出程序
        mov eax, 1
        mov ebx, 0
        int 0x80

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:04