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
|
bits 64
%define SYS_WRITE (1)
%define SYS_EXIT (60)
%define STDOUT (1)
%define SCALE (1024)
%define FOUR (4096)
%define MAX_ITER (32)
%define W (80)
%define H (30)
%define RSPAN (3584)
%define RMIN (2560)
%define ISPAN (2458)
%define IMIN (1229)
section .data
palette: db ` .:-=+*#%@`
.len equ $ - palette
section .text
global main
main:
push rbp
mov rbp, rsp
sub rsp, 96
mov r12, 0
row_loop:
mov rax, r12
imul rax, ISPAN
mov rcx, H
cqo
idiv rcx
sub rax, IMIN
mov r9, rax
mov r13, 0
col_loop:
mov rax, r13
imul rax, RSPAN
mov rcx, W
cqo
idiv rcx
sub rax, RMIN
mov r8, rax
mov r14, 0
mov r15, 0
mov rbx, 0
iter_loop:
mov rax, r14
imul rax, r14
mov rcx, SCALE
cqo
idiv rcx
mov r10, rax
mov rax, r15
imul rax, r15
mov rcx, SCALE
cqo
idiv rcx
mov r11, rax
mov rax, r10
add rax, r11
cmp rax, FOUR
jle .if_end_0
jmp plot
.if_end_0:
mov rax, r14
imul rax, r15
imul rax, 2
mov rcx, SCALE
cqo
idiv rcx
add rax, r9
mov rsi, rax
mov rax, r10
sub rax, r11
add rax, r8
mov r14, rax
mov r15, rsi
add rbx, 1
cmp rbx, MAX_ITER
jge .if_end_1
jmp iter_loop
.if_end_1:
plot:
mov rax, rbx
imul rax, 9
mov rcx, MAX_ITER
cqo
idiv rcx
mov rsi, palette
add rsi, rax
movzx rdx, byte [rsi]
lea rdi, [rbp - 81]
add rdi, r13
mov byte [rdi], dl
add r13, 1
cmp r13, W
jge .if_end_2
jmp col_loop
.if_end_2:
lea rdi, [rbp - 81]
add rdi, W
mov rax, 10
mov byte [rdi], al
mov rax, SYS_WRITE
mov rdi, STDOUT
lea rsi, [rbp - 81]
mov rdx, W
add rdx, 1
syscall
add r12, 1
cmp r12, H
jge .if_end_3
jmp row_loop
.if_end_3:
mov rax, SYS_EXIT
mov rdi, 0
syscall
|