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