马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
补全程序,利用loop指令,实现在内存2000H段中查找第一个值为0的byte,找到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start:
mov ax,2000h
mov ds,ax
mov bx,0
s:
mov cl,[bx]
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,[bx]
mov ch,0
后,(cx) = 0;
这时,我们希望程序不跳转继续往下执行,是吧。
如果我们没有 inc cx 的话,即
s:
mov cl,[bx]
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,[bx]
mov ch,0
inc cx ;此条指令为题目要求补全的指令
inc bx
loop s
中,我们已经 执行了
inc bx ,bx 就移到了下一个单元;
但题目要求 “ 查找第一个值为0的byte,找到后,将它的偏移地址存储在dx中 ”,所以前一个 单元才是我们要找的,所以要
dec bx 回去。
最后,如果还有什么不明白的,可以留言!
亲,如果觉得能帮到你的,记得回下贴哦!你们的回帖,是我前行的动力!
|