-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbitcount.asm
More file actions
173 lines (151 loc) · 3.03 KB
/
bitcount.asm
File metadata and controls
173 lines (151 loc) · 3.03 KB
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
section .data
prompt: db "Enter number: ", 0
returns: db " returns ", 0
units: db " units, ", 0
zeros: db " zeros, ", 0
amount: db " amount of bits", 10, 0
section .bss
num: resb 10
section .text
global _start
_start:
; Print prompt
mov rax, 1 ; syscall: write
mov rdi, 1 ; file descriptor: stdout
mov rsi, prompt ; pointer to message
mov rdx, 14 ; message length
syscall
; Read number
mov rax, 0 ; syscall: read
mov rdi, 0 ; file descriptor: stdin
mov rsi, num ; buffer to store input
mov rdx, 10 ; number of bytes to read
syscall
mov rsi, num
xor rax, rax
xor rcx, rcx
call convert_loop ; convert to normal value
mov rdi, [num]
call std_print_num_dec
mov rax, 1
mov rdi, 1
mov rsi, returns
mov rdx, 9
syscall
; Call onecount, zerocount, whole_amount
mov rax, [num]
call onecount
mov r8, rax
mov rax, [num]
call zerocount
mov r9, rax
mov rax, [num]
call whole_amount
mov r10, rax
mov rdi, r8
call std_print_num_dec
mov rax, 1
mov rdi, 1
mov rsi, units
mov rdx, 9
syscall
mov rdi, r9
call std_print_num_dec
mov rax, 1
mov rdi, 1
mov rsi, zeros
mov rdx, 9
syscall
mov rdi, r10
call std_print_num_dec
mov rax, 1
mov rdi, 1
mov rsi, amount
mov rdx, 16
syscall
; Exit
jmp exit
onecount:
; Input: rax = number
; Output: rax = count of 1s
xor rcx, rcx
.loop1:
test rax, rax
jz .done1
test rax, 1
jz .skip1
inc rcx
.skip1:
shr rax, 1
jmp .loop1
.done1:
mov rax, rcx
ret
zerocount:
; Input: rax = number
; Output: rax = count of 0s
xor rcx, rcx
.loop2:
test rax, rax
jz .done2
test rax, 1
jnz .skip2
inc rcx
.skip2:
shr rax, 1
jmp .loop2
.done2:
mov rax, rcx
ret
whole_amount:
; Input: rax = number
; Output: rax = total bits
xor rcx, rcx
.loop3:
test rax, rax
jz .done3
inc rcx
shr rax, 1
jmp .loop3
.done3:
mov rax, rcx
ret
std_print_num_dec:
push rbx // size of number counter
mov rax, rdi
mov rcx, 0xA
dec rsp ; leave space for new value
mov rbx, 1
.loop:
xor rdx, rdx
div rcx
add dl, 0x30
dec rsp ; leave space for new value
inc rbx
mov BYTE [rsp], dl
cmp rax, 0x0
jne .loop
mov rax, 1
mov rdi, 1
mov rsi, rsp
mov rdx, rbx
syscall
add rsp, rbx ; put stack into his original position
pop rbx
ret
convert_loop:
mov cl, [rsi]
cmp cl, 0x0A
je .convert_done
sub cl, '0'
imul rax, 10
add rax, rcx
inc rsi
jmp convert_loop
.convert_done:
mov [num], rax
ret
exit:
mov rax, 60
xor rdi, rdi
syscall