统计“1”的个数___孙德文编《微型计算机原理及应用》
例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页。