From f805701abf2cee2a7dfc9313b672293df60a219a Mon Sep 17 00:00:00 2001 From: Lucia Ceionia Date: Sun, 3 Dec 2023 02:11:23 -0600 Subject: [PATCH] day 3 part 1 --- 02/utils.s | 5 +- 03/Makefile | 3 + 03/input | 140 +++++++++++++++++++++++++++++++++++++ 03/input_test1 | 10 +++ 03/main.s | 179 ++++++++++++++++++++++++++++++++++++++++++++++++ 03/main_part1.s | 179 ++++++++++++++++++++++++++++++++++++++++++++++++ 03/utils.s | 120 ++++++++++++++++++++++++++++++++ 7 files changed, 634 insertions(+), 2 deletions(-) create mode 100644 03/Makefile create mode 100644 03/input create mode 100644 03/input_test1 create mode 100644 03/main.s create mode 100644 03/main_part1.s create mode 100644 03/utils.s diff --git a/02/utils.s b/02/utils.s index 3feccf8..dbb3830 100644 --- a/02/utils.s +++ b/02/utils.s @@ -60,7 +60,7 @@ cmp al, 9 jle .got_char .no_input: stc ; set CF -jmp .dec_done +jmp .done .loop: lodsb sub al, '0' @@ -72,8 +72,9 @@ xchg edi,eax mul ebx add edi,eax jmp .loop -clc ; clear CF .dec_done: +clc ; clear CF +.done: mov eax,edi pop edi pop edx diff --git a/03/Makefile b/03/Makefile new file mode 100644 index 0000000..573eb71 --- /dev/null +++ b/03/Makefile @@ -0,0 +1,3 @@ +all: + nasm -g -felf32 main.s && ld -melf_i386 -g main.o + diff --git a/03/input b/03/input new file mode 100644 index 0000000..eb744d3 --- /dev/null +++ b/03/input @@ -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... diff --git a/03/input_test1 b/03/input_test1 new file mode 100644 index 0000000..b20187f --- /dev/null +++ b/03/input_test1 @@ -0,0 +1,10 @@ +467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.. diff --git a/03/main.s b/03/main.s new file mode 100644 index 0000000..ebd7b7f --- /dev/null +++ b/03/main.s @@ -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 diff --git a/03/main_part1.s b/03/main_part1.s new file mode 100644 index 0000000..ebd7b7f --- /dev/null +++ b/03/main_part1.s @@ -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 diff --git a/03/utils.s b/03/utils.s new file mode 100644 index 0000000..dbb3830 --- /dev/null +++ b/03/utils.s @@ -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