-
Notifications
You must be signed in to change notification settings - Fork 44
/
hello_loops.asm
44 lines (38 loc) · 1.3 KB
/
hello_loops.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
bits 64
default rel
segment .data
data dq 0xfedcba9876543210
sum dq 0
segment .text
global main
extern ExitProcess
main:
push rbp ; set up a stack frame
mov rbp, rsp ; base pointer points to stack frame
sub rsp, 32 ; leave room for shadow params, stack pointer on 16 byte boundary
; This program counts the number of ``1`` bits in the ``data`` binary representation.
; sum = 0
; i = 0
; while (i < 64) {
; sum += data & 1
; data = data >> 1
; ++i
; }
mov rax, [data] ; bits being examined
xor ebx, ebx ; carry bit after bt, setc
xor ecx, ecx ; we'll use rcx as the counter
xor edx, edx ; sum of 1 bits
while:
cmp rcx, 64 ; i < 64
jnl end_while ; exit the loop if necessary
bt rax, 0 ; store the first bit in the carry flag.
setc bl ; set lower byte bx if carry flag is 1. This is ``data & 1``.
add edx, ebx ; sum += data
shr rax, 1 ; data >> 1
inc rcx ; ++i
jmp while ; repeat loop
end_while:
mov [sum], rdx
xor eax, eax
leave
call ExitProcess