检测点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 回去。
最后,如果还有什么不明白的,可以留言!
亲,如果觉得能帮到你的,记得回下贴哦!你们的回帖,是我前行的动力!
努力前行.永不止步. 解释贴,不错不错 明白了................................ 好人啊!!! 解释的很好啊 很好。。支持一下。 解释的很好啊 学习学习再学习 dec bx还不不太懂,为什么放到前一个呢?:dizzy:
页:
[1]