NASM汇编循环输入程序调试求助:循环异常或提前终止问题
NASM汇编循环输入问题修正
你的程序出现循环异常,核心是数值与ASCII编码混淆、输入处理未过滤回车、输出地址错误这几个问题,以下是具体分析和修复:
问题点分析
- ASCII与数值混用,重复转换:初始化total为ASCII的'0',但在累加后又额外执行
add byte [total], '0',导致total的内容变成非数字的ASCII码(比如第一次累加后得到'3',再加'0'就变成'c'),后续计算完全混乱,要么死循环要么提前终止。 - 未处理输入后的回车符:
sys_read只读取1字节,用户输入数字后按回车,下一次循环会读到换行符(0x0A),转换为数值后是负数,累加后破坏total的正常逻辑。 - 输出时地址错误:
exit_loop里mov ecx, [total]是把total的内容当作内存地址,而sys_write需要的是缓冲区的指针,应该写mov ecx, total。
修正后的代码
section .data ask db 'Enter a number between 1 and 9, or 0 to exit: ', 0Ah ask_len equ $ - ask newline db 0Ah newline_len equ $ - newline section .bss total resb 4 ; 用数值存储总和,初始为0 input resb 2 ; 预留空间存储输入的字符+回车 section .text global _start _start: ; 初始化total为数值0(而非ASCII的'0') mov dword [total], 0 input_loop: ; 打印提示 mov eax, 4 mov ebx, 1 mov ecx, ask mov edx, ask_len int 80h ; 读取输入(最多2字节,包含回车) mov eax, 3 mov ebx, 0 mov ecx, input mov edx, 2 int 80h ; 检查是否输入0 cmp byte [input], '0' je exit_loop ; 过滤非数字输入(只允许1-9的ASCII) cmp byte [input], '1' jb input_loop cmp byte [input], '9' ja input_loop ; 转换ASCII为数值 sub byte [input], '0' ; 累加总和 mov eax, [total] add al, [input] mov [total], eax ; 检查总和是否大于9,是则退出 cmp eax, 9 jg exit_loop ; 继续循环 jmp input_loop exit_loop: ; 将数值total转换为ASCII(处理10及以上的情况) mov eax, [total] mov ebx, 10 xor ecx, ecx xor edx, edx convert_loop: div ebx push dx inc ecx test eax, eax jnz convert_loop ; 打印转换后的ASCII数字 print_loop: pop dx add dl, '0' mov [input], dl mov eax, 4 mov ebx, 1 mov ecx, input mov edx, 1 int 80h dec ecx jnz print_loop ; 打印换行 mov eax, 4 mov ebx, 1 mov ecx, newline mov edx, newline_len int 80h ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80
关键修复说明
- 分离数值与ASCII:total存储数值(而非ASCII),仅在最后输出时转换为ASCII,避免中间转换混乱。
- 处理回车符:读取2字节输入,且过滤非1-9的字符,确保只有有效数字被累加。
- 正确输出地址:输出时传递缓冲区指针,而非直接传递数值。
- 支持总和大于9的输出:新增数值转ASCII的逻辑,能正确打印10及以上的总和。
内容的提问来源于stack exchange,提问作者IKSI
相关产品推荐
相关产品推荐

