汇编语言程序计算二进制数中 1 的个数

Assembly language program to count number of 1's in binary number

有人能帮我解决这个问题吗?我想计算二进制值 2 decimal/hexa 中 1 的个数。但我得到的结果不正确。下面是一段代码:

.386  //32-bit processor
.model small, stdcall  
ExitProcess PROTO, deExitCode:DWORD  
.data  
var1 dw 2  
.code  
main PROC  
    LEA ESI,var1  
    MOV EBX, 4 //SIZE OF ARRAY AS 2 binary will be 0010  
    MOV ECX,0  
 L1:CMP EBX,0  
    JE L3  
    MOV EAX,[ESI]  
    CMP EAX,0  
    JE L2  
    INC ECX  
 L2:DEC EBX  
    ADD SI,2  
    JMP L1  
 L3: INVOKE ExitProcess,0  
main ENDP  
END main

如果我理解你奇怪的术语计算二进制值中 1 的个数,你想计算在 16 位内存变量中有多少位设置为 1var1.一个直接的解决方案是将变量加载到寄存器(MOVZX EAX,[var1]),然后将最低位移位 16 次到 CF(SHR EAX,1)并将 CF 添加到计数器寄存器(ADC ECX,0)每次。

但是,您的代码似乎计算内存中四个单词中有多少个具有非零值。其中有一些错误:

  • SIZE OF ARRAY 静态定义为 var1 不是 4。它必须定义为 var1 DW 2,3,4,5 ; Array of four words.

  • MOV EAX,[ESI] 正确地从 var1 加载 AX 但它也会加载 var1 之后的任何垃圾到 EAX.

    的高 16 位
  • ADD SI,2应该 成为 ADD ESI,2.