Compare commits
No commits in common. "83f5ba9faea2de3d6370cf3c8c57901cbb4640d4" and "9ecb520b5cee518b0ed655a6b822fe9f3cfc4ea5" have entirely different histories.
83f5ba9fae
...
9ecb520b5c
@ -1,3 +0,0 @@
|
||||
all:
|
||||
nasm -g -felf32 main.s && ld -melf_i386 -g main.o
|
||||
|
110
16/input
110
16/input
@ -1,110 +0,0 @@
|
||||
\....|...-...../.....|....................-./............|/.....................-........./.....-.............
|
||||
\..........-.....................-......................................|....................\..../.....-.....
|
||||
....\......-...../../../...\......................\.........................-.............|.............|.....
|
||||
.........../..../...........|/\.............\........\.......|.........|..|../............/.........|.........
|
||||
\./...\........\..........\......./....../...............................|....|........|................/.....
|
||||
|-.....|............/...............|...\...|...../......../.....|............|..\..|..../.......-.........\..
|
||||
........-.............||../..........|.........../..................../.|.....|\..-/......./...\...\....-.....
|
||||
....................//........................./..........\.......|...|.........../......\-......-...\........
|
||||
....../..........\......\.....................\................\......\..\..|.................................
|
||||
.................\...............-....../........./....-./..........|..../..-..|../................\..........
|
||||
.............-...............-......|.../.....-.....//.\................../..........-......-...........-.....
|
||||
.........../.\.....................\............-..........|.......\..................\.......................
|
||||
...............\............/.|...\........../....\.............|...........\...............|.../........\....
|
||||
./..............\................-\.../\.......-....................-..............-|.............\.-.........
|
||||
../....../.........|..../......\...\.\.................|......./.......|...............-.........-............
|
||||
-...-............................\.............-.\........-.....|.........././-......|......-..../...|........
|
||||
................-.....................|..|...\.././.............|..........................-.............-....
|
||||
.......|...............................|.......................................-......../.............|-...-..
|
||||
.\|............................\................|.....-.....-................................./...-..\...../..
|
||||
.......\......-....\|......|........................................./...||...............\...................
|
||||
.................../......../.......-......\..............|..\...........-.........-.............../..........
|
||||
........................\......................../.................-........................\.....\...........
|
||||
..........|......|........................|.|\...............\...|.............-...-....-............--.......
|
||||
............|........../....\..........\........../..-..|...........-...\........................./..-........
|
||||
.............||../..../.......................-/.......\.....\............./|..-...............|.....|........
|
||||
................................|..\.........-......./...........-../-............\................\....-../..
|
||||
.............-.............................|.\...............................\\...............................
|
||||
..|.......-................................\.......|.......\.....................|../\..........\..........-..
|
||||
......-..\..........-.................\.-..../\......./......./..-.......................\.....-........\.....
|
||||
............................../.....................\.................\................|..../\.............\..
|
||||
..............................-.......\.........-..........\....../............./.....-........\...-.........|
|
||||
/..................\...||..|...........\...............-............\..........|./.....-.-./.............../..
|
||||
.....|......./...............\.......-................-...........................................\...........
|
||||
.|.................../.....\............./.....\.................-.../.......-..............\..-..............
|
||||
......\........|...|...........//..........|\.\..............................-..../...-............|..........
|
||||
|......\....|\......|........../.........../........-.........|.-\//................/..\....|.../........|....
|
||||
.-....-......................./.........\.........-.../............................-..|........|.....|...|....
|
||||
.........-..................-..........-....-....................-....-./.......................|.../......\..
|
||||
..-../......................-\.....|...\........./.-...............-.................../../............|......
|
||||
.-/.......-../.......-...|\...../..........-...\.......\.........-....\-................-......|........-.....
|
||||
.............................\\\............-..............|........../...................-......../....../../
|
||||
.....-....\....\......................-..\...............-..|...............-................-.......\......|.
|
||||
..-...\.............................../.../.............................--.......-..|.|\...../...............\
|
||||
......\.../...-.....|....|......\.../|...................................-................-................./.
|
||||
.......-......-.../..................|../..................\..........................\-..........-\..........
|
||||
.-.......\.........|....|\/./-\.-.....|..................-...................................-|...\...........
|
||||
...........-........../\..................\./..........................\...../...........-...\...../..\....-..
|
||||
..-.|...../|......\..\........|.............-.....|..........\...-...-../......................../.......|....
|
||||
......../................/..\.......\..-...|.....\.......|\..........................-..\../..........\./.....
|
||||
........\.-......|......|..........|........-...................-..\.....-./..............-.\......\..........
|
||||
........|./..................\........|......................\............................./.-\....\........-.
|
||||
........\.|......\................/..\....-/.\.....-.....|............................\..\.|............|...-.
|
||||
...-.....-|..................|...............-./.....................\..\............|.....-..................
|
||||
..........|\./.....\..................|.........|.....................-\./..\........\........................
|
||||
../........\..............|....-...............................................|..........-......../..........
|
||||
..\..............|...../../....................-....\.....................|........\...\\.....................
|
||||
...........................-...\......\......./../..........\-...../.......................-...........\......
|
||||
-.|........................../.....|...............\..........-.............\...-................-.......-....
|
||||
/../.........\........./......-.../..-..................-.......................\............--...............
|
||||
\...............|......-..../......................................-........./|......................\|....../
|
||||
.....\.......................................-...................-.../...........\.......|../.............|...
|
||||
....-....||......\..\.......-.........-......../..../............\..................................-.........
|
||||
...-..|.......\..\..|..........-../-..........\............../...............|..../........./....../.......|./
|
||||
.......................\.......././.............\..................-..........|................../....|.......
|
||||
-.|.....................\\.........../......./.|................/................|./......./....-.............
|
||||
......-...............-....-................|./\..\-/...../......../....-....\....|.-.................../...\.
|
||||
...............\......-...\...\....-....-/....................\./....../..................-|........\./...../.
|
||||
.\......................./..\.........\.........|............|.......-../..\.-..|.-..........................|
|
||||
..|../.....................|/......................./......../.../.........-.../.|./.|.-..............|....-..
|
||||
...-.-/............/............|..........|....../\...\./.....|..................|....\............/.........
|
||||
.....|........./.........\.............../......./../../...................|.......//.......\..\..........\...
|
||||
......./.............\...........\.\..............................................\...................|.......
|
||||
...............-|...../..-............................\.....-.............../\.........-....................\.
|
||||
.........-.....................-...\...................-..../.................||....\.........-.......-..-....
|
||||
.|../..\...\......|..\./.........\..............|..\/......../...............-..-....................-.....\..
|
||||
..................|........\.-.....|.......\............../................................/...-....|...../...
|
||||
...........-......./........-...--........\.../..-...../.|............|......./...............|....../\......\
|
||||
.../.....\...................-..../....................................-......................|.............-.
|
||||
.\.....|....-.....|.....-...................................................|../....\..................\.....-
|
||||
....-........../\......../.......-....\............................./-.............-..........................
|
||||
....\.........-........./......../....|..............\........\../.................\.|...............\........
|
||||
.........-..............|./............-.......................\.......\......-\......\......../..............
|
||||
-.|...|./-..........\..........-...-............|...-......................\..\.............................-.
|
||||
............/......................../.........................................\/..........|.....|.-........|/
|
||||
....../..|./..././.....-......................../....|................../..|........-.....................|./.
|
||||
.......................\....................../......./......\/........\......./....../\|.....\...............
|
||||
\...........\/.|../..................../...............\\...\..../..................\......./.................
|
||||
.../................/...............\./....-./........../........./\..-.................................\.....
|
||||
........-.......-...........\........-.......\............|............|.....-........|..|..../...............
|
||||
.............|...|............/....\............................................-..\......./.../..........\...
|
||||
...................../-..|...........-................../.\...|.....\.....|/.................|................
|
||||
..|................\.....-...........|.\............-.........|....../...................\......-.|.......\...
|
||||
........\......../.....-...\..\...........\........|/.............../......|.......|.\..|........|............
|
||||
..........\.....................-..|/.....\............-............../.......................|./........\....
|
||||
.......\........|...........\......\.......-..-.....|............./......|\..............................|....
|
||||
.........\.......................-............-/.................................\............|...............
|
||||
.........\................/.............................../..........\................-../../......|......-...
|
||||
....\...-./...............\...............|.....\|....|/...............-...........................-..........
|
||||
.|.......\.......-............./.......\............./....................|......|../......-...........\......
|
||||
.....\.....-.....\...\................/......\...\../.\...\....\-....-././...............................|./..
|
||||
.....................-.\.\.........../......./...-......./-.........................\.......|../....\..|..../.
|
||||
|..\......./-......-...../..-....../.................../..-.....................-..../...........\...../......
|
||||
......................................./................|....\/....\............/....../......................
|
||||
......................../..........|........-............|.........................|.\................|....../
|
||||
-.............-...|...........-....-..-.|\.......|......\..........-......|-...-......\.......................
|
||||
...........\.\\.../.................\..........\..-......-......|.-............................-.||...|....../
|
||||
....|................--........|.|..........|......\.............................................-............
|
||||
.-..|................/../..-.........................../...../.....\.../....-.....\-..................../.....
|
||||
............./|..........................\...................................-..-..........|....\..|..........
|
||||
....|...../........./.-....-..................../.........../....................-................\./.........
|
@ -1,10 +0,0 @@
|
||||
.|...\....
|
||||
|.-.\.....
|
||||
.....|-...
|
||||
........|.
|
||||
..........
|
||||
.........\
|
||||
..../.\\..
|
||||
.-.-/..|..
|
||||
.|....-|.\
|
||||
..//.|....
|
502
16/main.s
502
16/main.s
@ -1,502 +0,0 @@
|
||||
%include "utils.s"
|
||||
|
||||
global _start
|
||||
[bits 32]
|
||||
[section .text]
|
||||
|
||||
%define LINE_LEN 111 ; real
|
||||
%define FILENAME "input"
|
||||
;%define LINE_LEN 11 ; test
|
||||
;%define FILENAME "input_test"
|
||||
|
||||
;%define ITER_PRINT
|
||||
|
||||
_start:
|
||||
|
||||
; bit 3 bit 2 bit 1 bit 0
|
||||
; up down left right
|
||||
|
||||
; start top left going right
|
||||
mov dword [test_edge_line], 0
|
||||
mov dword [test_edge_col], 0
|
||||
mov byte [test_edge_dir], 1
|
||||
mov byte [energized], 1
|
||||
jmp next_iteration
|
||||
next_edge_tile:
|
||||
; clear energized
|
||||
mov edi, energized
|
||||
xor eax, eax
|
||||
mov ecx, (128*128)/4
|
||||
rep stosd
|
||||
|
||||
mov eax, [test_edge_line]
|
||||
mov ecx, [test_edge_col]
|
||||
mov bl, [test_edge_dir]
|
||||
cmp bl, 1 ; we're testing going right
|
||||
jne .maybe_2
|
||||
; we're going down first col
|
||||
cmp eax, LINE_LEN-2 ; check if last line
|
||||
je .bl_corner
|
||||
inc eax
|
||||
jmp start_iterations
|
||||
.bl_corner:
|
||||
mov bl, 8 ; try going up
|
||||
jmp start_iterations
|
||||
.maybe_2:
|
||||
cmp bl, 2 ; we're testing going left
|
||||
jne .maybe_4
|
||||
; we're going up the last col
|
||||
cmp eax, 0 ; check if first line
|
||||
je .tr_corner
|
||||
dec eax
|
||||
jmp start_iterations
|
||||
.tr_corner:
|
||||
mov bl, 4 ; try going down
|
||||
jmp start_iterations
|
||||
.maybe_4:
|
||||
cmp bl, 4 ; we're testing going down
|
||||
jne .maybe_8
|
||||
; we're going along the top line backward
|
||||
cmp ecx, 0 ; check if first col
|
||||
je .tl_corner
|
||||
dec ecx
|
||||
jmp start_iterations
|
||||
.tl_corner:
|
||||
jmp game_over ; nothing to do! jump to exit
|
||||
.maybe_8: ; we're testing going up
|
||||
; we're going along the bottom line
|
||||
cmp ecx, LINE_LEN-2 ; check if last col
|
||||
je .br_corner
|
||||
inc ecx
|
||||
jmp start_iterations
|
||||
.br_corner:
|
||||
mov bl, 2 ; try going left
|
||||
jmp start_iterations
|
||||
|
||||
start_iterations:
|
||||
mov [test_edge_line], eax
|
||||
mov [test_edge_col], ecx
|
||||
mov [test_edge_dir], bl
|
||||
mov edx, LINE_LEN
|
||||
mul edx
|
||||
add eax, ecx
|
||||
mov byte [energized+eax], bl
|
||||
|
||||
next_iteration:
|
||||
|
||||
%ifdef ITER_PRINT
|
||||
; debug printing
|
||||
dbg:
|
||||
xor esi, esi ; top line
|
||||
.for_lines:
|
||||
xor ecx, ecx ; leftmost char
|
||||
.for_chars:
|
||||
movzx eax, byte [esi+ecx+energized]
|
||||
movzx ebx, byte [esi+ecx+file]
|
||||
pushad
|
||||
test al, al
|
||||
jz .prnt_char
|
||||
p_string ansi_color_highbold_green
|
||||
cmp bl, '.'
|
||||
jne .prnt_char
|
||||
popcnt ecx, eax
|
||||
cmp ecx, 1
|
||||
jg .prnt_num
|
||||
cmp al, 1
|
||||
je .prnt_right
|
||||
cmp al, 2
|
||||
je .prnt_left
|
||||
cmp al, 4
|
||||
je .prnt_down
|
||||
.prnt_up: mov al, '^'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_down: mov al, 'v'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_left: mov al, '<'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_right: mov al, '>'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_num:
|
||||
mov eax, ecx
|
||||
call print_dec
|
||||
jmp .prnt_done
|
||||
.prnt_char:
|
||||
mov al, [esi+ecx+file]
|
||||
call print_char
|
||||
.prnt_done:
|
||||
p_string ansi_color_reset
|
||||
popad
|
||||
.for_chars_cont:
|
||||
inc ecx
|
||||
cmp ecx, LINE_LEN-2
|
||||
jbe .for_chars
|
||||
.for_chars_done:
|
||||
.for_lines_cont:
|
||||
call newline
|
||||
add esi, LINE_LEN
|
||||
cmp esi, len(file)
|
||||
jb .for_lines
|
||||
call newline
|
||||
; debug printing end
|
||||
%endif
|
||||
|
||||
xor esi, esi ; top line
|
||||
for_lines:
|
||||
xor ecx, ecx ; leftmost char
|
||||
for_chars:
|
||||
movzx eax, byte [esi+ecx+energized]
|
||||
movzx ebx, byte [esi+ecx+file]
|
||||
; skip if not energized
|
||||
test eax, eax
|
||||
jz for_chars_cont
|
||||
; select thing
|
||||
cmp bl, '.'
|
||||
je empty
|
||||
cmp bl, '/'
|
||||
je mirror_one
|
||||
cmp bl, '\'
|
||||
je mirror_two
|
||||
cmp bl, '-'
|
||||
je horz_split
|
||||
cmp bl, '|'
|
||||
je vert_split
|
||||
p_string what_the_fuck
|
||||
jmp exit
|
||||
empty: ; .
|
||||
; propagate
|
||||
; test right
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+1], 1<<0
|
||||
.t_left:
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized-1], 1<<1
|
||||
.t_down:
|
||||
bt eax, 2
|
||||
jnc .t_up
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2
|
||||
.t_up:
|
||||
bt eax, 3
|
||||
jnc .done
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3
|
||||
.done:
|
||||
jmp for_chars_cont
|
||||
mirror_one: ; /
|
||||
; our energized is what hits us
|
||||
; test right >/
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up char going up
|
||||
.t_left: ; /<
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down going down
|
||||
.t_down:
|
||||
bt eax, 2 ; v
|
||||
jnc .t_up ; /
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.t_up:
|
||||
bt eax, 3 ; /
|
||||
jnc .done ; ^
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
.done:
|
||||
jmp for_chars_cont
|
||||
mirror_two: ; \
|
||||
; our energized is what hits us
|
||||
; test right >\
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down char going down
|
||||
.t_left: ; \<
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up going up
|
||||
.t_down:
|
||||
bt eax, 2 ; v
|
||||
jnc .t_up ; \
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
.t_up:
|
||||
bt eax, 3 ; \
|
||||
jnc .done ; ^
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.done:
|
||||
jmp for_chars_cont
|
||||
horz_split: ; -
|
||||
; our energized is what hits us
|
||||
; right and left propagate
|
||||
; test right
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+1], 1<<0
|
||||
.t_left:
|
||||
bt eax, 1
|
||||
jnc .t_vert
|
||||
or byte [esi+ecx+energized-1], 1<<1
|
||||
; down and up go both left and right
|
||||
.t_vert:
|
||||
and eax, 1<<2 | 1<<3
|
||||
jz .done
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.done:
|
||||
jmp for_chars_cont
|
||||
vert_split: ; |
|
||||
; our energized is what hits us
|
||||
; down and up propagate
|
||||
; test down
|
||||
bt eax, 2
|
||||
jnc .t_up
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2
|
||||
.t_up:
|
||||
bt eax, 3
|
||||
jnc .t_vert
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3
|
||||
; left and right go both down and up
|
||||
.t_vert:
|
||||
and eax, 1<<0 | 1<<1
|
||||
jz .done
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down going down
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up going up
|
||||
.done:
|
||||
for_chars_cont:
|
||||
inc ecx
|
||||
cmp ecx, LINE_LEN-2
|
||||
jbe for_chars
|
||||
for_chars_done:
|
||||
for_lines_cont:
|
||||
add esi, LINE_LEN
|
||||
cmp esi, len(file)
|
||||
jb for_lines
|
||||
|
||||
xor ebp, ebp ; energized count
|
||||
sub esi, LINE_LEN ; last line
|
||||
; now go through backward
|
||||
bkwd_for_lines:
|
||||
mov ecx, LINE_LEN-2 ; rightmost char
|
||||
bkwd_for_chars:
|
||||
movzx eax, byte [esi+ecx+energized]
|
||||
movzx ebx, byte [esi+ecx+file]
|
||||
; skip if not energized
|
||||
test eax, eax
|
||||
jz bkwd_for_chars_cont
|
||||
inc ebp ; energized count
|
||||
; select thing
|
||||
cmp bl, '.'
|
||||
je bkwd_empty
|
||||
cmp bl, '/'
|
||||
je bkwd_mirror_one
|
||||
cmp bl, '\'
|
||||
je bkwd_mirror_two
|
||||
cmp bl, '-'
|
||||
je bkwd_horz_split
|
||||
cmp bl, '|'
|
||||
je bkwd_vert_split
|
||||
p_string what_the_fuck
|
||||
jmp exit
|
||||
bkwd_empty: ; .
|
||||
; propagate
|
||||
; test right
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+1], 1<<0
|
||||
.t_left:
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized-1], 1<<1
|
||||
.t_down:
|
||||
bt eax, 2
|
||||
jnc .t_up
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2
|
||||
.t_up:
|
||||
bt eax, 3
|
||||
jnc .done
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3
|
||||
.done:
|
||||
jmp bkwd_for_chars_cont
|
||||
bkwd_mirror_one: ; /
|
||||
; our energized is what hits us
|
||||
; test right >/
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up char going up
|
||||
.t_left: ; /<
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down going down
|
||||
.t_down:
|
||||
bt eax, 2 ; v
|
||||
jnc .t_up ; /
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.t_up:
|
||||
bt eax, 3 ; /
|
||||
jnc .done ; ^
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
.done:
|
||||
jmp bkwd_for_chars_cont
|
||||
bkwd_mirror_two: ; \
|
||||
; our energized is what hits us
|
||||
; test right >\
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down char going down
|
||||
.t_left: ; \<
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up going up
|
||||
.t_down:
|
||||
bt eax, 2 ; v
|
||||
jnc .t_up ; \
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
.t_up:
|
||||
bt eax, 3 ; \
|
||||
jnc .done ; ^
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.done:
|
||||
jmp bkwd_for_chars_cont
|
||||
bkwd_horz_split: ; -
|
||||
; our energized is what hits us
|
||||
; right and left propagate
|
||||
; test right
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+1], 1<<0
|
||||
.t_left:
|
||||
bt eax, 1
|
||||
jnc .t_vert
|
||||
or byte [esi+ecx+energized-1], 1<<1
|
||||
; down and up go both left and right
|
||||
.t_vert:
|
||||
and eax, 1<<2 | 1<<3
|
||||
jz .done
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.done:
|
||||
jmp bkwd_for_chars_cont
|
||||
bkwd_vert_split: ; |
|
||||
; our energized is what hits us
|
||||
; down and up propagate
|
||||
; test down
|
||||
bt eax, 2
|
||||
jnc .t_up
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2
|
||||
.t_up:
|
||||
bt eax, 3
|
||||
jnc .t_vert
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3
|
||||
; left and right go both down and up
|
||||
.t_vert:
|
||||
and eax, 1<<0 | 1<<1
|
||||
jz .done
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down going down
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up going up
|
||||
.done:
|
||||
bkwd_for_chars_cont:
|
||||
dec ecx
|
||||
jnz bkwd_for_chars
|
||||
bkwd_for_chars_done:
|
||||
bkwd_for_lines_cont:
|
||||
sub esi, LINE_LEN
|
||||
jns bkwd_for_lines
|
||||
|
||||
cmp ebp, [last_energized]
|
||||
mov [last_energized], ebp
|
||||
jne next_iteration
|
||||
|
||||
|
||||
; print final
|
||||
xor ebp, ebp
|
||||
print_final:
|
||||
xor esi, esi ; top line
|
||||
.for_lines:
|
||||
xor ecx, ecx ; leftmost char
|
||||
.for_chars:
|
||||
movzx eax, byte [esi+ecx+energized]
|
||||
movzx ebx, byte [esi+ecx+file]
|
||||
test al, al
|
||||
jz .prnt_char
|
||||
inc ebp
|
||||
p_string ansi_color_highbold_green
|
||||
cmp bl, '.'
|
||||
jne .prnt_char
|
||||
popcnt edx, eax
|
||||
cmp edx, 1
|
||||
jg .prnt_num
|
||||
cmp al, 1
|
||||
je .prnt_right
|
||||
cmp al, 2
|
||||
je .prnt_left
|
||||
cmp al, 4
|
||||
je .prnt_down
|
||||
.prnt_up: mov al, '^'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_down: mov al, 'v'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_left: mov al, '<'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_right: mov al, '>'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_num:
|
||||
mov eax, edx
|
||||
call print_dec
|
||||
jmp .prnt_done
|
||||
.prnt_char:
|
||||
mov al, [esi+ecx+file]
|
||||
call print_char
|
||||
.prnt_done:
|
||||
p_string ansi_color_reset
|
||||
.for_chars_cont:
|
||||
inc ecx
|
||||
cmp ecx, LINE_LEN-2
|
||||
jbe .for_chars
|
||||
.for_chars_done:
|
||||
.for_lines_cont:
|
||||
call newline
|
||||
add esi, LINE_LEN
|
||||
cmp esi, len(file)
|
||||
jb .for_lines
|
||||
mov eax, ebp
|
||||
call print_dec
|
||||
call newline
|
||||
call newline
|
||||
cmp [final_value], ebp
|
||||
cmova ebp, [final_value]
|
||||
mov [final_value], ebp
|
||||
jmp next_edge_tile
|
||||
|
||||
game_over:
|
||||
mov eax, [final_value]
|
||||
call print_dec
|
||||
call newline
|
||||
jmp exit
|
||||
|
||||
[section .data]
|
||||
final_value: dd 0
|
||||
last_energized: dd 0
|
||||
test_edge_line: dd 0
|
||||
test_edge_col: dd 0
|
||||
test_edge_dir: dd 0
|
||||
file: incbin FILENAME
|
||||
.over:
|
||||
|
||||
[section .bss]
|
||||
padding: resb 128
|
||||
energized: resb 128*128
|
||||
|
||||
[section .rodata]
|
||||
what_the_fuck: db "Something is terribly wrong in this world."
|
||||
.over:
|
||||
ansi_color_reset: db `\e[0m`
|
||||
.over:
|
||||
ansi_color_green: db `\e[0;32m`
|
||||
.over:
|
||||
ansi_color_highbold_green: db `\e[1;92m`
|
||||
.over:
|
429
16/main_part1.s
429
16/main_part1.s
@ -1,429 +0,0 @@
|
||||
%include "utils.s"
|
||||
|
||||
global _start
|
||||
[bits 32]
|
||||
[section .text]
|
||||
|
||||
%define LINE_LEN 111 ; real
|
||||
%define FILENAME "input"
|
||||
;%define LINE_LEN 11 ; test
|
||||
;%define FILENAME "input_test"
|
||||
|
||||
;%define ITER_PRINT
|
||||
|
||||
_start:
|
||||
|
||||
; bit 3 bit 2 bit 1 bit 0
|
||||
; up down left right
|
||||
|
||||
; top left starts going right
|
||||
mov byte [energized], 1
|
||||
|
||||
next_iteration:
|
||||
|
||||
%ifdef ITER_PRINT
|
||||
; debug printing
|
||||
dbg:
|
||||
xor esi, esi ; top line
|
||||
.for_lines:
|
||||
xor ecx, ecx ; leftmost char
|
||||
.for_chars:
|
||||
movzx eax, byte [esi+ecx+energized]
|
||||
movzx ebx, byte [esi+ecx+file]
|
||||
pushad
|
||||
test al, al
|
||||
jz .prnt_char
|
||||
p_string ansi_color_highbold_green
|
||||
cmp bl, '.'
|
||||
jne .prnt_char
|
||||
popcnt ecx, eax
|
||||
cmp ecx, 1
|
||||
jg .prnt_num
|
||||
cmp al, 1
|
||||
je .prnt_right
|
||||
cmp al, 2
|
||||
je .prnt_left
|
||||
cmp al, 4
|
||||
je .prnt_down
|
||||
.prnt_up: mov al, '^'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_down: mov al, 'v'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_left: mov al, '<'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_right: mov al, '>'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_num:
|
||||
mov eax, ecx
|
||||
call print_dec
|
||||
jmp .prnt_done
|
||||
.prnt_char:
|
||||
mov al, [esi+ecx+file]
|
||||
call print_char
|
||||
.prnt_done:
|
||||
p_string ansi_color_reset
|
||||
popad
|
||||
.for_chars_cont:
|
||||
inc ecx
|
||||
cmp ecx, LINE_LEN-2
|
||||
jbe .for_chars
|
||||
.for_chars_done:
|
||||
.for_lines_cont:
|
||||
call newline
|
||||
add esi, LINE_LEN
|
||||
cmp esi, len(file)
|
||||
jb .for_lines
|
||||
call newline
|
||||
; debug printing end
|
||||
%endif
|
||||
|
||||
xor esi, esi ; top line
|
||||
for_lines:
|
||||
xor ecx, ecx ; leftmost char
|
||||
for_chars:
|
||||
movzx eax, byte [esi+ecx+energized]
|
||||
movzx ebx, byte [esi+ecx+file]
|
||||
; skip if not energized
|
||||
test eax, eax
|
||||
jz for_chars_cont
|
||||
; select thing
|
||||
cmp bl, '.'
|
||||
je empty
|
||||
cmp bl, '/'
|
||||
je mirror_one
|
||||
cmp bl, '\'
|
||||
je mirror_two
|
||||
cmp bl, '-'
|
||||
je horz_split
|
||||
cmp bl, '|'
|
||||
je vert_split
|
||||
p_string what_the_fuck
|
||||
jmp exit
|
||||
empty: ; .
|
||||
; propagate
|
||||
; test right
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+1], 1<<0
|
||||
.t_left:
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized-1], 1<<1
|
||||
.t_down:
|
||||
bt eax, 2
|
||||
jnc .t_up
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2
|
||||
.t_up:
|
||||
bt eax, 3
|
||||
jnc .done
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3
|
||||
.done:
|
||||
jmp for_chars_cont
|
||||
mirror_one: ; /
|
||||
; our energized is what hits us
|
||||
; test right >/
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up char going up
|
||||
.t_left: ; /<
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down going down
|
||||
.t_down:
|
||||
bt eax, 2 ; v
|
||||
jnc .t_up ; /
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.t_up:
|
||||
bt eax, 3 ; /
|
||||
jnc .done ; ^
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
.done:
|
||||
jmp for_chars_cont
|
||||
mirror_two: ; \
|
||||
; our energized is what hits us
|
||||
; test right >\
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down char going down
|
||||
.t_left: ; \<
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up going up
|
||||
.t_down:
|
||||
bt eax, 2 ; v
|
||||
jnc .t_up ; \
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
.t_up:
|
||||
bt eax, 3 ; \
|
||||
jnc .done ; ^
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.done:
|
||||
jmp for_chars_cont
|
||||
horz_split: ; -
|
||||
; our energized is what hits us
|
||||
; right and left propagate
|
||||
; test right
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+1], 1<<0
|
||||
.t_left:
|
||||
bt eax, 1
|
||||
jnc .t_vert
|
||||
or byte [esi+ecx+energized-1], 1<<1
|
||||
; down and up go both left and right
|
||||
.t_vert:
|
||||
and eax, 1<<2 | 1<<3
|
||||
jz .done
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.done:
|
||||
jmp for_chars_cont
|
||||
vert_split: ; |
|
||||
; our energized is what hits us
|
||||
; down and up propagate
|
||||
; test down
|
||||
bt eax, 2
|
||||
jnc .t_up
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2
|
||||
.t_up:
|
||||
bt eax, 3
|
||||
jnc .t_vert
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3
|
||||
; left and right go both down and up
|
||||
.t_vert:
|
||||
and eax, 1<<0 | 1<<1
|
||||
jz .done
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down going down
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up going up
|
||||
.done:
|
||||
for_chars_cont:
|
||||
inc ecx
|
||||
cmp ecx, LINE_LEN-2
|
||||
jbe for_chars
|
||||
for_chars_done:
|
||||
for_lines_cont:
|
||||
add esi, LINE_LEN
|
||||
cmp esi, len(file)
|
||||
jb for_lines
|
||||
|
||||
xor ebp, ebp ; energized count
|
||||
sub esi, LINE_LEN ; last line
|
||||
; now go through backward
|
||||
bkwd_for_lines:
|
||||
mov ecx, LINE_LEN-2 ; rightmost char
|
||||
bkwd_for_chars:
|
||||
movzx eax, byte [esi+ecx+energized]
|
||||
movzx ebx, byte [esi+ecx+file]
|
||||
; skip if not energized
|
||||
test eax, eax
|
||||
jz bkwd_for_chars_cont
|
||||
inc ebp ; energized count
|
||||
; select thing
|
||||
cmp bl, '.'
|
||||
je bkwd_empty
|
||||
cmp bl, '/'
|
||||
je bkwd_mirror_one
|
||||
cmp bl, '\'
|
||||
je bkwd_mirror_two
|
||||
cmp bl, '-'
|
||||
je bkwd_horz_split
|
||||
cmp bl, '|'
|
||||
je bkwd_vert_split
|
||||
p_string what_the_fuck
|
||||
jmp exit
|
||||
bkwd_empty: ; .
|
||||
; propagate
|
||||
; test right
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+1], 1<<0
|
||||
.t_left:
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized-1], 1<<1
|
||||
.t_down:
|
||||
bt eax, 2
|
||||
jnc .t_up
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2
|
||||
.t_up:
|
||||
bt eax, 3
|
||||
jnc .done
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3
|
||||
.done:
|
||||
jmp bkwd_for_chars_cont
|
||||
bkwd_mirror_one: ; /
|
||||
; our energized is what hits us
|
||||
; test right >/
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up char going up
|
||||
.t_left: ; /<
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down going down
|
||||
.t_down:
|
||||
bt eax, 2 ; v
|
||||
jnc .t_up ; /
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.t_up:
|
||||
bt eax, 3 ; /
|
||||
jnc .done ; ^
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
.done:
|
||||
jmp bkwd_for_chars_cont
|
||||
bkwd_mirror_two: ; \
|
||||
; our energized is what hits us
|
||||
; test right >\
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down char going down
|
||||
.t_left: ; \<
|
||||
bt eax, 1
|
||||
jnc .t_down
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up going up
|
||||
.t_down:
|
||||
bt eax, 2 ; v
|
||||
jnc .t_up ; \
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
.t_up:
|
||||
bt eax, 3 ; \
|
||||
jnc .done ; ^
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.done:
|
||||
jmp bkwd_for_chars_cont
|
||||
bkwd_horz_split: ; -
|
||||
; our energized is what hits us
|
||||
; right and left propagate
|
||||
; test right
|
||||
bt eax, 0
|
||||
jnc .t_left
|
||||
or byte [esi+ecx+energized+1], 1<<0
|
||||
.t_left:
|
||||
bt eax, 1
|
||||
jnc .t_vert
|
||||
or byte [esi+ecx+energized-1], 1<<1
|
||||
; down and up go both left and right
|
||||
.t_vert:
|
||||
and eax, 1<<2 | 1<<3
|
||||
jz .done
|
||||
or byte [esi+ecx+energized+1], 1<<0 ; right going right
|
||||
or byte [esi+ecx+energized-1], 1<<1 ; left going left
|
||||
.done:
|
||||
jmp bkwd_for_chars_cont
|
||||
bkwd_vert_split: ; |
|
||||
; our energized is what hits us
|
||||
; down and up propagate
|
||||
; test down
|
||||
bt eax, 2
|
||||
jnc .t_up
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2
|
||||
.t_up:
|
||||
bt eax, 3
|
||||
jnc .t_vert
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3
|
||||
; left and right go both down and up
|
||||
.t_vert:
|
||||
and eax, 1<<0 | 1<<1
|
||||
jz .done
|
||||
or byte [esi+ecx+energized+LINE_LEN], 1<<2 ; down going down
|
||||
or byte [esi+ecx+energized-LINE_LEN], 1<<3 ; up going up
|
||||
.done:
|
||||
bkwd_for_chars_cont:
|
||||
dec ecx
|
||||
jnz bkwd_for_chars
|
||||
bkwd_for_chars_done:
|
||||
bkwd_for_lines_cont:
|
||||
sub esi, LINE_LEN
|
||||
jns bkwd_for_lines
|
||||
|
||||
cmp ebp, [last_energized]
|
||||
mov [last_energized], ebp
|
||||
jne next_iteration
|
||||
|
||||
|
||||
; print final
|
||||
xor ebp, ebp
|
||||
print_final:
|
||||
xor esi, esi ; top line
|
||||
.for_lines:
|
||||
xor ecx, ecx ; leftmost char
|
||||
.for_chars:
|
||||
movzx eax, byte [esi+ecx+energized]
|
||||
movzx ebx, byte [esi+ecx+file]
|
||||
test al, al
|
||||
jz .prnt_char
|
||||
inc ebp
|
||||
p_string ansi_color_highbold_green
|
||||
cmp bl, '.'
|
||||
jne .prnt_char
|
||||
popcnt edx, eax
|
||||
cmp edx, 1
|
||||
jg .prnt_num
|
||||
cmp al, 1
|
||||
je .prnt_right
|
||||
cmp al, 2
|
||||
je .prnt_left
|
||||
cmp al, 4
|
||||
je .prnt_down
|
||||
.prnt_up: mov al, '^'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_down: mov al, 'v'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_left: mov al, '<'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_right: mov al, '>'
|
||||
call print_char
|
||||
jmp .prnt_done
|
||||
.prnt_num:
|
||||
mov eax, edx
|
||||
call print_dec
|
||||
jmp .prnt_done
|
||||
.prnt_char:
|
||||
mov al, [esi+ecx+file]
|
||||
call print_char
|
||||
.prnt_done:
|
||||
p_string ansi_color_reset
|
||||
.for_chars_cont:
|
||||
inc ecx
|
||||
cmp ecx, LINE_LEN-2
|
||||
jbe .for_chars
|
||||
.for_chars_done:
|
||||
.for_lines_cont:
|
||||
call newline
|
||||
add esi, LINE_LEN
|
||||
cmp esi, len(file)
|
||||
jb .for_lines
|
||||
call newline
|
||||
|
||||
game_over:
|
||||
mov eax, ebp
|
||||
call print_dec
|
||||
call newline
|
||||
jmp exit
|
||||
|
||||
[section .data]
|
||||
final_value: dd 0
|
||||
last_energized: dd 0
|
||||
file: incbin FILENAME
|
||||
.over:
|
||||
|
||||
[section .bss]
|
||||
padding: resb 128
|
||||
energized: resb 128*128
|
||||
|
||||
[section .rodata]
|
||||
what_the_fuck: db "Something is terribly wrong in this world."
|
||||
.over:
|
||||
ansi_color_reset: db `\e[0m`
|
||||
.over:
|
||||
ansi_color_green: db `\e[0;32m`
|
||||
.over:
|
||||
ansi_color_highbold_green: db `\e[1;92m`
|
||||
.over:
|
285
16/utils.s
285
16/utils.s
@ -1,285 +0,0 @@
|
||||
[bits 32]
|
||||
[section .text]
|
||||
; call # val val2
|
||||
; int $0x80 eax eax edx -
|
||||
;
|
||||
; arg1 arg2 arg3 arg4 arg5 arg6 arg7
|
||||
; ebx ecx edx esi edi ebp -
|
||||
|
||||
exit:
|
||||
mov eax, 1 ; exit
|
||||
int 0x80
|
||||
|
||||
; filename in EBX
|
||||
; return handle in EBX
|
||||
; read only
|
||||
open_file:
|
||||
push eax
|
||||
push ecx
|
||||
mov eax, 5 ; open
|
||||
xor ecx, ecx ; read only
|
||||
int 0x80
|
||||
mov ebx, eax
|
||||
pop ecx
|
||||
pop eax
|
||||
ret
|
||||
|
||||
; file handle in EBX
|
||||
; buffer in ECX
|
||||
; count of bytes to read in EDX
|
||||
; return bytes actually read in EAX
|
||||
; exits on error
|
||||
read_file:
|
||||
mov eax, 3 ; read
|
||||
int 0x80
|
||||
test eax, eax
|
||||
js .err
|
||||
ret
|
||||
.err:
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov ecx, .err_str
|
||||
mov edx, 21
|
||||
int 0x80
|
||||
jmp exit
|
||||
.err_str: db `Could not read file.\n`
|
||||
|
||||
; string input in ESI
|
||||
; value in EAX
|
||||
; CF set if none, clear if some
|
||||
; ESI set past checked area
|
||||
dec_parse:
|
||||
push ebx
|
||||
push edx
|
||||
push edi
|
||||
xor eax, eax
|
||||
xor edi, edi
|
||||
mov ebx, 10 ; base
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .no_input
|
||||
cmp al, 9
|
||||
jle .got_char
|
||||
.no_input:
|
||||
stc ; set CF
|
||||
jmp .done
|
||||
.loop:
|
||||
xor eax,eax
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .dec_done
|
||||
cmp al, 9
|
||||
jg .dec_done
|
||||
.got_char:
|
||||
xchg edi,eax
|
||||
mul ebx
|
||||
add edi,eax
|
||||
jmp .loop
|
||||
.dec_done:
|
||||
clc ; clear CF
|
||||
.done:
|
||||
mov eax,edi
|
||||
pop edi
|
||||
pop edx
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
; string input in ESI
|
||||
; value in EAX
|
||||
; CF set if none, clear if some
|
||||
; ESI set past checked area
|
||||
sign_dec_parse:
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
push edi
|
||||
xor eax, eax
|
||||
xor edi, edi
|
||||
xor ecx, ecx ; neg flag
|
||||
mov ebx, 10 ; base
|
||||
cmp byte [esi], '-'
|
||||
jne .no_minus
|
||||
inc esi
|
||||
mov cl, 1
|
||||
.no_minus:
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .no_input
|
||||
cmp al, 9
|
||||
jle .got_char
|
||||
.no_input:
|
||||
stc ; set CF
|
||||
jmp .done
|
||||
.loop:
|
||||
xor eax,eax
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .dec_done
|
||||
cmp al, 9
|
||||
jg .dec_done
|
||||
.got_char:
|
||||
xchg edi,eax
|
||||
mul ebx
|
||||
add edi,eax
|
||||
jmp .loop
|
||||
.dec_done:
|
||||
test ecx, ecx
|
||||
jz .not_neg
|
||||
neg edi
|
||||
.not_neg:
|
||||
clc ; clear CF
|
||||
.done:
|
||||
mov eax,edi
|
||||
pop edi
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret
|
||||
|
||||
; modifies no regs
|
||||
newline:
|
||||
pushad
|
||||
push 10
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov ecx, esp ; string
|
||||
mov edx, 1 ; length
|
||||
int 0x80
|
||||
add esp, 4
|
||||
popad
|
||||
ret
|
||||
; modifies no regs
|
||||
space:
|
||||
pushad
|
||||
push 9
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov ecx, esp ; string
|
||||
mov edx, 1 ; length
|
||||
int 0x80
|
||||
add esp, 4
|
||||
popad
|
||||
ret
|
||||
|
||||
; input in EAX, all regs unmodified
|
||||
print_dec:
|
||||
pushad ; save regs
|
||||
; max 4294967296 is 10 chars
|
||||
; round to nearest 32-bit boundary
|
||||
sub esp, 12
|
||||
; string in ECX, length in EDX
|
||||
lea ecx, [esp+11] ; last possible byte
|
||||
; check for 0
|
||||
test eax, eax
|
||||
jz .zero
|
||||
mov ebx, 10 ; base 10
|
||||
xor esi, esi ; counter
|
||||
.div_shit:
|
||||
xor edx, edx
|
||||
; divide
|
||||
div ebx
|
||||
dec ecx ; next char
|
||||
inc esi
|
||||
; store
|
||||
add dl, '0'
|
||||
mov byte [ecx], dl
|
||||
; check if done
|
||||
test eax, eax
|
||||
jnz .div_shit ; continue
|
||||
mov edx, esi ; counter in edx
|
||||
jmp .write
|
||||
.zero:
|
||||
mov byte [ecx], '0'
|
||||
mov edx, 1 ; length
|
||||
.write:
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
int 0x80
|
||||
add esp, 12 ; restore stack
|
||||
popad ; restore regs
|
||||
ret
|
||||
|
||||
; input in EAX, all regs unmodified
|
||||
print_sign_dec:
|
||||
pushad ; save regs
|
||||
; range -2147483648 to 2147483647 is 11 chars
|
||||
; round to nearest 32-bit boundary
|
||||
sub esp, 12
|
||||
; string in ECX, length in EDX
|
||||
lea ecx, [esp+11] ; last possible byte
|
||||
; check for 0, negative
|
||||
xor ebp, ebp
|
||||
test eax, eax
|
||||
jz .zero
|
||||
jns .positive
|
||||
neg eax
|
||||
mov ebp, 1
|
||||
.positive:
|
||||
mov ebx, 10 ; base 10
|
||||
xor esi, esi ; counter
|
||||
.div_shit:
|
||||
xor edx, edx
|
||||
; divide
|
||||
div ebx
|
||||
dec ecx ; next char
|
||||
inc esi
|
||||
; store
|
||||
add dl, '0'
|
||||
mov byte [ecx], dl
|
||||
; check if done
|
||||
test eax, eax
|
||||
jnz .div_shit ; continue
|
||||
mov edx, esi ; counter in edx
|
||||
jmp .write
|
||||
.zero:
|
||||
mov byte [ecx], '0'
|
||||
mov edx, 1 ; length
|
||||
.write:
|
||||
test ebp, ebp
|
||||
jz .no_minus
|
||||
dec ecx
|
||||
inc edx
|
||||
mov byte [ecx], '-'
|
||||
.no_minus:
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
int 0x80
|
||||
add esp, 12 ; restore stack
|
||||
popad ; restore regs
|
||||
ret
|
||||
|
||||
; input in ESI, len in ECX, all regs unmodified
|
||||
print_string:
|
||||
pushad ; save regs
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov edx, ecx ; length
|
||||
mov ecx, esi ; string
|
||||
int 0x80
|
||||
popad ; restore regs
|
||||
ret
|
||||
|
||||
; input in AL, all regs unmodified
|
||||
print_char:
|
||||
pushad ; save regs
|
||||
push eax
|
||||
mov eax, 4 ; write
|
||||
mov ebx, 1 ; stdout
|
||||
mov edx, 1 ; length
|
||||
mov ecx, esp ; string
|
||||
int 0x80
|
||||
add esp, 4
|
||||
popad ; restore regs
|
||||
ret
|
||||
|
||||
; --- MACROS ---
|
||||
%define len(x) x %+ .over - x
|
||||
%macro p_string 1
|
||||
push esi
|
||||
push ecx
|
||||
mov esi, %1
|
||||
mov ecx, len(%1)
|
||||
call print_string
|
||||
pop ecx
|
||||
pop esi
|
||||
%endmacro
|
Loading…
Reference in New Issue
Block a user