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

