奥普瓯江 发表于 2019-1-19 01:26:15

检测点11.3

本帖最后由 奥普瓯江 于 2019-1-19 01:26 编辑

(1)补全下面的程序,统计F000:0处32个字节中,大小在数据的个数。
这道题是求得闭区间32,至128中的数据个数,所谓闭区间就是大于等于和小于等于
在这个无符号的数值运算中,闭区间需要观察标志寄存器cf(借位)和zf(是否为零)

mov ax, 0f000h
                mov ds, ax
               
                mov bx, 0
                mov dx, 0
                mov cx, 32
s:
                mov al,
                cmp al, 32
                jna s0                ;如果cf是CY(1以借位)那就说明cmp前面的数小于32,或CF是CY(1以借位) 同时ZF是ZR(1等于零)前面的数与32相等,满足以上两个条件任何一个(小于等于)都产生跳转
                cmp al, 128
                ja so                  ;如果cf是CN(0无借位)那就说明cmp前面的数大于128,或CF是CN(0无借位) 同时ZF是NZ(0不等于零)前面的数与128相等,满足以上两个条件任何一个(大于等于)都产生跳转
                inc dx
s0:
                inc bx
                loop s

(2)补全下面的程序,统计F000:0处32个字节中,大小在(32, 128)数据的个数。
这道题是求得闭区间32,至128中的数据个数,所谓开区间就是大于和小于
mov ax, 0f000h
                mov ds, ax
               
                mov bx, 0
                mov dx, 0
                mov cx, 32
s:
                mov al,
                cmp al, 32
                jb s0   ;如果CF是CY(1以借位)那就说明cmp前面的数小于32,满足条件(小于32)跳转
                cmp al, 128
                jnb s0 ;如果CF是CN(0无借位)那就说明cmp前面的数大于128,满足条件(大于128)跳转
                inc dx
s0:
                inc bx
                loop s


他们中间的区别是一个只需要观察一个寄存器就可以得出结论一个需要观察两个寄存器,才能得到答案。

李兵 发表于 2020-3-9 11:30:24

第一个的jna和第二个的jb对换下才对,不然第一个程序等于32没算进去但是等于128的算进去了,第二个程序也是这样算了32没算128,刚学到这,查了网上意思都模糊,总觉得这两道题很奇怪,没想到还真被我蒙对了,还是你这写的清楚,理解了【】和()的意思{:5_109:}

jiangbaiyu 发表于 2020-3-9 11:31:44

楼主你好,我对你的答案有点疑问,第一题是闭区间,那么跳转条件就不应该包含边界的,而jna指令当数据等于128时也会跳转的,同理第二题是开环,那么跳转条件就应该包含边界的,而jb指令当数据等于32时是不会跳转。

sbx 发表于 2020-8-19 21:36:06

本帖最后由 sbx 于 2020-8-19 21:37 编辑

;(2)补全下面的程序,统计f000:0处32个字节中,大小在(32,128)的数据的个数,不含两端数据。
mov ax,0f000h
mov ds,ax

mov bx,0
mov ds,0
mov cx,32

s:mov al,
cmp al,32
jna s0
cmp al,128
jnb s0
inc dx
s0:inc bx
loop s0
页: [1]
查看完整版本: 检测点11.3