在字符串中查找指定字母的出现次数?

Find the occurrences of a specified letter in a string?

org 100h

   mov si, 0
   mov di, 0    

back: 

   cmp string[si], 'a'
   inc si

   jz found

   jmp nfound

   found:
   inc di

   nfound:

loop back

ret
  string db 'n','a','n','b','o','N','a','n','a','w','a','g','o','s','h','t','b','o','Q','a','s','a','b'

我也试过这样定义字符串数组:

string db "nan bo Nanawa gosht bo Qasab"

jz 假设永远不成立,问题出在哪里?如果我删除 si 增量指令,条件会 return 为真!

如果您阅读英特尔手册中对 INC 的描述,您会看到:

Flags Affected
The CF flag is not affected. The OF, SF, ZF, AF, and PF flags are set according to the result.

所以你的 jz found 指令是根据 inc si 的结果而不是 cmp 的结果进行分支的。我建议您将 inc si 指令移至 loop back.

之前

比较结果是通过检查零标志计算的。

cmp string[si], 'a'之后如果两者相同,则设置零标志。所以你应该在比较后立即使用jz found

在您的代码中,您在比较后使用了 inc si,并且您丢失了比较结果,在这种情况下,如果 si 的值在 increment 之后为零,则只有零标志将设置。