鱼C论坛

 找回密码
 立即注册
查看: 2659|回复: 2

王爽第二版,检测点9.3的问题

[复制链接]
发表于 2015-1-19 23:32:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 傲天 于 2015-1-19 23:37 编辑

这是原答案:
补全程序,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在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      ;dec的功能是bx=bx-1。
        mov dx,bx
        mov ax,4c00h
        int 21h
code ends
end star
但这个空填的我不明白了:
这题是先把DS段地址设置成2000,然后用BX做偏移地址,查找每一个字节
这段代码应该是这样理解:把DS段偏移为0的字节赋给了CL,CH赋0,那么如果第一个字节为0,就应该跳出循环,因为找到为0的字节了,但中间加了一个inc cx,那么CL的值自然就等于1了,应该说CX的值为0001,CL的值为01,不管是哪种情况,CX均不为0。因为:CX不为0,那么就会继续Loop,前面的inc bx,就会查找下一个字节了,按这个理论,那么无论怎么查找,CX也不会为0,也就是会进入一个死循环。
所以,我认为这里应该什么也不填才对
理由:如果什么也不填,那么第一个字节为0了,那么,inc bx就会指向下一个单元,执行到Loop时,就会跳出循环,执行OK的dec,使BX减1而指向原来正确的字节,如果CX不为0,那么inc BX会指向下一个单元,而把新的值赋给了CL,以此类推
不知道我说的对不对,如果我说的不对,请指出我到底错在哪里了,谢谢!(排版没排好,代码中间有点乱)





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

使用道具 举报

发表于 2015-1-23 09:34:30 | 显示全部楼层
当BX的偏移地址查找到第一个值为0的字节时,不是要把这个0赋值给cl吗,那么cl=0 ,ch=0,对吧!,那么这里的cx=0,然后inc cx那么(CX)=1,然后inc bx 指向下一个单元,执行到loop s的时候,是先将CX的值减1,那么就是(cx)=(cx)-1=0 ,  CX为0时,LOOP 不执行跳转。程序直接走到标号为OK那
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-24 11:43:43 | 显示全部楼层
非常感谢,LOOP是先dec cx再检测,而不是我以前想象的先检测再dec cx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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