Assembly 计算整数(MASM)二进制表示形式中的一个数

Assembly 计算整数(MASM)二进制表示形式中的一个数,assembly,masm,Assembly,Masm,所以我对汇编语言很陌生,我希望能得到一些帮助。我试图计算一个整数的二进制表示中的个数。我相信我应该把我输入的寄存器移位32次,每次遇到1时递增。如果不是1,我应该跳转以避免增加ebx。我仍然是一名初学者,因此我仍在学习MASM语法,但以下是我目前掌握的内容: xor ebx, ebx mov ecx, 32 shifting: shl eax, 1 jc $+2 inc ebx loop shifting 不建议使用$+2,请使用标签。请注意,

所以我对汇编语言很陌生,我希望能得到一些帮助。我试图计算一个整数的二进制表示中的个数。我相信我应该把我输入的寄存器移位32次,每次遇到1时递增。如果不是1,我应该跳转以避免增加ebx。我仍然是一名初学者,因此我仍在学习MASM语法,但以下是我目前掌握的内容:

    xor ebx, ebx
    mov ecx, 32

shifting:
    shl eax, 1
    jc $+2
    inc ebx
    loop shifting

不建议使用
$+2
,请使用标签。请注意,
jc$+2
不起任何作用,因为指令本身有2个字节长,所以在任何情况下都会继续。此外,在设置位时,您将跳过递增计数器,因此您将计算零位。正确的代码可能如下所示:

    xor ebx, ebx
    mov ecx, 32

shifting:
    shl eax, 1
    jnc skip_inc
    inc ebx
skip_inc:
    loop shifting

它有用吗?你想以某种方式改进它吗?(你应该问一个问题,而不仅仅是描述你做了什么)为什么这个标记为“c”?不,它不起作用,当我测试代码时,它给出的数字比二进制表示中的1高得多。我很确定我的思维过程是正确的,但它的实际编程给我带来了麻烦。另一种方法是使用
adc ebx,0
。还有一种方法涉及到popcnt(仅限较新的处理器)。是的,这里有另一个答案详细说明了这些。不管怎样,OP可能想坚持自己的算法,只需修改代码。同意。我只是想指出“剥猫皮的方法不止一种”。(猫一个都不喜欢)太棒了!谢谢你们的帮助!