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

