题目
在ADDR单元中存放着数Y的地址,试编制一程序把Y中的1的个数存入COUNT单元中
思路
可以从最高位开始判断是不是1,这里巧妙地用到了test指令,用 test ax,0ffffh,最高是不是1影响到了符号标志位SF,同时也可以判断后面是否全部为0,提高了效率。
代码
datasg segment
addr dw number
number dw 1010101010101010B
count dw ?
datasg ends
;----------------
codesg segment
assume cs:codesg,ds:datasg,es:datasg
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,datasg
mov ds,ax
mov es,ax
;----------------
mov cx , 0 ;统计计数器
mov bx , addr
mov ax , [bx]
repeat: test ax,0ffffh ;与全1做逻辑与
jz exit ;如果全为0则退出
jns shift ;如果最高位不是1,SF=0,则逻辑左移一位
inc cx ;计数器cx++
shift:
shl ax,1
jmp repeat
exit:
mov count,cx
ret
;----------------
main endp
codesg ends
end start
调试过程
反汇编
go 000B,跳到初始化数据段后,查看数据段的情况。
第一次test后,标志位已经变成了1
随后执行 Cx+1
第二轮循环则不影响标志位SF
若干轮过后,AX全变成0了
再次查看数据段,COUNT单元已经存放了1的个数