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

使用SCASB指令统计句子中单词出现次数的MASM技术求助

MASM单词出现次数统计实现方案

你的空格替换逻辑是基于查找单个空格字符并处理,但单词计数需要判断单词的边界(即从空格切换到非空格的时刻),不能直接套用空格替换的逻辑。以下是适配你现有代码风格的单词计数实现:

.386
.model flat, stdcall
option casemap:none

include \masm32\include\kernel32.inc     
include \masm32\include\masm32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
                     
.stack 4096

.const
Space equ ' '

.data
buffer byte ' Test  test tes t  ', 0 
BufLen equ $ - buffer - 1
countMsg byte '单词数量: ', 0
countBuffer byte 10 dup(0) ; 存储转换后的数字字符串

.code
start proc            
    push es
    push ds
    pop es
    xor bx, bx          ; bx用于统计单词数
    xor dl, dl          ; dl标记当前状态:0=处于空格,1=处于单词
    cld                   
    mov ecx, BufLen
    lea esi, buffer

Next:
    lodsb               ; 从buffer中读取一个字符到al
    cmp al, Space
    je IsSpace
    ; 当前是非空格字符
    cmp dl, 0
    je NewWord          ; 如果之前是空格,说明进入新单词
    jmp Continue

IsSpace:
    mov dl, 0           ; 标记为处于空格状态
    jmp Continue

NewWord:
    inc bx              ; 单词数加1
    mov dl, 1           ; 标记为处于单词状态

Continue:
    loop Next           ; 循环处理所有字符

    ; 现在bx中是单词数量,需要转换为字符串并输出
    invoke dwtoa, bx, addr countBuffer
    invoke StdOut, addr countMsg
    invoke StdOut, addr countBuffer
    invoke CrLf         ; 换行

    pop es            
    push 0
    call ExitProcess 
start endp
end start

关键逻辑说明:

  • 用dl作为状态标记:0表示当前处于连续空格中,1表示当前处于单词中
  • 仅当从空格状态切换到非空格状态时,才对单词数bx加1,避免首尾空格、中间多空格导致的计数错误
  • 改用lodsb逐个读取字符,替代原代码的批量查找逻辑,因为单词计数需要跟踪每个字符的状态转换,无法批量处理

与原代码的核心差异:

原代码是针对单一字符的批量定位替换,逻辑是"找到目标字符就处理";而单词计数需要状态跟踪与转换判断,核心是识别"新单词的起始点",这是两者本质的区别,不能直接套用替换的批量查找逻辑。

内容的提问来源于stack exchange,提问作者Glamy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:50:12