汇编语言程序,以二进制数计算 1 的数量



有人能帮我解决这个问题吗。我想用2个十进制/六进制的二进制值来计算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位内存变量var1中有多少位被设置为1。一个简单的解决方案是将变量加载到寄存器(MOVZX EAX,[var1]),然后将最低位移位16次到CF(SHR EAX,1),每次将CF添加到计数器寄存器(ADC ECX,0)。

然而,您的代码似乎会计算内存中四个单词中有多少单词具有非零值。里面有一些错误:

静态定义为var1
  • 阵列大小不是4。必须将其定义为var1 DW 2,3,4,5 ; Array of four words.

  • MOV EAX,[ESI]正确地从var1加载AX,但它也加载无论什么垃圾跟随CCD_ 10到CCD_。

  • ADD SI,2应为CCD_ 13。