回 帖 发 新 帖 刷新版面

主题:求助:一道简单的题:统计一个16位2进制中为1的个数

题目:编写一个程序,实现统计一个16位2进制的是数中为“1”的位的个数

我自己编了一个 但是运行不了用masm没反映
data  segment
   a1  db 57ABh
data  ends
code segment
         assume  cs:code,ds:data
 start:mov  ax,data
         mov  ds,ax
         xor  dx,dx
         mov  cx,16
         mov  bx,a1
again:   sal  bx,1
         jnc  exit
         mov  dx,1   
exit:   loop  again
     mov  ah,4ch
         int  21h
code ends
         end start

回复列表 (共12个回复)

沙发

a1  db 57ABh

这里定义了一个8个位的空间来存放16位二进制数。。。听着别扭吧?改成
a1  dw 57ABh
 字单位定义的才能存的下。
你的masm没反映应该是没配置好吧,不然应该报个错什么的。。。

板凳

a1  db 57ABh ;db为8bits, 57abh 为16bits

again部分是否这样写比较好
again:   sal  bx,1;
         test bx, 1000h
         jz   exit
         inc  dx
exit:   loop  again

我也是学汇编还不到一个星期,讲的不对的地方还请见谅

3 楼

谢谢 各位
我是刚学的 基本上都不懂  希望以后大哥大姐的程序有注释那就更感谢了

4 楼

[quote]a1  db 57ABh ;db为8bits, 57abh 为16bits

again部分是否这样写比较好
again:   sal  bx,1;
         test bx, 1000h
         jz   exit
         inc  dx
exit:   loop  again

我也是学汇编还不到一个星期,讲的不对的地方还请见谅[/quote]

你说的这样改好像不行
我就把 db 改成dw后 调试好像是对的
again改成你那样就错了样
你再自己调试下嘛

5 楼

[quote]a1  db 57ABh ;db为8bits, 57abh 为16bits

again部分是否这样写比较好
again:   sal  bx,1;
         test bx, 1000h
         jz   exit
         inc  dx
exit:   loop  again

我也是学汇编还不到一个星期,讲的不对的地方还请见谅[/quote]
这个算法不太好,而且是错的。test bx,1000h保留的不是第一位而是第四位。1000h的二进制是0001000000000000,应该用test bx,8000h,而且测试不了bx的最高位。
楼主的段子将最高位依次送入cf,jnc判断cf是否为1,为1加一个数,0就循环,16次后退出。相当方便,也比测试指令快。
你的算法也可以做,在循环之前先加一条sar bx ,1;先把最高位挪到第二位,然后在进行循环,确实比较麻烦。。。

6 楼

哎~~~我调试了下 但是最后DX里面是00A0  好像不对样  比实际的的多统计了一个1
检查不出来为什么

7 楼

57abH转成二进制0101 0111 1010 1011.一的个数是10(0ah)

8 楼

这个倒没有注意到呵呵。。

9 楼

[quote]57abH转成二进制0101 0111 1010 1011.一的个数是10(0ah)[/quote]


我日~~对不起哈 不好意思  居然这个错误都要犯~~
浪费大家时间了 ~

10 楼

mov  bx,a1这句好像错了吧,怎么能将AL的值附给BX?类型不匹配啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册