ttxs_2013 发表于 2013-10-24 19:00:21

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

利用loop指令,实现在内存2000H段中找查第一个值为为0的字节,找到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start:mov ax,2000H
      mov ds,ax
   mov bx,0
s:mov cl,
    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为什么还要减一?

LinuxDeepin 发表于 2013-10-24 20:10:42

本帖最后由 LinuxDeepin 于 2013-10-24 20:13 编辑

inc cx 字面意思是 cx 自增 1

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

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

mov cl, 所指向的内存单元 数值 为 零,那么 cl 为零,
inc cx          假设把该指令跳过,我们不执行该指令,看看结果会怎么样
inc bx         bx 自增 1
loop s         cx 此时数值为 0,cx 减 1,那么 cx 会等于多少呢? 结果是 FFFF H,判断 cx 不为 零,继续循环

LinuxDeepin 发表于 2013-10-24 20:12:33

本帖最后由 LinuxDeepin 于 2013-10-24 20:16 编辑


mov cl, 所指向的内存单元 数值 为 零,那么 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 内存单元的下一个内存单元地址

ttxs_2013 发表于 2013-10-24 21:50:09

明白了,考虑得很周到,那么ok指令就是loop指令执行后跳转的结果吧
页: [1]
查看完整版本: 关于课后9.3检测题不太明白