鱼C论坛

 找回密码
 立即注册
查看: 1528|回复: 3

关于课后9.3检测题不太明白

[复制链接]
发表于 2013-10-24 19:00:21 | 显示全部楼层 |阅读模式

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

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

x
利用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
      mov dx,bx
   
   mov ax,4c00H
   int 21h
   
code ends
end start
有两点疑惑:第一,所填部分inc cx是啥意思?第二,程序是如何执行到ok:处的,还有bx为什么还要减一?
  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-24 20:10:42 | 显示全部楼层
本帖最后由 LinuxDeepin 于 2013-10-24 20:13 编辑

inc cx 字面意思是 cx 自增 1

从程序执行角度来看,这是为了防止陷入死循环,及产生错误的结果。

mov cl,[bx]  该代码将 ds:[bx] 所指向的内存 字节单元 数值送入 cl 寄存器
loop s         该指令分两个步骤执行,首先 cx 自减 1,然后再来判断 cx 是否为零。为 零 则结束循环,否者继续循环

mov cl,[bx] 所指向的内存单元 数值 为 零,那么 cl 为零,
inc cx          假设把该指令跳过,我们不执行该指令,看看结果会怎么样
inc bx         bx 自增 1
loop s         cx 此时数值为 0,cx 减 1,那么 cx 会等于多少呢? 结果是 FFFF H,判断 cx 不为 零,继续循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-24 20:12:33 | 显示全部楼层
本帖最后由 LinuxDeepin 于 2013-10-24 20:16 编辑


mov cl,[bx] 所指向的内存单元 数值 为 零,那么 cl 为零,
inc cx          cx 自增 1,此时 cx 数值为 1
inc bx         bx 自增 1
loop s         cx 此时数值为 1,cx 减 1,结果是 0 。判断 cx 为 零,结束循环
dec bx        bx 自减 1,为什么要自减 1 呢?这是因为上面的程序在找到 0 数值的内存单元后,bx 还在自增 1,
                   指向了下一个内存单元,如果你自减 1,那么所指向的就是为 0 内存单元的下一个内存单元地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-24 21:50:09 | 显示全部楼层
明白了,考虑得很周到,那么ok指令就是loop指令执行后跳转的结果吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 12:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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