YASM 8086:如何处理文件末尾空行并修正单词统计结果
解决YASM 8086汇编中文件末尾空行误统计的问题
空行检测核心逻辑
文件末尾的空行通常仅包含空白字符(空格)、回车符(0x0D)或换行符(0x0A),无有效列数据。我们需要在处理每一行前先判定是否为空行,空行直接跳过不参与统计。
实现空行检测子程序
添加一个子程序来检查当前行是否为空:
; 检测当前行是否为空行(仅包含空白、回车、换行) ; 输入:SI = 行起始地址,DI = 行结束地址(指向换行符) ; 输出:CF=1 表示空行,CF=0 表示非空行 IsEmptyLine: push si push cx mov cx, di sub cx, si ; 计算行的字符长度 jz .mark_empty ; 长度为0,直接判定为空行 .check_loop: mov al, byte [si] ; 检查是否为空白、回车或换行 cmp al, 0x20 je .next_char cmp al, 0x0D je .next_char cmp al, 0x0A je .next_char ; 遇到非空白的有效字符,不是空行 clc jmp .exit .next_char: inc si loop .check_loop .mark_empty: stc .exit: pop cx pop si ret
在主逻辑中加入空行跳过
在读取完一行并确定行边界后,先调用上述子程序:
; 假设当前已读取一行,SI指向行首,DI指向行尾的换行符 call IsEmptyLine jc .skip_line ; 如果是空行,跳转到处理下一行的逻辑 ; 非空行,继续处理前两列的统计逻辑 ; ... 你的列处理、单词统计代码 ... .skip_line: ; 处理下一行的逻辑
额外优化:避免空列误统计
确保统计单词时,不会把全是空格的列当成有效单词。处理列内容时先跳过开头空格,再判断是否有有效字符:
; 处理单个列的单词统计(示例) ProcessColumn: push si push bx mov bx, si ; BX保存列起始地址 .skip_leading_spaces: mov al, byte [si] cmp al, 0x20 je .skip_next cmp al, ';' ; 列结束符 je .exit_column ; 列全是空格,无有效单词 ; 找到单词起始,开始统计 call CountValidWord ; 统计当前单词是否符合要求(不含B/C) ; 跳过当前单词到下一个空格或列结束 .skip_word: mov al, byte [si] cmp al, 0x20 je .skip_leading_spaces cmp al, ';' je .exit_column inc si jmp .skip_word .skip_next: inc si jmp .skip_leading_spaces .exit_column: pop bx pop si ret
问题根源说明
你之前仅用al与0x20比较跳转,只能跳过单个空格,但无法识别仅含回车/换行的空行,也无法处理全是空格加换行的空行,导致这些空行被当成有效行处理,误统计空列中的空白字符组合。
内容的提问来源于stack exchange,提问作者KazlLaur
相关产品推荐
相关产品推荐

