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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:03:15