汇编语言程序计算二进制数中 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
.
有人能帮我解决这个问题吗?我想计算二进制值 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.
的高 16 位MOV EAX,[ESI]
正确地从var1
加载AX
但它也会加载var1
之后的任何垃圾到EAX
.ADD SI,2
应该 成为ADD ESI,2
.