流风逸雪 发表于 2020-4-8 13:36:41

检测点 9.3

assume cs:code

       
code 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

mrthreepa 发表于 2020-5-9 11:43:17

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,退出循环

qq978358810 发表于 2020-5-29 21:30:24

mrthreepa 发表于 2020-5-9 11:43
dx = 0 ,2000:0000 = D8
但实际上应该是 dx = 1
ok标志后有个dec bx,说明inc bx是肯定要执行的,和dec ...

inc cx或者add cx,1

yuxinajie 发表于 2020-6-17 14:18:52

你这样有BUG,DX值永远索引的是当前值得前面那个。应该把jcxz ok 移到 inc bx 下面

1605538404 发表于 2020-8-30 21:58:30

本帖最后由 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 ...

1605538404 发表于 2020-8-30 22:06:16

yuxinajie 发表于 2020-6-17 14:18
你这样有BUG,DX值永远索引的是当前值得前面那个。应该把jcxz ok 移到 inc bx 下面

这样也有bug

鱼非子 发表于 2020-9-15 21:24:25

mrthreepa 发表于 2020-5-9 11:43
dx = 0 ,2000:0000 = D8
但实际上应该是 dx = 1
ok标志后有个dec bx,说明inc bx是肯定要执行的,和dec ...

那这个OK标号,在现有段中就是没有意义的了?

1497708346 发表于 2021-5-23 14:59:20

如果ds:处的值为1,那么jcxz不会运行,然后往下loop指令会先将cx-1得到cx=0;那么就会跳出循环继续像下走,走到ok标识处,这样得到的bx是错误的。如果cl处为0的话,应该将其+1再由loop指令将cx的值去减一;然后就会得到正确的bx了。
页: [1]
查看完整版本: 检测点 9.3