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

统计“1”的个数___孙德文编《微型计算机原理及应用》

ccj1981 发布于 2011-09-18 11:41, 1119 次点击
例9 寄存器AX中有一个16们二进制数,编程统计其中“1”的个数,结果存放在CX中。
本例最好采用“先判断、后执行”的结构,即先检查AX中有无为“1”的位。则代码段的有关程序如下:
1.     MOV  CX,0   计数器初始化
2. LOP:    AND  AX,AX  不知AX相加为何意
3.            JZ   STP     相加后结果为“0”则跳到STP
4.            SAL  AX,1   AX算术左移1位
5.            JNC  LOP     如果无进位则跳到LOP
6.            INC  CX      CX增量加1
7.            JMP  LOP     无条件转移到LOP
8. STP:   HLT          处理器暂停

这个检查“1”的个数,我觉得直接用SAL左移,然后每往前移动一位时检查有无进位(CF标志位),有进位就是“1”,并CX计数器加1,得到结果。

或者直接用AND  AX,AX一直相加,每加一次检查一次有无进位(CF标志位),有进位就是“1”,并CX计数器加1,得到结果。

现在两个方法加起来一起用,好像有问题。
2.  0111
  + 0111
  = 1110

4.  1110
左移1100

5.有进位

6.CX = 0+1=1

7.循环到LOP处

2.  1100
  + 1100
  = 1000

4.  1000
左移0000

5.有进位

6.CX = 1+1=2

7.循环到LOP处

2.  0000
  + 0000
  = 0000

3.相加后结果为“0”则跳到STP处结束程序。

最后结果CX=2与实际不符就有3个“1”。
是不是我哪里理解错了?
我看的书是自考课本孙德文编《微型计算机原理及应用》
课程代码2277,第100页。
6 回复
#2
ccj19812011-09-18 11:49
只有本站会员才能查看附件,请 登录


我截了图,看到了回复一下,你是怎么理解的,谢谢啦。
http://zhidao.baidu.com/question/320443523.html
#3
nextleave2011-09-18 14:39
请问and是什么操作.....
#4
nextleave2011-09-18 14:40
你把它理解成add了吧....
#5
ccj19812011-09-18 15:04
谢谢楼上两位,我把AND理解成ADD了。

2. LOP:    AND  AX,AX  不知AX相加为何意

#6
ccj19812011-09-18 15:26
AND指令是为下一条间断指令JZ服务的,整个循环中只有JZ才可以跳出循环,没有JZ就成了死循环了。
#7
nextleave2011-09-18 15:59
看清楚,是一位,不是两位.楼主的粗心果然不是一点点啊...
1