Skip to content

Commit d17a4ee

Browse files
committed
Update
1 parent b715904 commit d17a4ee

File tree

2 files changed

+153
-10
lines changed

2 files changed

+153
-10
lines changed

023.asm

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
section .data
22
msg db "%d", 10, 0 ;return string for printf (just the result)
3-
isabnum times 28124 dd 0 ;mark numbers as abundant
4-
sums times 28124 dd 0 ;list of sums of two abundant numbers
3+
4+
section .bss
5+
isabnum resq 440 ;28160 bits for flags
6+
sums resq 440 ;dito
57

68
section .text
79
extern printf
@@ -18,7 +20,7 @@ abnums:
1820
call divsum ;get sum of divisors
1921
cmp r8d, ecx ;check if sum is <= number
2022
jle abnums ;if yes, try next number
21-
mov dword [isabnum + 4 * ecx], 1 ;else set number to abnum
23+
bts [isabnum], ecx ;else set number to abnum
2224
jmp abnums ;try next number
2325

2426
sum_init:
@@ -29,18 +31,18 @@ sum_outer:
2931
inc eax ;next number
3032
cmp eax, 28123 ;finished?
3133
jge result ;then calculate result
32-
cmp dword [isabnum + 4 * eax], 1 ;test if eax is abundandt
33-
jne sum_outer ;if not, try next number
34+
bt [isabnum], eax ;test if eax is abundandt
35+
jnc sum_outer ;if not, try next number
3436

3537
sum_inner:
3638
inc ebx ;next number
37-
cmp dword [isabnum + 4 * ebx], 1 ;check if ebx is abundant
38-
jne sum_inner ;if not, try next number
39+
bt [isabnum], ebx ;check if ebx is abundant
40+
jnc sum_inner ;if not, try next number
3941
mov ecx, eax ;move eax to ecx
4042
add ecx, ebx ;add ebx
4143
cmp ecx, 28123 ;check if sum < 28124
4244
jg sum_outer ;if not, go to outer loop
43-
mov dword [sums + 4 * ecx], 1 ;set sums @ sum to 0
45+
bts [sums], ecx ;set sums @ sum to 1
4446
jmp sum_inner
4547

4648
result:
@@ -51,8 +53,8 @@ sum:
5153
inc ebx ;next number
5254
cmp ebx, 28123 ;check if we are finished
5355
jge print ;then print result
54-
cmp dword [sums + 4 * ebx], 1 ;else check if we have a sum
55-
je sum ;then skip that number
56+
bt [sums], ebx ;else check if we have a sum
57+
jc sum ;then skip that number
5658
add ecx, ebx ;else add it to total
5759
jmp sum ;repeat
5860

061.asm

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
section .data
2+
msg db "%d", 10, 0 ;return string for printf (just the result)
3+
4+
section .bss
5+
nums resb 10000 ;for bit flags
6+
first resb 10000 ;for first two digits
7+
last resb 10000 ;for last two digits
8+
nset resd 6 ;for sets
9+
10+
11+
section .text
12+
extern printf
13+
global main
14+
15+
main:
16+
mov edi, 1
17+
xor eax, eax
18+
xor ebx, ebx
19+
;set flags for all figurate numbers
20+
set_tri:
21+
mov bl, [nums + eax]
22+
bts ebx, 0
23+
mov [nums + eax], bl
24+
add eax, edi
25+
inc edi
26+
cmp eax, 10000
27+
jl set_tri
28+
mov edi, 1
29+
xor eax, eax
30+
31+
set_squ:
32+
mov bl, [nums + eax]
33+
bts ebx, 1
34+
mov [nums + eax], bl
35+
add eax, edi
36+
add edi, 2
37+
cmp eax, 10000
38+
jl set_squ
39+
mov edi, 1
40+
xor eax, eax
41+
42+
set_pen:
43+
mov bl, [nums + eax]
44+
bts ebx, 2
45+
mov [nums + eax], bl
46+
add eax, edi
47+
add edi, 3
48+
cmp eax, 10000
49+
jl set_pen
50+
mov edi, 1
51+
xor eax, eax
52+
53+
set_hex:
54+
mov bl, [nums + eax]
55+
bts ebx, 3
56+
mov [nums + eax], bl
57+
add eax, edi
58+
add edi, 4
59+
cmp eax, 10000
60+
jl set_hex
61+
mov edi, 1
62+
xor eax, eax
63+
64+
set_hep:
65+
mov bl, [nums + eax]
66+
bts ebx, 4
67+
mov [nums + eax], bl
68+
add eax, edi
69+
add edi, 5
70+
cmp eax, 10000
71+
jl set_hep
72+
mov edi, 1
73+
xor eax, eax
74+
75+
set_oct:
76+
mov bl, [nums + eax]
77+
bts ebx, 5
78+
mov [nums + eax], bl
79+
add eax, edi
80+
add edi, 6
81+
cmp eax, 10000
82+
jl set_oct
83+
mov edi, 1000
84+
mov ebx, 100
85+
86+
get_first_last: ;get first/last two digits
87+
mov eax, edi
88+
xor edx, edx
89+
div ebx
90+
mov [first + edi], al
91+
mov [last + edi], dl
92+
inc edi
93+
cmp edi, 10000
94+
jl get_first_last
95+
96+
97+
xor eax, eax ;result
98+
xor ebx, ebx ;for flags
99+
xor ecx, ecx ;dito
100+
mov edi, 999 ;init n
101+
102+
next_starter:
103+
inc edi
104+
mov bl, [nums + edi]
105+
test ebx, ebx
106+
jz next_starter
107+
push rdi ;remember starter
108+
mov [nset], edi
109+
mov r9b, [last + edi]
110+
mov esi, 1 ;index for nset
111+
mov edi, 999
112+
113+
next_follower:
114+
inc edi
115+
cmp edi, 10000
116+
je backtrack
117+
mov cl, [nums + edi]
118+
or ecx, ebx
119+
cmp ecx, ebx
120+
je next_follower
121+
cmp r9b, [first + edi]
122+
jne next_follower
123+
124+
backtrack:
125+
mov byte [nest + esi], 0
126+
dec esi
127+
mov eax, edi
128+
129+
print:
130+
push rbp
131+
mov edi, msg
132+
mov esi, eax
133+
call printf
134+
pop rbp
135+
136+
exit:
137+
mov eax, 1
138+
xor edi, edi
139+
syscall
140+
141+
section .note.GNU-stack ;just for gcc

0 commit comments

Comments
 (0)