. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  检测点9.3疑惑  [待解决] 回复[ 46次 ]   点击[ 2211次 ]  
one_step
[帖 主] [ 发表时间:2007-11-29 11:30 ] 
荣誉值:0
信誉值:0
注册日期:2007-11-29 11:23
补全程序,利用loop指令,实现在内存2000段中查找第一个值为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 bx
        loop s
      
     ok:dec bx
        mov dx, bx
        mov ax, 4c00h
        int 21h
code ends
end start
yiyn
[第32楼] [ 回复时间:2009-11-25 12:27 ] 
荣誉值:9
信誉值:0
注册日期:2009-10-18 04:41
inc cx是正解啊,我学过C其实早就能理解LOOP指令,可是我就是没明白他上面都把CX清零了还怎么能循环,这个题要从两个方面去理解
  (1)当内存时面遇到有零的时候CX被清零了,这时如果没有INC CX那么,就相当于0-1 CX得到的是FFFF很明显不能得到正确的结果,但是当我们在那里加一句INC CX时就不同了,因为当他第一个找到为零的结果的时候CL [BX] CH,0这两句把CX清零了,也就是说我们已经找到了第一个为零的结果了,这时候我们要退出循环,怎么样退出循环,就要保证CX 为零 而LOOP S 是先CX-1 结果为零就退出,那么我们就要相办法让CX 为零,所以先让已被 CL [BX] CH,0清零的CX 加上1让LOOP S执行后刚好为零这样就刚好找到了退出循环,至于为什么要 DEC BX我想这也是一目了然的,因为前面多加了一个INC BX 
  (2)当内存里面不是零的时候,(这个很重要)不为零的时候很明显,CL,[BX]将得到不为零的结果,也就是说CX 会得到一个值 你不要管这个值的大小,然后INC CX这句只不过是在他找到不为零的值上面加上了1 记住这时候CX是有值的也就是这个循环不会退出会一直下去直到遇到有零的然后 不管CX里面得到内存里面多大的值他都会因为遇到内存里面有零的值把他清零,所以就回到(1)
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved