主题:求助:一道简单的题:统计一个16位2进制中为1的个数
semibeast
[专家分:0] 发布于 2006-10-30 17:43:00
题目:编写一个程序,实现统计一个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个回复)
沙发
密码注册 [专家分:350] 发布于 2006-10-30 19:02:00
a1 db 57ABh
这里定义了一个8个位的空间来存放16位二进制数。。。听着别扭吧?改成
a1 dw 57ABh
字单位定义的才能存的下。
你的masm没反映应该是没配置好吧,不然应该报个错什么的。。。
板凳
rryy [专家分:70] 发布于 2006-10-30 19:29:00
a1 db 57ABh ;db为8bits, 57abh 为16bits
again部分是否这样写比较好
again: sal bx,1;
test bx, 1000h
jz exit
inc dx
exit: loop again
我也是学汇编还不到一个星期,讲的不对的地方还请见谅
3 楼
semibeast [专家分:0] 发布于 2006-10-30 22:01:00
谢谢 各位
我是刚学的 基本上都不懂 希望以后大哥大姐的程序有注释那就更感谢了
4 楼
semibeast [专家分:0] 发布于 2006-10-30 22:25:00
[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 楼
密码注册 [专家分:350] 发布于 2006-10-30 23:59:00
[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 楼
semibeast [专家分:0] 发布于 2006-10-31 13:31:00
哎~~~我调试了下 但是最后DX里面是00A0 好像不对样 比实际的的多统计了一个1
检查不出来为什么
7 楼
rryy [专家分:70] 发布于 2006-10-31 14:50:00
57abH转成二进制0101 0111 1010 1011.一的个数是10(0ah)
8 楼
密码注册 [专家分:350] 发布于 2006-10-31 18:29:00
这个倒没有注意到呵呵。。
9 楼
semibeast [专家分:0] 发布于 2006-11-01 19:41:00
[quote]57abH转成二进制0101 0111 1010 1011.一的个数是10(0ah)[/quote]
我日~~对不起哈 不好意思 居然这个错误都要犯~~
浪费大家时间了 ~
10 楼
wenzhuo [专家分:170] 发布于 2006-11-07 21:01:00
mov bx,a1这句好像错了吧,怎么能将AL的值附给BX?类型不匹配啊
我来回复