注册 登录
编程论坛 汇编论坛

统计0的个数

紫小念 发布于 2015-01-12 15:49, 5061 次点击
汇编编程:编写一个程序,统计AX中的0的个数,放到CL中,假设已知AX=OFF3FH,CL=13
我知道统计1的个数的关键句子是“CMP AX,0000H”,统计0 的该怎么写呢
8 回复
#2
wp2319572015-01-12 15:54
这个 0 明显是指二进制的 0   也就是说  比如  1011011 里面有2个0 5个1
#3
紫小念2015-01-12 15:56
回复 2楼 wp231957
嗯嗯,这个我知道。要怎么比较一下,把0的个数统计出来,统计1是跟“0000H”进行比较,那0,要跟谁比一下?
#4
wmf20142015-01-12 16:03
mov dx,0001H
mov ax,FF3FH
xor cx,cx
lpstart:
cmp dx,0000H
jz lpend
mov bx,ax
and bx,dx
jnz lp1
inc cl
lp1:
shl dx,1
jmp lpstart
lpend:
'怎么输出啊?
#5
紫小念2015-01-12 16:11
回复 4楼 wmf2014
mov cl,00h
mov ax,ff37h
a1:shr ax ,1
jnc a0
inc cl
a0:cmp ax,0000h
jnz  a1
hlt;统计1的个数,0怎么弄?
#6
wmf20142015-01-12 16:40
1,在你5楼代码里16-cl不就是1的个数
2,你不保留ax原始数据则代码修改如下
xor cx,cx
mov ax,ff37h
a1:shl ax ,1    //应该使用左移吧,左移可以把最高位移入cf,用来判断是否
jnc a0          //jnc就是统计0
inc cl
a0:cmp ax,0000h
jnz  a1
hlt;统计1的个数,0怎么弄?
#7
紫小念2015-01-12 20:34
回复 5楼 紫小念
谢谢!
#8
取名字2015-05-05 21:45
    统计0的个数代码如下:
    assume    cs:code
    code    segment
    start:
        mov    ax,0ff37h
        mov    bx,ax            ;将ax中的内容传送入bx中,以保留原数不变。
        xor    dx,dx            ;将dx清零以做为统计0个数的计数器。
        mov    cx,16            ;因为ax为16位寄存器,其中存储的数据有16位,所以就设置16次循环。
    s1:
        shr    bx,1             ;将bx中的值右移一位,最右边被移出的一位进入标志寄存器的cf位。
        jc     continue         ;cf中的值为1就跳过下面给0计数的指令继续循环。
        inc    dx
    continue:
        loop    s1

        mov    ax,4c00h
        int    21h
    code    ends
        end    start   
#9
取名字2015-05-05 22:05
    如果要将统计的结果显示出来,程序如下:
    assume    cs:code,ds:data
    data    segment
    MESSAGE    DB    'Zero has been counted,the number is '
    NUMBER     DB    3    DUP (?)
    data    ends
   
    code    segment
    start:
        mov    ax,data
        mov    ds,ax

        mov    ax,0ff37h
        mov    bx,ax
        xor    dx,dx
        mov    si,0                ;si用作变址寄存器,以便将统计后0的个数所转化的ASCII码存入NUMBER处。
        mov    cx,16
    s1:
        shr    bx,1
        jc     continue
        inc    dx
    continue:
        loop    s1

        mov    ax,dx                ;将dx中统计的0的个数传送入ax中,因为后面的“AAA”指令要用到ax寄存器。
        aaa                         ;将ax中的数值进行调整,转化为两个非压缩BCD码。
        cmp    dx,0ah               ;判断0的个数是否大于等于10个,以便正确的存储入NUMBER处并显示。大于10就要分别存储十位和个位的值,否则只需要存储个位的值。
        jb     s2
        or     ah,30h               ;将ah处存放的数字(0的个数的十位数字)转化为ASCII码
        mov    NUMBER[si],ah        ;存入NUMBER处
        inc    si
    s2:
        or    al,30h                ;将al处存放的数字(0的个数的个位数字)转化为ASCII码.
        mov    NUMBER[si],al
        mov    NUMBER[si+1],'$'     ;存储字符串结束符.

        mov    ah,09h
        lea    dx,MESSAGE   
        int    21h                  ;调用int 21h的09h号功能显示字符串

        mov    ax,4c00h
        int    21h
    code    ends
        end    start
1