求解释
利用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 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
另外我绝对没有参考楼下,刚刚不小心被该死的错误给卡住了。。无耻的要下分数_ _ 、
还没学到那哈 你要明白那个s:循环是干什么的,是为了循环判断内存2000H段中查找第一个值为0的字节,BX不加1,不指向下一个内存单元,那就会拼命的在那跳来跳去,最后就会陷入死循环了。
inc是加吧,以我的理解,是为了配合循环,因为我们知道每循环一次cx的值就会减1,但是又不能在开始的时候给cx赋值,所以,只好每循环一次,就给cx加一次,当找到一个为0的值后,+1后,再减1。cx还是为0,所以就结束了循环, {:5_94:}要实现查找。当然BX要加一。才能达到遍历的目的。
第二条 loop指令是CX先减1再判断是否等于0,等于0就往下执行,不等于0就跳转到标号处。
还要查找内存单元中数据等于0的单元。CX就必须要先加1.然后执行loop后减1。。先加1再减1.CX的值就相当于没变。
这样如果CX=0.就跳出循环了。
{:5_102:}楼主认真思考哦。 Potato丶 发表于 2012-7-24 23:10 static/image/common/back.gif
要实现查找。当然BX要加一。才能达到遍历的目的。
第二条 loop指令是CX先减1再判断是否等于0,等于 ...
你的意思就是假如有(cx)=0就让程序跳出循环?假如没有(cx)=0这一个选项,应该不用加上支了吧! 丶Haw 发表于 2012-7-25 21:23 static/image/common/back.gif
你的意思就是假如有(cx)=0就让程序跳出循环?假如没有(cx)=0这一个选项,应该不用加上支了吧!
{:5_94:}什么支了? Loop就是CX先减1再进行判断是否等于0的指令。如果等于0.跳出循环。程序向下执行,不等于0,就跳转到标号处啊。 顶一下,,,,,,,,,,,,,
页:
[1]