8086系列(3):统计Y中1的个数

题目

在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的个数

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值