丶Haw 发表于 2012-7-24 20:41:17

求解释

利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。assume cs:codecode segment start: mov ax,2000h      mov ds,ax      mov bx,0   s: mov ch,0           mov cl,        jcxz ok      ;当cx=0时,CS:IP指向OK       inc bx      ;这里为什么要BX自增1?      jmp short s     ok: mov dx,bx      mov ax ,4c00h      int 21hcode endsend start assume cs:code code segment start:mov ax,2000h       mov ds,ax       mov bx,0      s:mov cl,       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

メ㊣逆ご帅☆ 发表于 2012-7-24 20:41:18

本帖最后由 メ㊣逆ご帅☆ 于 2012-7-24 21:45 编辑

BX自增1,因为第一次mov cl, ,取了BX的低位,然后再次自增,再取BX低位(这里低位其实等于第一次BX的高位),所以BX自增,你应该能明白的^_^,mov cl, (这句我忘了编译器会不会报错,也许也许要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

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


後丶倁灬後覺 发表于 2012-7-24 21:01:26

还没学到那哈

五月初五 发表于 2012-7-24 21:37:08

你要明白那个s:循环是干什么的,是为了循环判断内存2000H段中查找第一个值为0的字节,BX不加1,不指向下一个内存单元,那就会拼命的在那跳来跳去,最后就会陷入死循环了。

inc是加吧,以我的理解,是为了配合循环,因为我们知道每循环一次cx的值就会减1,但是又不能在开始的时候给cx赋值,所以,只好每循环一次,就给cx加一次,当找到一个为0的值后,+1后,再减1。cx还是为0,所以就结束了循环,

Potato丶 发表于 2012-7-24 23:10:41

{:5_94:}要实现查找。当然BX要加一。才能达到遍历的目的。
第二条 loop指令是CX先减1再判断是否等于0,等于0就往下执行,不等于0就跳转到标号处。
还要查找内存单元中数据等于0的单元。CX就必须要先加1.然后执行loop后减1。。先加1再减1.CX的值就相当于没变。
这样如果CX=0.就跳出循环了。
{:5_102:}楼主认真思考哦。

丶Haw 发表于 2012-7-25 21:23:16

Potato丶 发表于 2012-7-24 23:10 static/image/common/back.gif
要实现查找。当然BX要加一。才能达到遍历的目的。
第二条 loop指令是CX先减1再判断是否等于0,等于 ...

你的意思就是假如有(cx)=0就让程序跳出循环?假如没有(cx)=0这一个选项,应该不用加上支了吧!

Potato丶 发表于 2012-7-25 21:32:26

丶Haw 发表于 2012-7-25 21:23 static/image/common/back.gif
你的意思就是假如有(cx)=0就让程序跳出循环?假如没有(cx)=0这一个选项,应该不用加上支了吧!

{:5_94:}什么支了?   Loop就是CX先减1再进行判断是否等于0的指令。如果等于0.跳出循环。程序向下执行,不等于0,就跳转到标号处啊。

大头石 发表于 2012-7-26 15:28:45

顶一下,,,,,,,,,,,,,
页: [1]
查看完整版本: 求解释