I previously posted a program to find the total number of 1s in a byte. Now I am trying to find the number of 0s in a byte. Following is my code:
MOV AL,1
MOV CX
Often when you write in assembly, it's fun to look at possible optimizations. Using a loop, you use the Z and C flags like so:
MOV AL,
MOV BL, 8
CLC
Loop:
SBB BL, 0
SHR AL, 1
JNZ Loop
Done:
SBB BL, 0
; result is in BL
HLT
A faster way on older processors is to have a 256 bytes table and do a look up. As mentioned by vitsoft, on modern processors, use the POPCNT instruction is probably the fastest (it takes one clock cycle to counts all the bits of a 64 bit register in hardware.)
Now, if you need to know the exact timing, my loop is not practical because it will vary depending on AL. Another way to make it go fast is to unroll the loop:
MOV AL,
MOV BL, 8
SHR AL, 1 ; 1
SBB BL, 0
SHR AL, 1 ; 2
SBB BL, 0
SHR AL, 1 ; 3
SBB BL, 0
SHR AL, 1 ; 4
SBB BL, 0
SHR AL, 1 ; 5
SBB BL, 0
SHR AL, 1 ; 6
SBB BL, 0
SHR AL, 1 ; 7
SBB BL, 0
SHR AL, 1 ; 8
SBB BL, 0
HLT
This is practical because you have zero branches. Modern processors love that much (although in this case since we're dealing with just 2 registers, I don't think it's a huge advantage.)