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
相关产品推荐
相关产品推荐

