时明 发表于 2012-4-29 10:53:47

检测点9.3的一点个人见解

补全程序,利用loop指令,实现在内存2000H段中查找第一个值为0的byte,找到后,将它的偏移地址存储在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
                mov dx,bx
                mov ax,4c00h
                int 21h
code ends
end start

首先我们要理解的就是loop 指令执行时它的两个步骤:
(1): (cx) = (cx) - 1
(2):判断 (cx) 是否等于 0 ,如果等于 0 ,则不跳转,继续往下执行程序;如果不等于 0 ,则进行跳转到标号出;

那么,现在我们来看一下习题的程序:
现在假设 (cl) = 0,也就是程序执行完
                mov cl,
                mov ch,0
后,(cx) = 0;
这时,我们希望程序不跳转继续往下执行,是吧。
如果我们没有    inc cx 的话,即
      s:
                mov cl,
                mov ch,0
                inc bx
      loop s
当执行到 loop s 时,它就得先执行 (cx) = (cx) - 1 【一开始讲的知识点】;此时(cx) = (cx) - 1 = 0 - 1 = -1 ;也就不等于 0 了,也就是执行跳转了,天啊,不能按照我们的思路让它继续往下执行了耶!

所以, inc cx的作用很明显了吧,我们在没执行到 loop s 时,执行完 inc cx 后;(cx) = 1
再到我们执行到 loop s 时;(cx) = (cx) - 1 = 1 - 1 = 0哈哈! (cx) = 0啦! 那么 loop 就不会跳转咯,就会按们的的思路继续往下执行咯!

在这里,个人认为ok的标号其实是多余的,可以去掉。

明白了嘛!应该很清楚的啦!

好了,我们再来讲一下 dec bx其实也很简单啦
首先,在      
            s:
                mov cl,
                mov ch,0
                inc cx    ;此条指令为题目要求补全的指令
                inc bx
      loop s
中,我们已经 执行了 inc bx ,bx 就移到了下一个单元;
但题目要求 “查找第一个值为0的byte,找到后,将它的偏移地址存储在dx中 ”,所以前一个单元才是我们要找的,所以要
dec bx 回去。

最后,如果还有什么不明白的,可以留言!
亲,如果觉得能帮到你的,记得回下贴哦!你们的回帖,是我前行的动力!

坦_然 发表于 2013-2-3 15:07:54

努力前行.永不止步.

8023az 发表于 2013-2-17 03:36:17

解释贴,不错不错

BILL-BILL 发表于 2013-7-15 15:40:02

明白了................................

wen31264570 发表于 2013-10-5 07:34:20

好人啊!!!

machine1 发表于 2013-10-5 10:09:37

解释的很好啊

baby520 发表于 2013-10-6 18:38:10

很好。。支持一下。

萌辉 发表于 2013-11-4 21:37:01

解释的很好啊

菜鸟一个a 发表于 2014-1-11 23:14:26

学习学习再学习

To_Be_Or_Not_To 发表于 2014-1-17 17:58:20

dec bx还不不太懂,为什么放到前一个呢?:dizzy:
页: [1]
查看完整版本: 检测点9.3的一点个人见解