segment .data ; long data; data dq 0xfedcba9876543210 ; long sum; sum dq 0 segment .text global main ; int main() ; { main: push rbp mov rbp, rsp sub rsp, 32 ; int i; // in register rcx ; Register usage ; ; rax: bits being examined ; r8b: carry bit after bt, setc ; rcx: loop counter, 0-63 ; rdx: sum of 1 bits ; mov rax, [data] xor r8d, r8d ; i = 0; xor ecx, ecx ; sum = 0; xor edx, edx ; while ( i < 64 ) { while: cmp rcx, 64 jnl end_while ; sum += data & 1; bt rax, 0 setc r8b add edx, r8d ; data >>= 1; shr rax, 1 ; i++; inc rcx ; } jmp while end_while: mov [sum], rdx xor eax, eax leave ret