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

8086汇编编程求助:实现单行字符计数并保存最短行长度

8086汇编实现统计每行输入字符数并记录最短行长度

原代码问题分析

  • 初始最短值rslt34设为0,第一次输入的行长度必然大于0,导致无法正确初始化最短值
  • 比较逻辑完全错误:cmp al,bl后用jle radek,意思是当前行长度小于等于当前最短时不更新,这和需求相反,应该是当前行更短时更新最短值
  • 未处理仅输入一行就结束的情况,此时最短值应等于该行长度

修正后的代码

cpu 8086
segment code
start:
    mov bx, data
    mov ds, bx
    mov bx, stack
    mov ss, bx
    mov sp, dno

radek:
    ; 调用DOS中断0Ah读取一行输入
    mov ah, 0x0a
    mov dx, nacteno
    int 21h

    ; 获取实际输入的字符数(不含回车符)
    mov al, [nacteno+1]
    ; 输入为空(直接回车)则结束程序
    cmp al, 0
    jz konec

    ; 第一行输入时,直接将长度设为初始最短值
    cmp byte [rslt34], 0
    je init_min

    ; 对比当前行长度与已记录的最短值
    mov bl, [rslt34]
    cmp al, bl
    ; 当前行更长或相等则跳过更新,继续下一行
    jge radek
    ; 当前行更短则更新最短值
    mov [rslt34], al
    jmp radek

init_min:
    ; 初始化最短值为第一行长度
    mov [rslt34], al
    jmp radek

konec:
    hlt

segment data
nacteno db 255, ?  ; 0Ah功能输入缓冲区:首字节为最大长度,次字节为实际输入长度
        resb 255   ; 存储输入的字符内容
rslt34  db 0       ; 用于保存最短行的长度

segment stack
        resb 16    ; 分配16字节栈空间
dno:    db ?       ; 栈底标记

代码说明

  • 输入处理:借助DOS中断INT 21h的0Ah功能读取输入,该功能会自动将实际输入的字符数(不含结尾回车)写入缓冲区的第二个字节位置
  • 初始化逻辑:第一次输入时,因rslt34初始为0,直接将当前行长度存入作为初始最短值
  • 更新逻辑:后续每行输入后,将当前长度与rslt34的值对比,仅当当前行更短时才更新最短值
  • 终止条件:当用户直接输入回车(实际输入长度为0)时,程序停止,此时rslt34中保存的就是所有输入行的最短长度

内容的提问来源于stack exchange,提问作者m.54

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:55:07