鱼C论坛

 找回密码
 立即注册
查看: 2125|回复: 7

求解释

[复制链接]
发表于 2012-7-24 20:41:17 | 显示全部楼层 |阅读模式
1鱼币
利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start: mov ax,2000h
        mov ds,ax
        mov bx,0
     s: mov ch,0   
       mov cl,[bx]
       jcxz ok        ;当cx=0时,CS:IP指向OK
       inc bx      ;这里为什么要BX自增1?
        jmp short s
    ok: mov dx,bx
        mov ax ,4c00h
        int 21h
code ends
end start
assume cs:code
code segment
start:  mov ax,2000h
        mov ds,ax
        mov bx,0
      s:mov cl,[bx]
        mov ch,0
       inc cx    ;这里为什么要减1?  
        inc bx
        loop s
     ok:dec bx
        mov dx,bx
        mov ax,4c00h
        int 21h
code ends
end start

最佳答案

查看完整内容

BX自增1,因为第一次mov cl, ,取了BX的低位,然后再次自增,再取BX低位(这里低位其实等于第一次BX的高位),所以BX自增,你应该能明白的^_^,mov cl, (这句我忘了编译器会不会报错,也许也许要mov byte ptr) inc cx 是自增不是减,看错了把。。。我刚刚从新下载,调试下了,我刚刚的思路是正确的,至于我为什么以为是错误的,我忘了,LOOP 是先减1再判断是否为0则跳转,我当时不知道想成什么了,INC CX,是为了当找到0的字节时 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-24 20:41:18 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2012-7-24 21:45 编辑

BX自增1,因为第一次mov cl,[bx] ,取了BX的低位,然后再次自增,再取BX低位(这里低位其实等于第一次BX的高位),所以BX自增,你应该能明白的^_^,mov cl,[bx] (这句我忘了编译器会不会报错,也许也许要mov byte ptr)
inc cx    是自增不是减,看错了把。。。我刚刚从新下载,调试下了,我刚刚的思路是正确的,至于我为什么以为是错误的,我忘了,LOOP 是先减1再判断是否为0则跳转,我当时不知道想成什么了,INC CX,是为了当找到0的字节时,LOOP减1,CX值不会便会0FFFFh
DEC BX是因为。我们假设第一次就找到BX为0的值,那么这个值则会存在2000:0处,那么这时候程序还未跳转,仍会INC BX,所以等于程序所找到的值在2000:1处,这等于多了1,所以需要DEC BX

另外我绝对没有参考楼下,刚刚不小心被该死的错误给卡住了。。无耻的要下分数_ _ 、


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-24 21:01:26 | 显示全部楼层
还没学到那  哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-24 21:37:08 | 显示全部楼层
你要明白那个s:循环是干什么的,是为了循环判断内存2000H段中查找第一个值为0的字节,BX不加1,不指向下一个内存单元,那就会拼命的在那跳来跳去,最后就会陷入死循环了。

inc是加吧,以我的理解,是为了配合循环,因为我们知道每循环一次cx的值就会减1,但是又不能在开始的时候给cx赋值,所以,只好每循环一次,就给cx加一次,当找到一个为0的值后,+1后,再减1。cx还是为0,所以就结束了循环,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-24 23:10:41 | 显示全部楼层
要实现查找。当然BX要加一。才能达到遍历的目的。
第二条 loop指令是CX先减1再判断是否等于0,等于0就往下执行,不等于0就跳转到标号处。
还要查找内存单元中数据等于0的单元。CX就必须要先加1.然后执行loop后减1。。先加1再减1.CX的值就相当于没变。
这样如果CX=0.就跳出循环了。
楼主认真思考哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-7-25 21:23:16 | 显示全部楼层

你的意思就是假如有(cx)=0就让程序跳出循环?假如没有(cx)=0这一个选项,应该不用加上支了吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-25 21:32:26 | 显示全部楼层
丶Haw 发表于 2012-7-25 21:23
你的意思就是假如有(cx)=0就让程序跳出循环?假如没有(cx)=0这一个选项,应该不用加上支了吧!

什么支了?   Loop就是CX先减1再进行判断是否等于0的指令。如果等于0.跳出循环。程序向下执行,不等于0,就跳转到标号处啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-26 15:28:45 | 显示全部楼层
顶一下,,,,,,,,,,,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 06:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表