检测点 9.3
assume cs:codecode segment
start:
mov ax,2000H
mov ds,ax
mov bx,0
s:
mov cl,
mov ch,0
jcxz ok
inc bx
loop s
ok: dec bx
mov dx,bx
mov ax,4c00H
int 21H
code ends
end start
-d 2000:0
2000:0000D800208EC000 0000-00 000000 000000 00
最后(dx)=0 dx = 0 ,2000:0000 = D8
但实际上应该是 dx = 1
ok标志后有个dec bx,说明inc bx是肯定要执行的,和dec bx抵消,所以不能直接跳转,这样inc bx就执行不到了
应该是inc cx,如果cx = 0,先cx++,再和loop s中的cx--抵消,cx = 0,退出循环 mrthreepa 发表于 2020-5-9 11:43
dx = 0 ,2000:0000 = D8
但实际上应该是 dx = 1
ok标志后有个dec bx,说明inc bx是肯定要执行的,和dec ...
inc cx或者add cx,1 你这样有BUG,DX值永远索引的是当前值得前面那个。应该把jcxz ok 移到 inc bx 下面 本帖最后由 1605538404 于 2020-8-30 22:16 编辑
mrthreepa 发表于 2020-5-9 11:43
dx = 0 ,2000:0000 = D8
但实际上应该是 dx = 1
ok标志后有个dec bx,说明inc bx是肯定要执行的,和dec ...
yuxinajie 发表于 2020-6-17 14:18
你这样有BUG,DX值永远索引的是当前值得前面那个。应该把jcxz ok 移到 inc bx 下面
这样也有bug mrthreepa 发表于 2020-5-9 11:43
dx = 0 ,2000:0000 = D8
但实际上应该是 dx = 1
ok标志后有个dec bx,说明inc bx是肯定要执行的,和dec ...
那这个OK标号,在现有段中就是没有意义的了? 如果ds:处的值为1,那么jcxz不会运行,然后往下loop指令会先将cx-1得到cx=0;那么就会跳出循环继续像下走,走到ok标识处,这样得到的bx是错误的。如果cl处为0的话,应该将其+1再由loop指令将cx的值去减一;然后就会得到正确的bx了。
页:
[1]