关于课后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: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: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 内存单元的下一个内存单元地址
明白了,考虑得很周到,那么ok指令就是loop指令执行后跳转的结果吧
页:
[1]