master
ブランチ master
LittleBeast / data / main.s
3.2 KB、175行 生 Blame 履歴
1; FreeBSDで、シスコール番号を調べるには:/usr/include/sys/syscall.h
2; Linuxで、シスコール番号を調べるには:/usr/include/asm-generic/unistd.h
3; 下記のコードはFreeBSD向けの物です。
4
5bits 64
6default rel
7
8section .data
9
10section .rodata
11 basename db "output-",0
12 suffix db ".ppm", 0
13 hdr db "P6", 10, "960 540", 10, "255", 10
14
15 err db "開くに失敗", 10
16 errlen equ $-err
17 suc db "60フレームを作成しました。", 10
18 suclen equ $-suc
19
20 w equ 960
21 h equ 540
22
23section .bss
24 buf resb 960*540*3
25 outfile resb 64 ; "output-nn.ppm\0"
26
27section .text
28 global _start
29
30_start:
31 mov r12, 0 ; i = 0
32
33frameloop:
34 ; ファイル名
35 lea rdi, [outfile]
36 lea rsi, [basename]
37 call strcpy
38
39 ; iは2つの文字に変換
40 mov rax, r12
41 mov rcx, 10
42 xor rdx, rdx
43 div rcx ; rax = 10, rdx = 01
44
45 add al, '0'
46 add dl, '0'
47 mov [rdi], al ; 10
48 mov [rdi+1], dl; 01
49 add rdi, 2
50
51 lea rsi, [suffix]
52 call strcpy ; 「.ppm\0」の追加
53
54 mov rax, 5 ; sys_open
55 lea rdi, [outfile]
56 mov rsi, 0x100601 ; 0x100601 = 0001 0000 0000 0110 0000 0001 = 1048576 + 1024 + 512 + 1 = 1050113
57 ; O_WRONLY = 0x0001
58 ; O_CREAT = 0x0200
59 ; O_TRUNC = 0x0400
60 ; O_CLOEXEC = 0x010000
61 ; /usr/include/sys/fcntl.h
62 mov rdx, 0o666 ; chmod 666
63 syscall
64
65 test rax, rax
66 js error ; エラーがあれば
67 mov r15, rax ; ファイルディスクリプターをr15に保存
68
69 ; ヘッダーの書き込み
70 mov eax, 4 ; sys_write
71 mov rdi, r15 ; fd
72 lea rsi, [hdr]
73 mov rdx, 18
74 syscall
75
76 ; チェッカーボードループ
77 lea rdi, [buf]
78 mov rcx, h
79 xor r13, r13
80
81yloop:
82 mov r8d, w
83
84xloop:
85 ; (x/60 + y/60) % 2の計算
86 mov eax, r8d ; x
87 add eax, r12d ; x + i
88 xor edx, edx
89 mov ebx, 60
90 div ebx ; eax = (x + i)/60
91 push rax
92
93 mov eax, r13d
94 add eax, r12d ; y + i
95 xor edx, edx
96 div ebx ; eax = (y + i)/60
97
98 pop rdx
99 add eax, edx ; (x + i)/60 + (y + i)/60
100 and al, 1 ; % 2
101 jz .black
102
103.green:
104 mov al, 0
105 stosb ; R
106 mov al, 0xFF
107 stosb ; G
108 mov al, 0
109 stosb ; B
110 jmp .next
111
112.black:
113 xor eax, eax
114 stosb
115 stosb
116 stosb
117
118.next:
119 dec r8d
120 jnz xloop
121
122 inc r13d
123 dec rcx
124 jnz yloop
125
126 ; ピクセルデータの書き込み
127 mov eax, 4
128 mov rdi, r15
129 lea rsi, [buf]
130 mov edx, 960*540*3
131 syscall
132
133close:
134 mov rax, 6 ; sys_close
135 mov rdi, r15
136 syscall
137
138 inc r12
139 cmp r12, 60
140 jb frameloop
141
142 mov rax, 4
143 mov rdi, 1
144 lea rsi, [suc]
145 mov rdx, suclen
146 syscall
147
148end:
149 mov eax, 1 ; sys_exit
150 xor edi, edi
151 syscall
152
153error:
154 mov rax, 4
155 mov rdi, 2 ; stderr
156 lea rsi, [err]
157 mov rdx, errlen
158 syscall
159
160 mov rax, 1
161 mov rdi, 1
162 syscall
163
164strcpy:
165.loop:
166 mov al, [rsi]
167 mov [rdi], al
168 test al, al
169 jz .done
170 inc rdi
171 inc rsi
172 jmp .loop
173
174.done:
175 ret