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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:40:27