这个汇编小程序,我看不懂?谁帮我解释一下

问题:
在字符串中查找第一个非'A'字符,该字符串长度保存在cx中,并且ds:di指向字符串。如果找到,BX指向非‘A’字符,找不到BX=-1

答案见图片。
JNE ok:这一句看不懂。这句话是依靠什么来跳转的?

这个是对CMP AL,[DI]这句话执行后的ZF标志位的判断。

如果找到了第一个非“A”字符,则LOOPE不满足,不会跳转到NEXT,继续执行下面的MOV BX,DI,然后跳转到结束,因为此时已经找到了第一个非"A"字符。BX指向非‘A’字符。

假如这段字符串找完后还没有找个非“A”字符,即此时CX为0,LOOPE不满足,执行下面的MOV BX,DI,然后判断ZF(这个ZF是由CMP AL,[DI]计算出来的),ZF=0,JNE跳转不满足,继续执行下面的MOV BX,-1 ,即实现了“找不到BX=-1”的要求。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-23
用LOOPE指令控制循环,实现循环时要以下两个条件同时成立:
一个是CX自减1后不为零;一个是ZF位等于1。

LOOPE NEXT指令前面一条CMP AL,[DI]这个就是用来控制ZF位的。

即循环结束有两种情况:
一个是遍历完这条字符串,(CX)=0,则跳出循环
一个是找到非'A'的字符,CMP后ZF=0,则跳出循环

需要注意的第一点是:跳出循环后MOV BX,DI这条指令本身不影响ZF位的值!

所以后面还是可以用JNE OK指令来看,这个程序在结束循环时到底有没有找到非'A'字符。如果有(ZF=0),则不执行MOV BX,-1直接跳到程序结尾;如果没有(即字符串是一串的'A',ZF始终都是1),则执行MOV BX,-1
相似回答