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

NASM汇编程序无限循环问题求助:实现用户姓名输入输出功能

排查汇编程序无限循环问题并修复

嘿,我来帮你搞定这个无限循环的问题!先看看你的代码里的两个核心错误:

错误1:输入缓冲区指向错误

你在读取用户输入的时候,把ecx寄存器设置成了user——这是你存在.data段的提示字符串啊!这样用户输入的内容会直接覆盖掉提示信息,不仅会导致后续输出混乱,还可能让程序的内存行为变得不可预测。正确的做法应该是把输入写到.bss段定义好的user_v缓冲区里。

错误2:缺少程序退出系统调用

你的代码最后只写了mov eax...就没下文了,程序执行完所有指令后,没有告诉操作系统“我要退出了”。这时候CPU会继续执行内存中后续的代码,而由于_start是程序的入口点,很可能会跳回_start的开头,形成无限循环。必须在程序末尾添加退出系统调用(eax=1是退出调用号,ebx是退出码)。

修复后的完整代码

section .data
user: db 'Hello. What is your name? '
user_L: equ $-user ; 计算提示字符串长度
hello: db 'Hello, '
hello_L: equ $-hello ; 计算问候前缀长度

section .bss
user_v: resb 23 ; 预留23字节的输入缓冲区

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

    ; 读取用户输入到user_v缓冲区
    mov eax, 3
    mov ebx, 0
    mov ecx, user_v ; 这里改成user_v,不是user!
    mov edx, 23
    int 0x80

    ; 输出问候前缀
    mov eax, 4
    mov ebx, 1
    mov ecx, hello
    mov edx, hello_L
    int 0x80

    ; 输出用户输入的姓名
    mov eax, 4
    mov ebx, 1
    mov ecx, user_v
    mov edx, 23 ; 这里可以根据实际输入长度调整,不过先保持原长度
    int 0x80

    ; 程序退出系统调用,避免无限循环
    mov eax, 1
    mov ebx, 0 ; 0表示正常退出
    int 0x80

额外优化小提示

如果想更精准地输出用户输入的姓名(而不是固定23字节),可以利用int 0x80读取输入后返回的实际字节数(存在eax里),把这个值作为后续输出edx的长度,这样就不会输出多余的空字节啦。

内容的提问来源于stack exchange,提问作者J.Eva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:07:34