day 3 part 1
This commit is contained in:
parent
f9d0e13336
commit
f805701abf
@ -60,7 +60,7 @@ cmp al, 9
|
|||||||
jle .got_char
|
jle .got_char
|
||||||
.no_input:
|
.no_input:
|
||||||
stc ; set CF
|
stc ; set CF
|
||||||
jmp .dec_done
|
jmp .done
|
||||||
.loop:
|
.loop:
|
||||||
lodsb
|
lodsb
|
||||||
sub al, '0'
|
sub al, '0'
|
||||||
@ -72,8 +72,9 @@ xchg edi,eax
|
|||||||
mul ebx
|
mul ebx
|
||||||
add edi,eax
|
add edi,eax
|
||||||
jmp .loop
|
jmp .loop
|
||||||
clc ; clear CF
|
|
||||||
.dec_done:
|
.dec_done:
|
||||||
|
clc ; clear CF
|
||||||
|
.done:
|
||||||
mov eax,edi
|
mov eax,edi
|
||||||
pop edi
|
pop edi
|
||||||
pop edx
|
pop edx
|
||||||
|
3
03/Makefile
Normal file
3
03/Makefile
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
all:
|
||||||
|
nasm -g -felf32 main.s && ld -melf_i386 -g main.o
|
||||||
|
|
140
03/input
Normal file
140
03/input
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
416.........................559...............417...............785.......900.......284...........503...796....992..........................
|
||||||
|
.........702*....772............378..569.........&.49..606...14*..............$.453*.........307....*......$.....-.................995......
|
||||||
|
.....................458...856......+.........+....&..............680.......104.............%....516.................................*......
|
||||||
|
...........822..174..*.....&...........711.746.......&............$....../.............656....#...........265=......634.*.............430...
|
||||||
|
..827.137..*...*....39................*..............856..............767........522......$..773....619..............*...287....501.........
|
||||||
|
..........726...511.............*.....320........476...............................*................%...899....72..731...........%....$.....
|
||||||
|
.....861..............232....223.933...............*.@........424*618.858.......................................$.......338.205........535..
|
||||||
|
.......#.............-....................676...713...427.................-.......615.........126...................=..*.......*...&........
|
||||||
|
....40..........996..............520.974.*..........#......*.566........907......................&...214...996*911.115.363..960..897........
|
||||||
|
....+.............*....................$..172.....559...763.....*............554......*.............*.......................................
|
||||||
|
.......527...#.....90.+....66.................................890..............=...802.93.131..791...209......&........928......303....$....
|
||||||
|
950.....*....773......105..............725........................................................%............886.......*........$.384.....
|
||||||
|
........383......741..............@..=....#.....179.18..%974..........624.......64.266.................701...........%..671.721.........942.
|
||||||
|
..................*.............914..548..........+.*.................*...........*...................*.........834.394.....*...............
|
||||||
|
.......502*80..960........................25........464.........831.846........25.........329..985...458.+.....&................377..659....
|
||||||
|
..........................................*.....292...............*............/..................@......350........938............*....$...
|
||||||
|
...738..............428......+.......311...742.........236*631....816.&......+....86.........81.......................*.973*341.266.........
|
||||||
|
......*.....673......*......614.........*.......689.48.................450...816.....754...........258..@585.......154..............@.......
|
||||||
|
...231.....#.........681...........855...775..........*.....=..257...................................*.............................469..=682
|
||||||
|
........#...................807...&.............418.19.....259....*459..906...185.356.......778.......230....................556............
|
||||||
|
.......924.........459......*..............804.=.........................*...*...........&....*................=........836..+......618.....
|
||||||
|
.....=............#.......900........+...........702..383........%..*...250..503.......637.808.......97/....@...370.......&........#.....710
|
||||||
|
..988........685............../663.273...........*...@..........16.251...........$..............*..........964.......658.....537........*...
|
||||||
|
...............*......171*......................714.....543............737.....372.............941.............113..*....=.......853....733.
|
||||||
|
............470..161......508.....56...170.............$...................389.....544.....208.....98.........%.....617...884......-..@.....
|
||||||
|
.766.591............../.........-......*.......210.........618......*874....-.........#...*....129.=..194......../...................992....
|
||||||
|
....../....170@..140+..753....918....467.854....*................989..........979...............*.............-.907...276...931*618.........
|
||||||
|
..700............................................801....929..859.....#..........*.............594.493......981..........*...................
|
||||||
|
....+............173..............................................251........629..........970........*................136.........388...*...
|
||||||
|
......721.......$......911....766..................541.234....=...........47......614....@.....*217..885.680.742....................#..84...
|
||||||
|
.377*....*81.............*.......&...937...........+...*....155..@......*............*......648............&...*.....&401......493..........
|
||||||
|
.....1.................533............*..399...........861......951..709.331..126.....876.....................289.........@.....*.......*...
|
||||||
|
..........107....452-......594.888.431....*..+660...........79................................$......275*876.......978.....594..400...39....
|
||||||
|
.........+................*....*.........925..........$.......*........599.......228..........60....................+....#..................
|
||||||
|
...283...................177...708...........642....661........294........*............................288*793.867.....482.479.769....73....
|
||||||
|
...........617..855*...&.............605................783.91.........847................&...../...............*..#..........*.......+.....
|
||||||
|
.672..303+...*........967...............*453.....884@......*...208.949........*..........986.....249.....352..818.596.56....................
|
||||||
|
...*..........88...............569.....................975.....*.....*..638....619.......................+.............*.......*.......462..
|
||||||
|
....500.....=...................*.................*205..*..-...228.508....&........................395..............845.....683.365....*....
|
||||||
|
........197.672.841..............214.=...847...912.....24.349...................%....584.257............152.................................
|
||||||
|
.626....-..........*..447............714....&.....................463....287...360........*............*...............*.................717
|
||||||
|
..........53......334...*........................*167......................*.......................554..246...........295.396......./.......
|
||||||
|
.......24..............92...........897.......220...........................930..703...414.....711..*.........723.........*....117...146....
|
||||||
|
.......&...........548.....324.21......................622.........820.404...............*....../..139......&......*.......578...*..........
|
||||||
|
.....*......204......*..........*.............226...........663.......*......555.992.....502...........631..49.#....366........677..........
|
||||||
|
..958.350.....*......44...694...449..-39........*...........-...786.........*......*............................140.........................
|
||||||
|
...............477.........*...................815..............*..........815.................521....................&...273........103....
|
||||||
|
.........828............781....464..................276......646....665-............924..........*.......955........759.........934...#.....
|
||||||
|
........*..........*..........*..........15.193.......*.....................&.................808....347*......963........*....+............
|
||||||
|
.........810.....360........638...434.....*....*751....812.....573...........85.........+.........95.......892...*...153...220..........187.
|
||||||
|
....714*....................................................80*....162=.................214...........842...&...39..........................
|
||||||
|
........265.........................51.......285$.......................586.......=.................................*.....*..............948
|
||||||
|
..989..........22.=......374.......%....................142.......736..@.....507.636.797.....273.........872.....567.978..334.....382...*...
|
||||||
|
..........@.......68..=......................116.130.......%.250../......-...=........*.........*486.415..........................*....813..
|
||||||
|
.......505............61..140..........435..........*691......*........852..........571....408..............12......80.......228...109......
|
||||||
|
.........................*.........207...*..24................402.=...........................@....................../...162................
|
||||||
|
....285.................672.552........492....$./..................3..620.391...............................179............*................
|
||||||
|
...*..........159...428.......*.................390.111.........$.....*...*..................348.355.481.......&.210..99...41...............
|
||||||
|
...52......12..@..........808.810.897...................663..280....57..............476.............*............*.....*........208=........
|
||||||
|
..........*...............*.........@.286..................*...........................*..........................905.296..............148..
|
||||||
|
.......298......119.....172.................622$..637................#......342.......679.111......-968..104*478............#.......*.......
|
||||||
|
.../.............*........../......................*..............658..........*718..........*136.....................503.899....889.498....
|
||||||
|
....691........341.262..36.549...........386........437.............................662...........848............#......*...................
|
||||||
|
.......................*..........936...*...............................-...........*......516....%......358....707..535...........841......
|
||||||
|
......$..............639............*..798.../..67%............137...716.......313.247......................-............@.....371..........
|
||||||
|
....433.677..605.267................1.......930........478........*........565*................................869.......372..@....228......
|
||||||
|
...........@..*..$...794.........................74.......#./......833.348.......................................+................*.........
|
||||||
|
......865...............*.........................*..........839.....................=......................................916..84.@.......
|
||||||
|
.................-....451........541@......468..684....18............759.............499................124.....426*.........*......882.....
|
||||||
|
...68*...........614........509...............*.........&...956*308.%........&....36...........480+....../..........917....32....#..........
|
||||||
|
......363..377.............*..........441.....418..........................279.....*.................139..........................944.......
|
||||||
|
........................412............*..........%....920*585....526*............931.346&.807..840.....*.626-...#....................923...
|
||||||
|
.....283.....924...+..................628.......33....................908..766..............*........336..........446...........191.........
|
||||||
|
...............*.249........@264..35...................502.791.#...........*......=............126....................957....71....*.768....
|
||||||
|
.........144&.36.....216.........*...........................&.730..........201..581.704.........$......715.............=......*.......%....
|
||||||
|
...349..............*....598...949.........189....981.....#.............524...................*............=................440...847.......
|
||||||
|
.................967....#..........999*6..%.........-......604............&.189.626...#774.159.647....................168.........../...329.
|
||||||
|
..............................................481.....*........................*.................................747..%.................#...
|
||||||
|
..........245...878.......495....57....841.........351.517..........-297........................343.599/........&.......360..........-......
|
||||||
|
430........&..............&.....*...&.....*885...........................9....392.......93..336*...........................*321.....86......
|
||||||
|
....469......#.................999..796..................899.........250*........$.......*........247............................+.......328
|
||||||
|
......*...696...615..300..603..............................*....232...................402...501......*.......77.271.....@.........146.......
|
||||||
|
......170......%....$.........*..991..........782.49.......128.............................*........161........*.....648......123...........
|
||||||
|
..........646................901..*.............*......134...........517..2..287........513...............................644...*...........
|
||||||
|
...................999*620.........541.379.....488..18*.......................*...............208....931.338..%143...........*...19.........
|
||||||
|
...+.......938...........................*...%.............&........626......268.418......841*..........*...............820.395..........913
|
||||||
|
.723...834*..........+............162.667.....84............803.804...*............*................399........172..530*....................
|
||||||
|
.....................596............*............................./.287............852....623....@.*..............@........168...965..*17...
|
||||||
|
.....=488...................758....607.....&......53%......................105.683......-...*.860..244.....&....$....232....................
|
||||||
|
.............................*..........333....................197........+....*......334.954.............686...464...............544.......
|
||||||
|
.139=..............754...993.677..../.......933..........391....*....357*.....952......................@..........................*.........
|
||||||
|
..........831............../.........94.600................+.121.........183........18..686.....665*..823...........575...........68........
|
||||||
|
141...800....*....692...........254@.....*...819-.....................................*..@...................17.......*...815...........686.
|
||||||
|
........%.602........%.................186..........562.93....774.....................11....948....912.........*328..243.*..................
|
||||||
|
.......................................................*..........607....280..................&....+.....................548.&897.100@...955
|
||||||
|
......504.....605...........889@.............975..664....$.....#............*....141.................378%.........812.......................
|
||||||
|
.....=...........*.....730...............%...............899..480.....*....375.....-.444.........47*.........@63...........828.....468..462.
|
||||||
|
.......607.../...23....=......=........383.............................522............*.............433..360..................*372...*......
|
||||||
|
........*...975.............428...................592*......@258...114......%......431...................*......+........658.......560.163..
|
||||||
|
........16........................329.......315.......973............*...333....@.......$....782..18...58....533........*...............*...
|
||||||
|
..327.............563...889.......*...........*..595...............913........671..354..937...%..*...&...........&.787...975.......676...247
|
||||||
|
.....+..&...401..*..............713........=.757...#.873*47...#465..................................440..588/..859.%..................*.....
|
||||||
|
.665....133...%..196....907..............348..................................162........305...................................163.-........
|
||||||
|
....*....................*...........170.........222.804....784..............*...................................................=.742......
|
||||||
|
..239..338.....27-.437..543.........*....609......*..*......-...............582..-...........343*560....852.../....636..263.................
|
||||||
|
..........*900.......*............17...........948.....597.....=....922...........682./255................@..35.......*.......211-..#.......
|
||||||
|
.......*...........686........984..........78......896*......13........+....................985...&....................278.........876.835..
|
||||||
|
....630.82....$851.....905.......*..281...*...............................352..........*746........215.877....845..........471.852.....*....
|
||||||
|
.........................*.....757.*......625...........924......878..........912...............-.........*../.....538%......+.........871..
|
||||||
|
..954*712..977.....-..762..........236.........527*674.*.........*........811*.....228....&.....5........739...483..........................
|
||||||
|
..........*.......470..................................707....363.................*......525.......303..........*........463....537.........
|
||||||
|
...460...947...............130.....757./96........*.................=...529....+..466........527................65..%648....=.....*.........
|
||||||
|
.....*......................$....../..............968..............479.&....630............................598.................952..........
|
||||||
|
.......&..........793...................................514...............-...................311..........=....83......#.............124...
|
||||||
|
.975....399.......*...-.......*814...663..................*....*...........381../...............*.............@.........284............*....
|
||||||
|
...*............367....198..........@.....992.....716*529....96.................729.329.688...%.322.-......67.79......-.......335....997....
|
||||||
|
488............................632........*...../......................387.............*....225......491.............391..750...%...........
|
||||||
|
.......861.527......778.165.......*........187..916.......845....-....*.......873.................................@.........................
|
||||||
|
..545.....*.....$.....*..*......627............................736.376..845...*....594........+.......171.........292...........*750..-.....
|
||||||
|
.................407.403............+...342.................+..........*.......897..........400.......$......................910.......350..
|
||||||
|
...........................40..284.66...*......494..........255.......653..............866.................942=..................*52........
|
||||||
|
....&........827.......296...*........$.401......*..............892*...................$.............1.164.......343..........485...........
|
||||||
|
.930............*.........*..944...308...........763....../.........62.....113....=...........421........*..........................580+....
|
||||||
|
........50*.....934......705............................999..................*....541...............847-.950..............*131..............
|
||||||
|
...........209....................................&404...............276..242.............723.652................873...313..............24..
|
||||||
|
......*........606....550#.....2./........@..................899.......*.....................*..........235..112...........704.....337......
|
||||||
|
.......837....*...............*...83...993.....*416.........-....580%..535......../.....-204...............#..*.....93+....*...723./........
|
||||||
|
..............168.....753..593..............504......./........................488..............=.............458.......872...*.............
|
||||||
|
...#85...................&......911/...................880........315..872..........=....494..349....466..428..................40...........
|
||||||
|
........939........648......................*................227...*......*.......924...*...........*.....*.................................
|
||||||
|
918*......&.@........*...902..269..834....87.826.........../...*...919.118...817......109..........933..643...........&..............-......
|
||||||
|
....949......883...111..%......*...%..................710.464.943.........../...................................842....305.....469..289.....
|
||||||
|
..........................%...974......*407..168.647...*..............617.......498/.....848...........@99........*...........+.............
|
||||||
|
..........176...........120.........469........&...#....997......464.......274.............*......./............477.417../.......738........
|
||||||
|
.........*.......964.........291..........................................-.............2..29...272..465...............-..819........718*265
|
||||||
|
....298...747.......#.......*.....+745...........460...741*762.275...491.......+.735*34.*............-....*841......+............*..........
|
||||||
|
...*........................593..............298...#............%....$......225.........943........................23.....702.601.616.......
|
||||||
|
..889................695........654..750.....*.............637........./...............................780....*726....233...*...............
|
||||||
|
..................../.................*.....453.....642....*.........828......@...94...........152/...*....790.......*.....445......../.....
|
||||||
|
...........................51.......681........................271..........719.......................964......399..426...............456...
|
10
03/input_test1
Normal file
10
03/input_test1
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
467..114..
|
||||||
|
...*......
|
||||||
|
..35..633.
|
||||||
|
......#...
|
||||||
|
617*......
|
||||||
|
.....+.58.
|
||||||
|
..592.....
|
||||||
|
......755.
|
||||||
|
...$.*....
|
||||||
|
.664.598..
|
179
03/main.s
Normal file
179
03/main.s
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
%define BUFF_LIM 32768
|
||||||
|
;%define GRID_X 10
|
||||||
|
;%define GRID_Y 10
|
||||||
|
%define GRID_X 140
|
||||||
|
%define GRID_Y 140
|
||||||
|
|
||||||
|
global _start
|
||||||
|
[bits 32]
|
||||||
|
[section .text]
|
||||||
|
|
||||||
|
%include "utils.s"
|
||||||
|
|
||||||
|
_start:
|
||||||
|
mov ebx, filename
|
||||||
|
call open_file
|
||||||
|
mov ecx, read_buff
|
||||||
|
mov edx, BUFF_LIM
|
||||||
|
call read_file
|
||||||
|
add eax, read_buff
|
||||||
|
mov [file_lim], eax
|
||||||
|
|
||||||
|
; 1. read file into array,
|
||||||
|
; padding edges by 1
|
||||||
|
read_to_array:
|
||||||
|
mov esi, read_buff
|
||||||
|
; first line padded by .
|
||||||
|
mov edi, array
|
||||||
|
mov ecx, (GRID_X+2)
|
||||||
|
mov al, '.'
|
||||||
|
rep stosb
|
||||||
|
mov ecx, GRID_Y ; line count
|
||||||
|
.read_lines:
|
||||||
|
; 1 char pad before line
|
||||||
|
mov al, '.'
|
||||||
|
stosb
|
||||||
|
push ecx
|
||||||
|
.read_chars:
|
||||||
|
mov ecx, GRID_X ; line len (discluding newline)
|
||||||
|
rep movsb ; copy line
|
||||||
|
inc esi ; skip newline
|
||||||
|
mov al, '.'
|
||||||
|
stosb ; pad with .
|
||||||
|
pop ecx
|
||||||
|
loop .read_lines
|
||||||
|
; fill last line with .
|
||||||
|
mov ecx, (GRID_X+2)
|
||||||
|
mov al, '.'
|
||||||
|
rep stosb
|
||||||
|
|
||||||
|
; 2. find numbers, putting indexes
|
||||||
|
; into numbers array in the index array
|
||||||
|
find_numbers:
|
||||||
|
push 1 ; current number index
|
||||||
|
xor ecx, ecx ; index
|
||||||
|
.find_next:
|
||||||
|
; check for end of array
|
||||||
|
cmp ecx, (GRID_X+2)*(GRID_Y*2)
|
||||||
|
jge .done
|
||||||
|
lea esi, [ecx+array] ; current char
|
||||||
|
mov edi, esi ; number start if num
|
||||||
|
call dec_parse
|
||||||
|
jnc .has_num
|
||||||
|
; no number
|
||||||
|
inc ecx
|
||||||
|
jmp .find_next
|
||||||
|
.has_num:
|
||||||
|
sub esi, edi ; get number char length
|
||||||
|
add esi, ecx ; add to index
|
||||||
|
dec esi
|
||||||
|
; write to index and to numbers
|
||||||
|
pop ebx ; cur num idx
|
||||||
|
mov [numbers+ebx*4], eax ; save number value
|
||||||
|
.write_idx:
|
||||||
|
mov [index+ecx*2], bx
|
||||||
|
; overwrite digits with .
|
||||||
|
mov byte [array+ecx], '.'
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, esi
|
||||||
|
jl .write_idx
|
||||||
|
inc ecx
|
||||||
|
; push new cur num idx
|
||||||
|
inc ebx
|
||||||
|
push ebx
|
||||||
|
jmp .find_next
|
||||||
|
.done:
|
||||||
|
add esp, 4 ; no more cur num idx
|
||||||
|
|
||||||
|
; 3. go through array, checking the neighbors of
|
||||||
|
; numbers for symbols, skip *last added index*,
|
||||||
|
; adding numbers with sym neighbors to final_value
|
||||||
|
check_neighbors:
|
||||||
|
xor ecx, ecx ; index
|
||||||
|
dec ecx ; gets incremented immediately
|
||||||
|
xor ebx, ebx ; last added idx
|
||||||
|
mov esi, array
|
||||||
|
mov edi, index
|
||||||
|
.check_next_number:
|
||||||
|
; check for end of array
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, (GRID_X+2)*(GRID_Y*2)
|
||||||
|
jge .done
|
||||||
|
; check if num
|
||||||
|
movzx eax, word [index+ecx*2]
|
||||||
|
test eax, eax
|
||||||
|
jz .check_next_number
|
||||||
|
.found_num:
|
||||||
|
; check if last added idx
|
||||||
|
cmp eax, ebx
|
||||||
|
je .check_next_number ; is last added idx, skip
|
||||||
|
.check_symbols:
|
||||||
|
lea edx, [ecx+array] ; current char
|
||||||
|
; right
|
||||||
|
cmp byte [edx+1], '.'
|
||||||
|
je .r_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.r_nsym:
|
||||||
|
; left
|
||||||
|
cmp byte [edx-1], '.'
|
||||||
|
je .l_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.l_nsym:
|
||||||
|
; top
|
||||||
|
cmp byte [edx-(GRID_X+2)], '.'
|
||||||
|
je .t_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.t_nsym:
|
||||||
|
; bottom
|
||||||
|
cmp byte [edx+(GRID_X+2)], '.'
|
||||||
|
je .b_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.b_nsym:
|
||||||
|
; top left
|
||||||
|
cmp byte [edx-((GRID_X+2)+1)], '.'
|
||||||
|
je .tl_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.tl_nsym:
|
||||||
|
; top right
|
||||||
|
cmp byte [edx-((GRID_X+2)-1)], '.'
|
||||||
|
je .tr_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.tr_nsym:
|
||||||
|
; bottom left
|
||||||
|
cmp byte [edx+((GRID_X+2)-1)], '.'
|
||||||
|
je .bl_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.bl_nsym:
|
||||||
|
; bottom right
|
||||||
|
cmp byte [edx+((GRID_X+2)+1)], '.'
|
||||||
|
je .br_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.br_nsym:
|
||||||
|
; there's no symbol neighbor
|
||||||
|
; get next number
|
||||||
|
jmp .check_next_number
|
||||||
|
.has_sym_neighbor:
|
||||||
|
; we have a symbol neighbor!
|
||||||
|
; add to final value
|
||||||
|
mov edx, [numbers+eax*4]
|
||||||
|
add [final_value], edx
|
||||||
|
; set last added idx
|
||||||
|
mov ebx, eax
|
||||||
|
; get next number
|
||||||
|
jmp .check_next_number
|
||||||
|
.done:
|
||||||
|
; we can print final value
|
||||||
|
mov eax, [final_value]
|
||||||
|
call print_dec
|
||||||
|
jmp exit
|
||||||
|
|
||||||
|
[section .data]
|
||||||
|
file_lim: dd 0
|
||||||
|
final_value: dd 0
|
||||||
|
filename: db "input",0
|
||||||
|
|
||||||
|
[section .bss]
|
||||||
|
numbers: resd 2048
|
||||||
|
array: resb (GRID_X+2)*(GRID_Y*2)
|
||||||
|
index: resw (GRID_X+2)*(GRID_Y*2)
|
||||||
|
read_buff: resb BUFF_LIM
|
179
03/main_part1.s
Normal file
179
03/main_part1.s
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
%define BUFF_LIM 32768
|
||||||
|
;%define GRID_X 10
|
||||||
|
;%define GRID_Y 10
|
||||||
|
%define GRID_X 140
|
||||||
|
%define GRID_Y 140
|
||||||
|
|
||||||
|
global _start
|
||||||
|
[bits 32]
|
||||||
|
[section .text]
|
||||||
|
|
||||||
|
%include "utils.s"
|
||||||
|
|
||||||
|
_start:
|
||||||
|
mov ebx, filename
|
||||||
|
call open_file
|
||||||
|
mov ecx, read_buff
|
||||||
|
mov edx, BUFF_LIM
|
||||||
|
call read_file
|
||||||
|
add eax, read_buff
|
||||||
|
mov [file_lim], eax
|
||||||
|
|
||||||
|
; 1. read file into array,
|
||||||
|
; padding edges by 1
|
||||||
|
read_to_array:
|
||||||
|
mov esi, read_buff
|
||||||
|
; first line padded by .
|
||||||
|
mov edi, array
|
||||||
|
mov ecx, (GRID_X+2)
|
||||||
|
mov al, '.'
|
||||||
|
rep stosb
|
||||||
|
mov ecx, GRID_Y ; line count
|
||||||
|
.read_lines:
|
||||||
|
; 1 char pad before line
|
||||||
|
mov al, '.'
|
||||||
|
stosb
|
||||||
|
push ecx
|
||||||
|
.read_chars:
|
||||||
|
mov ecx, GRID_X ; line len (discluding newline)
|
||||||
|
rep movsb ; copy line
|
||||||
|
inc esi ; skip newline
|
||||||
|
mov al, '.'
|
||||||
|
stosb ; pad with .
|
||||||
|
pop ecx
|
||||||
|
loop .read_lines
|
||||||
|
; fill last line with .
|
||||||
|
mov ecx, (GRID_X+2)
|
||||||
|
mov al, '.'
|
||||||
|
rep stosb
|
||||||
|
|
||||||
|
; 2. find numbers, putting indexes
|
||||||
|
; into numbers array in the index array
|
||||||
|
find_numbers:
|
||||||
|
push 1 ; current number index
|
||||||
|
xor ecx, ecx ; index
|
||||||
|
.find_next:
|
||||||
|
; check for end of array
|
||||||
|
cmp ecx, (GRID_X+2)*(GRID_Y*2)
|
||||||
|
jge .done
|
||||||
|
lea esi, [ecx+array] ; current char
|
||||||
|
mov edi, esi ; number start if num
|
||||||
|
call dec_parse
|
||||||
|
jnc .has_num
|
||||||
|
; no number
|
||||||
|
inc ecx
|
||||||
|
jmp .find_next
|
||||||
|
.has_num:
|
||||||
|
sub esi, edi ; get number char length
|
||||||
|
add esi, ecx ; add to index
|
||||||
|
dec esi
|
||||||
|
; write to index and to numbers
|
||||||
|
pop ebx ; cur num idx
|
||||||
|
mov [numbers+ebx*4], eax ; save number value
|
||||||
|
.write_idx:
|
||||||
|
mov [index+ecx*2], bx
|
||||||
|
; overwrite digits with .
|
||||||
|
mov byte [array+ecx], '.'
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, esi
|
||||||
|
jl .write_idx
|
||||||
|
inc ecx
|
||||||
|
; push new cur num idx
|
||||||
|
inc ebx
|
||||||
|
push ebx
|
||||||
|
jmp .find_next
|
||||||
|
.done:
|
||||||
|
add esp, 4 ; no more cur num idx
|
||||||
|
|
||||||
|
; 3. go through array, checking the neighbors of
|
||||||
|
; numbers for symbols, skip *last added index*,
|
||||||
|
; adding numbers with sym neighbors to final_value
|
||||||
|
check_neighbors:
|
||||||
|
xor ecx, ecx ; index
|
||||||
|
dec ecx ; gets incremented immediately
|
||||||
|
xor ebx, ebx ; last added idx
|
||||||
|
mov esi, array
|
||||||
|
mov edi, index
|
||||||
|
.check_next_number:
|
||||||
|
; check for end of array
|
||||||
|
inc ecx
|
||||||
|
cmp ecx, (GRID_X+2)*(GRID_Y*2)
|
||||||
|
jge .done
|
||||||
|
; check if num
|
||||||
|
movzx eax, word [index+ecx*2]
|
||||||
|
test eax, eax
|
||||||
|
jz .check_next_number
|
||||||
|
.found_num:
|
||||||
|
; check if last added idx
|
||||||
|
cmp eax, ebx
|
||||||
|
je .check_next_number ; is last added idx, skip
|
||||||
|
.check_symbols:
|
||||||
|
lea edx, [ecx+array] ; current char
|
||||||
|
; right
|
||||||
|
cmp byte [edx+1], '.'
|
||||||
|
je .r_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.r_nsym:
|
||||||
|
; left
|
||||||
|
cmp byte [edx-1], '.'
|
||||||
|
je .l_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.l_nsym:
|
||||||
|
; top
|
||||||
|
cmp byte [edx-(GRID_X+2)], '.'
|
||||||
|
je .t_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.t_nsym:
|
||||||
|
; bottom
|
||||||
|
cmp byte [edx+(GRID_X+2)], '.'
|
||||||
|
je .b_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.b_nsym:
|
||||||
|
; top left
|
||||||
|
cmp byte [edx-((GRID_X+2)+1)], '.'
|
||||||
|
je .tl_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.tl_nsym:
|
||||||
|
; top right
|
||||||
|
cmp byte [edx-((GRID_X+2)-1)], '.'
|
||||||
|
je .tr_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.tr_nsym:
|
||||||
|
; bottom left
|
||||||
|
cmp byte [edx+((GRID_X+2)-1)], '.'
|
||||||
|
je .bl_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.bl_nsym:
|
||||||
|
; bottom right
|
||||||
|
cmp byte [edx+((GRID_X+2)+1)], '.'
|
||||||
|
je .br_nsym
|
||||||
|
jmp .has_sym_neighbor
|
||||||
|
.br_nsym:
|
||||||
|
; there's no symbol neighbor
|
||||||
|
; get next number
|
||||||
|
jmp .check_next_number
|
||||||
|
.has_sym_neighbor:
|
||||||
|
; we have a symbol neighbor!
|
||||||
|
; add to final value
|
||||||
|
mov edx, [numbers+eax*4]
|
||||||
|
add [final_value], edx
|
||||||
|
; set last added idx
|
||||||
|
mov ebx, eax
|
||||||
|
; get next number
|
||||||
|
jmp .check_next_number
|
||||||
|
.done:
|
||||||
|
; we can print final value
|
||||||
|
mov eax, [final_value]
|
||||||
|
call print_dec
|
||||||
|
jmp exit
|
||||||
|
|
||||||
|
[section .data]
|
||||||
|
file_lim: dd 0
|
||||||
|
final_value: dd 0
|
||||||
|
filename: db "input",0
|
||||||
|
|
||||||
|
[section .bss]
|
||||||
|
numbers: resd 2048
|
||||||
|
array: resb (GRID_X+2)*(GRID_Y*2)
|
||||||
|
index: resw (GRID_X+2)*(GRID_Y*2)
|
||||||
|
read_buff: resb BUFF_LIM
|
120
03/utils.s
Normal file
120
03/utils.s
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
; 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:
|
||||||
|
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
|
||||||
|
|
||||||
|
; 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
|
Loading…
Reference in New Issue
Block a user