在字符串中查找指定字母的出现次数?
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
之后为零,则只有零标志将设置。
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
TheCF
flag is not affected. TheOF
,SF
,ZF
,AF
, andPF
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
之后为零,则只有零标志将设置。