傲天 发表于 2015-1-19 23:32:14

王爽第二版,检测点9.3的问题

本帖最后由 傲天 于 2015-1-19 23:37 编辑

这是原答案:
补全程序,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start: mov ax,2000h
      mov ds,ax
      mov bx,0                                                                                                                                                                                          s:      mov cl,
      mov ch,0
      (inc cx);此处是要填空的地方。
      inc bx
      loop s
ok:   dec bx      ;dec的功能是bx=bx-1。
      mov dx,bx
      mov ax,4c00h
      int 21h
code ends
end star
但这个空填的我不明白了:
这题是先把DS段地址设置成2000,然后用BX做偏移地址,查找每一个字节
这段代码应该是这样理解:把DS段偏移为0的字节赋给了CL,CH赋0,那么如果第一个字节为0,就应该跳出循环,因为找到为0的字节了,但中间加了一个inc cx,那么CL的值自然就等于1了,应该说CX的值为0001,CL的值为01,不管是哪种情况,CX均不为0。因为:CX不为0,那么就会继续Loop,前面的inc bx,就会查找下一个字节了,按这个理论,那么无论怎么查找,CX也不会为0,也就是会进入一个死循环。
所以,我认为这里应该什么也不填才对。
理由:如果什么也不填,那么第一个字节为0了,那么,inc bx就会指向下一个单元,执行到Loop时,就会跳出循环,执行OK的dec,使BX减1而指向原来正确的字节,如果CX不为0,那么inc BX会指向下一个单元,而把新的值赋给了CL,以此类推。
不知道我说的对不对,如果我说的不对,请指出我到底错在哪里了,谢谢!(排版没排好,代码中间有点乱)





hosoo 发表于 2015-1-23 09:34:30

当BX的偏移地址查找到第一个值为0的字节时,不是要把这个0赋值给cl吗,那么cl=0 ,ch=0,对吧!,那么这里的cx=0,然后inc cx那么(CX)=1,然后inc bx 指向下一个单元,执行到loop s的时候,是先将CX的值减1,那么就是(cx)=(cx)-1=0 ,CX为0时,LOOP 不执行跳转。程序直接走到标号为OK那

傲天 发表于 2015-1-24 11:43:43

非常感谢,LOOP是先dec cx再检测,而不是我以前想象的先检测再dec cx
页: [1]
查看完整版本: 王爽第二版,检测点9.3的问题