补全,用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
(add cx,cx) ;或 inc cx
inc bx
loop s
ok: dec bx ;dec 指令的功能和inc 相反,dec bx进行的操作为;(bx)=(bx)-1
mov dx,bx
mov ax,4c00h
int 21h
code ends
end start
分析:
■正确情况 如: inc cx (假设bx=1)
cl = 0 ch = 0 bx = 1
inc cx(cx=cx+1 cx=1) → inc bx(bx=2) → loop s(cx-1=0) → 不执行跳转,执行 dec bx (bx=1)
→ dx=bx (dx=1)
■ 正确的情况[ add cx,cx ] , 执行过程自己对照上面, (假设bx=1)
当 cl =0 时, ch=0
add cx,cx cx=0 则 bx= bx+1 那么bx=2
loop s , 因为cx=0所以无跳转,执行 dec bx bx=bx-1 (bx=2-1 = 1) bx又回到原值了
程序执行完成, ds:1 处的值为0
■错误情况 如: [jcxz ok ] (假设bx=1)
当 cl=0时 ch=0 bx=1
jcxz ok → dec bx (bx=0)→mov dx,bx (dx = 0) 显然 答案是 dx =1 而这里不是
■错误情况 如: [jcxz s] (假设bx=1)
当 cl =0 ch = 0 bx = 1
jcxz s 执行跳转到标号s, 又重复执行,显然当值 = 0 时 永远也执行不了 ok 处以后的指令, |