老师 发表于 2014-9-29 19:28:58

矛盾的检测点9.2

大家且看下面的图片

不知道大家发现问题没有,没有也没关系,且听我道来!

题目的要求是“找到第一个值为0的字节,然后将地址放入dx中”也就是说内存单元中的数据00H—0FH都是符合条件的,可是呢?下面的程序只给出了四条横线。如果是四条横线的话,程序只能写成图片中的那样,可是图片中的那样会符合题目的要求么?
首先我们来看第一条指令:
s:mov ch,0
这条指令我想大家应该不难理解它的用意吧(将cx高字节初始化为0)。
我们再来看看第二条指令:
mov cl,
就是将内存单元中的数据送入cl以判断。
第三条指令:
jcxz ok
判断,如果cx=0那么跳转到标号ok处执行,如果cxnot=0那么向下执行。
第四条指令:
inc bx
bx++以寻找下一个符合条件的数据。
好了,到这里大家看出有什么问题了么?没有的话,请继续往下看!
我们知道“jcxz”跳转的条件就是cx中的数据要为0000H才可以,所以当ch为0时,cl也要为0,所以mov cl,执行后cl为0才可以,所以说一定要为0才可以,所以图片中的程序筛选的是内存单元为0的字节,而不是第一个值为0的字节单元,那么要达到目的应该怎么做呢?请大家在下面回复吧!
最后,如果有什么错误的请大家指教,谢谢!!!

漩涡鸣人 发表于 2014-9-29 20:32:46

筛选到为0之后,就跳转到OK处,赋值给dx,退出程序
也就是说找到第一个为0之后,就不会再继续筛选了,那就不是您说的“筛选内存单元为0的字节”,就是第一个为0的字节
这个程序没有什么问题吧

(^_^)∠※ 发表于 2014-9-29 22:01:02

我看好像就是莫有问题啊!!!!!!!!!!!!

KasoLu 发表于 2015-1-18 21:31:05

第一个值为0的字节指的是第一次出现的值为0的字节(00H)。。。按LZ的理解方式。。。00-0F应该是前四个值为0的字节(0000 0000 - 0000 1111)。。。

傲天 发表于 2015-1-24 11:34:00

本帖最后由 傲天 于 2015-1-24 11:38 编辑

所以当ch为0时,cl也要为0,所以mov cl,执行后cl为0才可以,所以说一定要为0才可以,所以图片中的程序筛选的是内存单元为0的字节,而不是第一个值为0的字节单元.你这句话理解的有点问题,CL是字节型的,传送的也是字节型,而不是字型了,赋的是00,而不是0000.mov CH,0是清空高位,以后就用不到CH了,现在看的是CL,和CH无关了。

吃货YA鸭 发表于 2017-6-16 14:32:37

这里的第一个值为0的字节,是一个字节一个字节看的.

kingfon 发表于 2017-12-2 14:04:33

这个程序没有问题,你可以用debug跟一下,建议进入debug之后手动将2000:0前几个字节改成非0的数值

兰陵月 发表于 2017-12-2 17:11:25

kingfon 发表于 2017-12-2 14:04
这个程序没有问题,你可以用debug跟一下,建议进入debug之后手动将2000:0前几个字节改成非0的数值

兄弟,你在挖坟啊~~~{:10_247:}

酿泉为酒 发表于 2018-1-25 10:58:45

没问题,虽然jcxz是判断的cx为字单元,题目要求的是字节,但首先重新审题,题干的字节是基于2000h段中的,所以将其赋给了cl,同时ch赋00,这样又可以不违背jcxz的判断定理,又能满足题意

梦想飞翔的蜗牛 发表于 2019-1-26 20:25:36

程序没有错啊,“jcxz”跳转的条件就是cx中的数据要为0000H才可以,所以当ch为0是我们赋的值为0,cl是mov cl,赋的值,所以可以检测到cl,也就是是否为0,为0就跳转到ok处
页: [1]
查看完整版本: 矛盾的检测点9.2