From d59671e54c65f5187381eda46df9b96ee207bc16 Mon Sep 17 00:00:00 2001 From: Lucia Ceionia Date: Tue, 19 Dec 2023 21:20:26 -0600 Subject: [PATCH] day 19 part 1 --- 19/Makefile | 3 + 19/input | 780 ++++++++++++++++++++++++++++++++++++++++++++++++ 19/input_test | 17 ++ 19/main_part1.s | 304 +++++++++++++++++++ 19/utils.s | 285 ++++++++++++++++++ 5 files changed, 1389 insertions(+) create mode 100644 19/Makefile create mode 100644 19/input create mode 100644 19/input_test create mode 100644 19/main_part1.s create mode 100644 19/utils.s diff --git a/19/Makefile b/19/Makefile new file mode 100644 index 0000000..573eb71 --- /dev/null +++ b/19/Makefile @@ -0,0 +1,3 @@ +all: + nasm -g -felf32 main.s && ld -melf_i386 -g main.o + diff --git a/19/input b/19/input new file mode 100644 index 0000000..b4596b1 --- /dev/null +++ b/19/input @@ -0,0 +1,780 @@ +fr{a>2845:A,m<2004:A,A} +lxs{s<2192:R,R} +jhz{x<442:A,A} +zm{x<1231:R,A} +jz{s<2913:A,x<2108:R,R} +cqv{a>2101:R,A} +hsx{m<1426:xxn,s<1619:sq,qqb} +sdm{x>1360:A,A} +zbb{a>3503:R,s>2984:R,A} +skk{x>1878:A,s>1548:R,R} +mn{x>576:R,x<195:A,s<303:R,A} +hbj{a>728:hqq,ggl} +lq{x>1539:A,m>950:A,m>611:A,R} +gx{a>3590:zmc,tg} +xpr{a<3371:R,s<3114:A,R} +nf{m>2252:A,m<1915:A,x<1541:A,R} +mfl{m<1608:vk,m>2471:mp,x<1842:A,A} +md{x<1958:A,A} +bt{s>2495:R,x<2051:R,a<3362:R,R} +zp{m>1849:R,m>1720:A,s<2907:A,R} +kp{x>2295:R,x>2106:R,A} +dm{a>3142:rk,x<996:kc,m>2686:lxc,svc} +cq{a<1392:xkx,s>2114:czc,R} +xlc{m>3640:xh,s<1981:ck,x<1275:R,tv} +qhp{a>2255:R,m<2909:A,R} +zz{x>158:A,A} +bmg{s>3584:A,R} +tp{m>1848:vrs,mds} +mds{a<3473:A,a>3501:A,s<3009:A,R} +kdm{s<3771:zx,vq} +xxn{a>1741:fq,m<899:bkf,vm} +lbm{m>3455:A,R} +bq{x>2598:R,A} +vlr{m>1824:rsn,a<3330:mr,x<1229:ch,gfp} +rfd{x<1380:vxx,m>2215:A,jbz} +fnp{s<2124:bh,a<1450:A,A} +pvh{s>1623:A,x<3503:A,s<1454:R,R} +dhh{s>1900:A,R} +cv{m>2619:gvq,zbb} +gz{a<2237:R,A} +hrf{a>1467:shg,A} +kqp{m>2434:qst,x>1969:kgz,gr} +xlg{s<1949:tj,x<1948:czj,R} +xf{s<2587:A,m>2612:R,a>381:A,R} +fdj{a>3545:A,a<3532:R,s<2736:R,R} +shn{m>2612:R,m<1284:jlp,A} +xx{a>3575:jzf,a<3518:A,s>2638:fdj,A} +sd{a<3248:R,m<3422:js,s>1555:A,lz} +vd{s>1745:txb,fs} +hm{a>1763:pg,s<3711:dvf,xpp} +xhj{a<1056:A,m>3355:A,ntz} +td{x>705:A,R} +znz{a>3929:xg,fcf} +kk{s>2920:A,m>3806:R,ng} +mx{m>987:R,m<500:A,A} +rk{s<2159:ph,s<2256:dxp,m<2823:jq,km} +lb{a>2647:A,s<1457:A,x>3452:R,R} +svc{s<2017:kgt,xff} +nk{x>1466:A,s<2004:lxg,s>2073:sgd,mnx} +cn{x<3437:R,R} +shg{m<2072:R,R} +xbh{s>1178:R,R} +czj{m>873:R,x>1527:R,x>1352:R,A} +dj{s<3859:nsk,x<3298:ktl,a>730:ll,bx} +lzq{m<3709:A,a>758:R,a<697:R,R} +xjn{a>2302:A,m>2041:A,s>3482:R,A} +zcb{a<276:R,m<2219:R,s>2027:A,A} +hmn{x<2560:A,m<2069:R,x>3240:R,A} +dxp{x<1615:R,a<3653:A,R} +thv{m>1443:fnp,dnc} +bpq{a>2566:R,s>2238:ndq,a>2202:R,A} +xkv{s<1708:R,s<1764:A,m<2486:A,A} +xrs{s>2780:vn,hvh} +tkq{s<3890:R,s>3905:A,s<3900:R,A} +cxv{m>3326:zl,x<1480:mz,x<2829:rv,lt} +kzn{m<2943:A,x<3690:A,R} +gd{s>1936:A,x>3201:R,m>3130:A,R} +qqb{x>858:rf,x<392:vd,mh} +mmb{s>1505:vl,m>2260:zzn,jd} +zlb{m<2754:A,m>2824:R,R} +gf{s>2007:zhl,x>742:mzn,a<2531:nm,R} +th{s<3579:A,A} +nsk{s<3700:A,crp} +jc{x>770:A,A} +ln{x>970:xzr,s>3048:ccr,lfn} +lnf{m<2433:ds,m>3234:lzq,gkn} +crp{s>3759:A,x<3534:A,A} +thj{s<2817:R,R} +rpn{m<463:R,s>1546:R,s>1448:A,R} +lf{a<3216:R,x<1505:gkh,s>1758:R,bxz} +jg{m>552:vxm,a<3207:nq,fz} +rsn{a>3358:R,gzj} +nn{x>2059:qq,a>159:dhl,gfc} +skv{s<1728:A,a<1776:A,x<555:R,R} +ktv{s>3176:R,s>3065:A,A} +zq{m>3113:A,x<3424:A,R} +tqv{x>3879:A,x>3815:A,A} +vp{a<1366:lgh,m>1586:nl,jpj} +cz{x>1163:R,A} +dxn{m>3105:R,m<2018:skv,x<548:R,xkv} +xtn{a>3160:rd,s>2740:tl,xj} +dv{a<3922:bv,s<2651:rl,R} +glg{s>3870:R,m>3122:R,R} +mls{a>2798:R,x>2352:A,R} +ztq{a<2008:jhc,m>862:tbl,A} +rqk{a>1311:R,R} +nlx{a<2137:A,s>2037:nnf,a<2838:R,vkh} +jvd{s>1469:A,m<3294:zm,s<1435:R,mcb} +dmf{m<3734:A,A} +zl{m<3721:zf,A} +hvh{x<1599:fcp,a>256:xth,x<2400:nn,bpx} +sf{x>1556:ztq,mzl} +lcq{m>635:mjp,s>2859:A,m>413:R,hbt} +xn{m>2426:jvd,x<858:pfz,mfv} +zgf{a>1378:R,m<1291:ptd,R} +qhv{m>1852:A,m>1719:R,s<3007:R,A} +ph{a<3497:vv,R} +mps{s<2806:zps,kbd} +bz{s>2864:R,A} +ll{s<3917:tkq,x<3703:R,R} +tbl{m<1295:A,A} +tm{s<3029:sl,a>3664:dg,a>3563:crg,dcm} +xxr{x<2995:A,s>1322:R,a>3132:A,A} +kgz{x>2235:R,A} +pfz{x<300:A,R} +pb{m>3682:lpv,A} +ps{m>2481:xvp,x>3501:thv,bk} +dvf{s>3547:shn,hc} +gkh{s>1768:A,s<1736:A,A} +kbd{x>827:A,A} +zhj{s<2126:xlc,a<734:pb,x>1387:qcz,rn} +xg{a<3969:A,m<2656:A,R} +sm{s>2585:A,R} +zhl{a<2775:R,m<712:A,A} +df{x<2518:R,A} +lfn{s<2787:mfc,m<3120:A,bmf} +sdx{m>2324:R,A} +qcz{a>1412:gxd,R} +tq{m>1287:A,m<798:A,s>3148:R,R} +gq{a<2067:R,a>2180:gz,m<2530:R,lbm} +lmv{m>1460:A,A} +jqz{x>800:A,m<2431:R,a<1059:A,A} +hzl{m<3210:A,R} +fqd{s<3517:A,dd} +xpp{m<1921:kfl,x>716:kv,x>273:ntk,vmd} +st{a>2725:R,A} +pd{m<3138:A,x<3799:R,A} +cx{m<2622:cn,x>3616:A,m<3404:zq,dcs} +vkh{s>1912:R,x>2874:R,R} +dpm{a>2728:fr,a<2543:qzb,m>2249:vs,fhh} +zjn{m<1731:R,s>1599:A,A} +dg{s<3279:A,m<899:R,a<3806:lrq,R} +qj{a<2324:A,R} +bm{a<2544:A,m<973:A,m<1233:R,R} +dmm{x>420:R,a<3938:A,m<1567:A,A} +nxd{m>1378:gkl,gps} +fcf{a<3859:R,s>3094:R,A} +km{m<3292:db,s>2311:nlh,x>949:nkt,R} +fz{m>224:A,s>427:A,s>193:R,R} +jgn{x>3689:tqv,a>3896:rhx,ktq} +jcz{m<964:fcc,lmv} +dqt{x>1042:R,A} +xs{x>2301:np,m>2490:A,A} +dnc{a>2667:ltx,R} +pm{m>1660:R,R} +xkx{x<1469:A,s<2105:A,A} +zqk{s>2813:zs,m>2905:xx,a<3613:dzc,cms} +qh{m>2483:R,a<1940:R,A} +nm{a>2194:A,R} +dhl{a>214:R,R} +kr{x>2730:A,A} +nzs{a<3692:R,R} +hc{s<3500:R,jqz} +mt{s<1112:dgs,cs} +jnc{x>2611:A,x>2231:R,R} +txn{x>2227:A,s<2060:R,R} +tvz{a<2131:A,m<3205:R,m<3641:R,A} +bsh{a<439:R,a<528:R,s>2648:A,A} +hb{m<340:pmp,x>1343:smn,R} +gxh{m<1015:A,x<1686:A,x<2151:R,R} +xxf{x>3458:A,x>3396:R,A} +ks{s<3753:A,s<3790:R,a<1055:A,A} +bdb{m>1085:kql,qk} +gkn{s<3173:A,R} +qq{m<1365:R,s>2565:A,m<2907:R,A} +dzc{m<2655:vng,zlb} +hdq{s<878:R,A} +vxm{s>304:A,a>3262:R,a>2961:R,R} +jfr{a<3476:qt,m<2328:tm,a<3734:zqk,nhh} +zzx{m>3167:R,a>2911:R,s>1986:R,R} +cj{s<2777:mkt,m<1946:R,x<2175:A,R} +nlh{m<3735:A,x<878:R,a>3519:R,R} +bs{s<2559:R,s<2678:A,R} +jzx{a<2939:A,A} +mhd{a>3461:lbp,x>1754:dn,R} +bf{x<1514:A,R} +qzg{m>765:R,x<1881:A,m<429:A,A} +tzj{m<3544:A,A} +lt{a>3048:R,s<241:ht,s>399:dk,R} +sjv{s<303:A,A} +gv{x>1712:A,x>1145:R,A} +hx{x>2863:A,A} +bbv{x<3854:xjn,a>2553:A,R} +rd{m>1904:A,a>3229:rb,a>3201:zbq,qzx} +xdc{s<3559:qkk,x<2257:A,R} +jpj{a<2122:pxj,m<815:R,R} +hpx{x<3160:A,R} +vkp{m<3498:vc,kk} +vq{s>3849:A,R} +kc{a<2487:lxs,s>2074:ffm,zzx} +nhj{s<1677:R,x<754:A,kkh} +jmv{s>3095:R,m>2659:A,A} +ngp{x>318:A,R} +rn{m>3717:mv,ld} +rr{x>2077:lcs,a<2564:vp,x<1783:kdm,xd} +vv{m<2492:A,R} +jgs{x<1311:td,x>1970:fkr,lkd} +zbq{x>1251:A,x>741:R,a<3214:R,A} +vr{s>1490:fkj,s>1418:R,a<3021:rdh,A} +js{m>3168:R,m>3015:A,A} +mh{x<676:dxn,s>1709:jzc,nhj} +rv{a>3103:sjv,s<282:kvc,vns} +sg{x>1921:rqz,m<1545:xt,fdx} +bdv{s>3015:A,x>563:R,a<2129:R,A} +kb{a<2399:dnv,a<3059:mmb,m<1918:mrc,gx} +ht{a<2799:A,x>3399:A,A} +vrs{a<3462:A,A} +ch{s<2743:R,m>1149:tfz,m<558:xpr,A} +lrq{x<3098:R,s<3332:R,R} +mzn{s<1938:R,R} +jq{m>2374:A,x<1425:A,R} +nhh{x<3487:gnz,s>3018:jgn,tk} +kqv{a>1168:R,R} +mfv{a>1367:R,a>767:gv,njr} +tn{x<1082:R,s<1473:A,A} +cl{a<2428:cqv,skk} +smn{m<704:R,s>1557:R,A} +vs{s<2752:jtg,A} +ndp{m>1613:R,a>1668:tqk,a>756:A,rtk} +mm{x<2841:A,x>2991:R,R} +gfc{s<2651:A,a>87:A,R} +fc{s<3768:A,x>2927:A,s>3872:R,A} +qd{s<1986:A,a<562:A,R} +vtv{x<2948:cj,s<2996:gq,mfk} +pc{m<2563:R,s>308:R,A} +db{x>1182:R,s>2330:A,R} +lj{a>1208:A,sn} +vxv{s<3093:R,R} +pkk{s<3012:A,m>2572:A,a>3749:R,R} +phs{s<3862:R,m<1390:R,kcm} +xt{m<784:R,s<3171:R,R} +gkl{x>556:A,R} +gvq{a<3510:A,m>3254:A,A} +qx{s<248:jjm,kp} +jjm{x<2448:A,m>2222:A,R} +kt{s>1768:ps,kb} +std{a>1196:R,a>1080:R,a>1034:R,R} +lhp{m<2508:xtc,x>1732:vkp,a>1157:ln,xq} +pxj{m>793:R,a>1699:R,A} +bpf{s<2850:A,A} +fkr{x>2275:A,m<2337:A,x<2147:zls,A} +mv{m>3870:A,m>3778:A,R} +zh{m<1090:rmv,zt} +pj{s>2079:R,gd} +tl{a<3073:A,m>2621:A,lq} +mcb{x>890:A,s<1455:A,R} +nqk{a<2608:A,m<3138:mls,bgh} +sr{m<2392:R,m>2540:A,s<1933:R,A} +jzc{a<2239:ptk,a<3339:A,a>3605:A,zcf} +tfz{x<779:A,a<3380:A,m<1541:A,R} +pvj{x<2020:R,x>2348:A,R} +bv{a<3884:R,x>825:A,A} +hcf{a<3816:jgs,s<2909:rbd,x>1198:sg,nvv} +nl{a>1904:tzv,R} +rl{s>2541:A,m>2863:R,m>2346:A,R} +bg{x>524:R,m>927:R,a>2391:R,R} +xsp{m>2367:zg,a>3232:zp,x>2987:qhv,A} +nv{m>1136:jr,x<974:mn,s<299:qg,bf} +dnv{x<3133:xz,s>1612:cx,fxp} +tv{s<2030:A,A} +bvx{x>3807:A,m<1978:A,a<829:R,kzn} +fg{x>1393:A,s<1322:A,m>3693:A,A} +vn{x>1743:bmx,s>3133:pjc,x>797:rfd,dtf} +sn{a<720:R,m>2407:A,s>2263:R,R} +dn{a>3435:A,A} +pxn{s<3897:A,a<3216:A,R} +bkf{a>800:rzg,hb} +bpx{a<141:A,jhh} +zls{x>2037:R,m>2919:R,A} +xzr{a>1432:A,m>3471:A,m>2878:rqk,R} +png{s<3217:R,A} +lzp{s>2935:lnf,hbj} +fxs{m<2298:A,m>3023:R,A} +rds{x<2136:jcz,gxf} +mc{s>3407:jb,a>1580:tks,dhr} +lh{m<777:A,s>959:A,R} +fq{a>3243:zzg,x<1126:rht,m<680:cl,cpk} +cgs{m<3539:R,R} +dtf{x<432:A,m<2598:zb,A} +sgd{m<377:R,a<1360:A,s>2105:A,A} +fxp{s<1476:A,a>1446:R,A} +cgv{s>2832:A,a>3725:R,a<3721:R,R} +rb{x>1583:R,A} +sxb{s<2865:mhd,a<3463:tgc,s>3096:ngz,cv} +flz{a<3242:A,A} +hf{s<1198:A,m<1745:A,R} +xff{a<2470:R,a<2902:R,brk} +pq{m<1019:R,a<3493:xbh,tcn} +qxh{s<3830:jx,a<3002:xcg,a<3523:pxn,dqt} +ccr{a>1369:A,x<540:ngp,R} +lx{a>3856:R,A} +gls{s>2827:R,x>1450:A,m>760:R,R} +fs{m>2698:hd,m<1866:A,R} +qt{m>1524:xsp,a>3264:bz,x<2990:lcq,ddp} +zsb{s<1967:R,x>1869:txn,s>2038:R,nf} +xz{a>1278:A,A} +brk{s<2250:R,A} +xcg{a>2310:A,x>589:A,m<1935:A,A} +gxd{a>1760:R,x<1932:R,R} +vt{s>2550:R,std} +mjp{a>3129:R,x>2733:R,s<2923:A,R} +zzg{m>522:zrf,x<1493:R,x>2078:ff,A} +fkj{x>1280:R,m>2156:R,A} +jhc{m>746:R,a>1003:A,R} +lz{x<2241:A,x>2443:R,A} +cb{s<3619:cfc,a>1549:mdc,dj} +qm{s<3512:zc,R} +cpk{s<1607:bm,A} +fhh{a>2658:jz,s<2865:R,s>3109:A,R} +tgc{m>1755:A,s<3212:qzg,cp} +cgm{s<2172:pfs,m>3075:R,A} +jgf{a>1369:R,a>1337:A,s>2964:R,R} +cms{m<2570:A,m<2752:vg,m<2837:R,nzs} +jx{x>548:R,m<2561:R,x<242:A,R} +mrc{x<3340:hx,m<1213:rpn,hvc} +mnx{x>791:A,A} +qzx{x>1193:A,R} +mdc{x<3104:jdd,x<3684:hjb,phs} +cf{m<2776:vr,x<1619:fnq,s<1471:dnf,sd} +ds{a<815:A,tq} +vmd{s>3862:bj,qb} +mfc{m>3159:R,s>2590:A,s<2498:A,A} +jrk{m<3157:sp,zhj} +vng{m>2487:R,a<3537:A,R} +pjc{s<3295:R,x>730:cz,R} +pp{m>1152:R,a>708:R,A} +lkd{a<3716:A,a>3760:bcs,a>3739:pkk,cgv} +tks{a<2969:pxf,x>2465:jfr,a<3555:gp,hcf} +mp{x>1865:A,R} +jbz{a<220:A,A} +ltx{x<3669:A,m<611:R,R} +fb{x>527:R,m<1341:A,a<2542:R,th} +gzj{a<3308:A,R} +kbg{a<2673:A,x>3099:A,R} +rtk{x<1207:R,s<322:R,m>673:R,A} +jd{s<1420:kbg,sxd} +bxz{m<2876:R,R} +dfs{a<3210:A,x>3369:R,x<3277:A,A} +np{a>2152:R,A} +hbt{x<2680:R,a<3145:R,R} +tx{a>3904:R,m>746:A,a>3848:R,R} +fdx{x<1567:vxv,a<3936:ktv,jmv} +mjv{m<2079:A,a>2843:A,x>3591:A,qhp} +zps{m>3233:A,m<2936:R,A} +vm{s<1569:tn,bdb} +pch{m<1670:sms,a>1946:dm,jrk} +br{x>3300:zxx,R} +zf{s>242:A,R} +ntk{s<3864:R,jhz} +hs{s>2686:gls,x>1247:A,tx} +xth{m<1407:bsh,a>466:hpx,xf} +kv{m>2674:kqv,m<2325:A,x<1277:rzt,lhz} +hfh{s<3895:A,A} +lxc{x<1519:jjt,s<2121:zn,x<2064:bpq,nqk} +xvp{a<1815:pj,cgm} +rbd{m<1497:hs,dv} +pdn{a<3048:st,s>1293:mj,s<1267:A,R} +pxt{m<1410:R,dx} +lg{s>413:A,s<242:A,a<1899:A,R} +bgh{s>2275:A,R} +gr{x<1477:R,R} +bj{a>787:R,m<3108:A,s<3930:A,R} +zs{m<3026:dfv,x>3208:R,s<3193:gt,R} +vg{x<3353:R,s<2614:R,x<3633:R,R} +lpv{s>2284:A,m<3804:A,s<2215:A,R} +frf{a<1568:R,pf} +lhz{x>1406:A,s>3831:R,m>2485:A,R} +kfl{s>3825:hfh,x<675:ks,x>1039:A,pp} +bmf{a<1331:A,R} +sms{s>2156:sf,a>1737:rpb,a>748:lcp,zh} +qb{s>3774:R,s<3744:A,s>3763:R,R} +ggl{a>648:R,a>619:A,pm} +pn{a>2902:A,s<1543:R,A} +fkp{a>782:R,zcb} +kgt{a<2588:pvj,m<2228:A,sr} +fh{m<3554:R,A} +ktl{s<3936:A,A} +pxf{a>2341:dpm,x>1629:vtv,nxd} +zb{m>1090:R,x<661:A,s<2926:A,A} +bk{m>1591:hrf,m>843:frf,x<3052:nlx,br} +xv{s<419:A,x<508:R,R} +ngz{s>3296:fvk,A} +jp{x<1768:R,m<1125:R,a<3381:R,R} +rzh{s>2837:R,m>1393:A,A} +dcs{a>1227:A,x<3362:R,R} +fcc{m>419:A,m>228:A,A} +ddp{a>3072:A,R} +chk{x>988:R,lrb} +bcs{a<3795:A,R} +nq{x<2015:R,s>362:R,m<203:A,R} +jhh{a<214:A,A} +crg{a>3600:A,x>3090:sj,x<2861:R,R} +gt{m>3484:A,R} +jr{s>251:A,x<711:A,R} +sp{s>2177:lj,x<890:fkp,a<1241:hgz,zsb} +ntz{s>2967:R,x>686:R,A} +lk{x<1915:ndp,x>2905:rks,a>1647:fd,qx} +mr{a<3298:A,a<3316:kls,crs} +dfv{a<3566:A,x>3241:A,a>3665:A,R} +ncf{a>1373:R,a>908:R,R} +dd{m>2969:A,s>3581:R,R} +vxx{a<251:R,A} +hgz{s>1957:kh,a<472:sdx,m<2611:A,R} +jdd{a<2697:fc,m<1777:A,glg} +xq{a>1074:chk,a<1022:mps,xhj} +ts{x>3265:A,m<3294:R,A} +zc{s>3447:A,s>3429:R,m<2140:A,R} +bx{x<3604:xxf,a<484:fxs,R} +hjb{s>3819:A,x<3453:R,x<3591:kz,A} +njr{x>1531:A,s<1460:R,R} +lhx{a<2491:mt,m>1715:dl,s<1110:rds,sz} +jlp{m>455:R,s<3610:R,R} +rhx{m<2943:A,R} +ptn{a<2505:lk,m<2031:lbz,cxv} +ndq{s<2335:R,R} +ng{s>2739:A,x>3185:A,R} +lbp{s<2669:R,m<1543:R,x>1794:R,R} +zxx{m>350:A,s>2187:A,x<3431:A,R} +hqq{a<808:A,s>2584:ms,A} +czc{x<1439:R,R} +pf{s>2070:A,a>2463:R,m<1154:R,A} +mfk{a<1948:R,png} +vns{m<2846:R,s>422:R,A} +jmk{x<2178:A,a>3930:R,A} +ss{s>1952:R,x>1315:A,A} +bc{x<1955:A,a>119:R,m<1469:A,R} +kvc{a>2746:R,a>2606:A,R} +ptd{x<1467:A,x<2037:A,A} +svb{s>1963:md,dhh} +zmc{s>1542:lx,m<3249:R,a>3822:R,dmf} +dcm{x>3146:sv,x>2890:R,bsv} +dnf{m<3282:R,s>1413:A,fh} +qg{m<1048:R,s>179:A,R} +tf{x>2891:A,A} +pg{s>3693:qxh,m<2372:fb,fqd} +sxd{x>3164:R,A} +lgh{m>2281:R,A} +fnq{s<1485:A,a<3295:pn,A} +jb{x<1564:hm,x>2605:cb,rr} +sz{s<1235:pq,m>756:lnz,pdn} +zt{x<1498:R,a>306:qd,a<198:bc,A} +fvk{a<3520:A,R} +mfn{x<2646:A,A} +gfp{s>2804:jp,s<2578:bt,A} +jmb{a<3416:R,R} +tzv{a<2166:R,m<2437:A,R} +vc{a<1314:R,a<1410:jgf,a>1491:A,A} +vk{m<995:A,m<1328:R,R} +pt{m>1440:R,x>1184:A,m<1238:A,A} +txb{s>1786:zz,x<172:R,s<1766:A,qh} +llc{s>1503:R,s>1417:A,x>2946:R,R} +tj{x>1826:A,a>2662:A,A} +xh{s<1993:R,a>1164:R,R} +jzf{x>3174:A,x<2760:A,A} +zn{a<2350:tvz,x<2058:bb,A} +pfs{x<3298:R,s>1993:R,R} +pmp{a<531:A,R} +xtc{x<1755:lcn,s>2778:jnc,vt} +kql{s>1670:A,R} +ktq{s<3229:A,s<3320:A,m<3284:A,A} +zcf{a>3429:R,m<2504:A,R} +kz{m>1758:A,A} +gps{a>1924:bdv,s<2811:bs,R} +ms{a<887:R,A} +sh{m>1213:A,m<628:R,a<278:A,A} +jtg{a<2615:A,x<1428:R,A} +qkk{s<3538:R,A} +sj{a>3576:A,s>3252:R,x>3403:A,R} +lnz{x>2017:flz,a>3320:R,a<3030:R,R} +svk{s<1269:A,x<2459:fg,x>3335:R,xxr} +dk{x>3445:A,m>2894:A,a>2714:R,A} +ck{a>820:R,s<1878:R,A} +mzl{m<1102:qj,x<626:rcn,s<2282:A,pt} +cm{m>2496:R,A} +in{s<2403:pxm,mc} +mgr{x>1261:A,s<2247:A,s>2332:R,R} +rpb{x<1235:gf,a>3150:svb,xlg} +rzt{s<3861:R,R} +fcp{a<391:sm,x>658:R,x<235:A,R} +mz{a>3217:R,x<568:pc,a<2806:R,R} +gnz{m>3220:R,x>3030:bpf,m>2804:R,kr} +lcn{a<1364:bfc,x>713:mx,R} +ld{a>1185:R,A} +tk{x<3736:hzl,a>3880:R,x<3854:pd,A} +qst{s<1649:R,x>1581:A,s>1662:R,A} +zzn{s>1422:lb,a>2822:ts,A} +sq{a>2419:cf,xn} +dl{s<1027:hdq,m<3118:jmb,s>1207:svk,cgs} +dgs{s>933:R,a>1219:hmn,R} +tcn{m<1316:R,A} +dx{m<2691:R,R} +mj{a>3607:R,a<3295:R,R} +cp{x>1744:R,R} +gp{a<3265:xtn,a<3409:vlr,x<874:vj,sxb} +ffm{m<2925:A,tzj} +sv{x<3623:R,x<3865:A,x>3953:A,A} +vjh{s<696:ptn,lhx} +kh{m<2223:A,x>1640:A,R} +sl{x>3116:R,m<1100:A,m<1681:mm,tf} +jv{x>3205:R,A} +rf{a<2331:tzd,s<1687:kqp,lf} +zg{m>3278:A,m<2822:R,x>3249:R,R} +nkt{m<3763:R,a<3625:R,a>3767:R,R} +lcp{m<816:nk,s<2030:zgf,cq} +hvc{x<3758:pvh,m<1480:A,s<1575:R,A} +rks{x<3595:R,m<2372:A,A} +lrb{x<621:A,x<843:A,x>898:A,A} +zx{m>2405:A,x>1653:R,bmg} +nnf{m>536:A,A} +bfc{x<991:A,R} +hd{a>2374:R,R} +zrf{x<1430:R,A} +qk{m<1019:R,x<994:R,m<1047:R,A} +bsv{s<3158:R,x<2672:R,a>3513:R,A} +ff{x<2379:A,A} +pxm{s<1369:vjh,x>2564:kt,s>1811:pch,hsx} +gxf{a>3398:A,x<3277:bq,lh} +kls{m<1031:A,s>2876:R,s>2644:A,R} +qqh{x<3795:A,R} +nvv{s<3241:znz,bnl} +cqk{s<3859:R,ncf} +jjt{s<2037:ss,mgr} +qzb{s>2804:R,df} +rht{s>1650:R,bg} +rmv{a<459:A,m>488:A,A} +bmx{m>1850:A,sh} +ptk{m>2955:R,R} +tg{x<3192:llc,a>3346:R,x<3633:dfs,qqh} +bnl{s>3326:dmm,m>2318:jc,a<3895:R,R} +cfc{x<3480:qm,a<1363:bvx,x<3745:mjv,bbv} +xlp{x>460:A,m<2590:rzh,R} +bb{s<1924:R,A} +shq{x>1246:A,a>3207:tpb,x<826:xv,jzx} +lp{s>1698:R,a<1429:R,R} +kkh{a<1643:A,A} +rzg{s<1629:sdm,a>1245:lp,a>1083:R,A} +xgv{x<2900:R,xb} +bh{m>2126:R,s<1916:A,x>3791:A,A} +cs{s>1272:mfn,a<1174:hf,R} +lbz{m<921:jg,x>2079:xgv,m<1295:nv,shq} +lxg{x<826:R,A} +rdh{x>982:R,A} +kcm{x>3875:A,m>2918:A,m>2407:A,R} +rqz{a<3893:A,m>1449:jmk,x>2106:A,A} +vl{x>3363:zjn,x>3065:jv,A} +tt{x>1484:R,m>2484:A,a<1512:A,A} +dhr{a<597:xrs,a>941:lhp,lzp} +crs{a>3323:R,m>1119:A,x>1452:R,A} +rcn{m>1445:R,x>347:A,a>1485:A,R} +tzd{x<1859:tt,A} +lcs{s>3607:cqk,s<3524:xs,xdc} +tqk{x>1006:R,a<2151:A,A} +tpb{a>3497:R,A} +xj{a<3083:A,m>1619:R,x<1091:A,gxh} +xd{x>1933:pxt,mfl} +fd{x<2466:cm,a>2195:R,x<2715:lg,R} +xb{m<1347:A,A} +mkt{x>2312:A,R} +vj{x<379:tp,x>561:thj,xlp} + +{x=380,m=329,a=917,s=255} +{x=486,m=681,a=11,s=452} +{x=893,m=376,a=51,s=1662} +{x=1223,m=1194,a=1038,s=92} +{x=267,m=299,a=9,s=2591} +{x=65,m=557,a=1437,s=1063} +{x=1147,m=46,a=258,s=1255} +{x=198,m=1186,a=151,s=291} +{x=2758,m=1247,a=177,s=616} +{x=470,m=1001,a=876,s=79} +{x=704,m=2422,a=1273,s=2345} +{x=927,m=2901,a=95,s=2889} +{x=1241,m=221,a=1151,s=444} +{x=1604,m=1310,a=58,s=160} +{x=229,m=438,a=548,s=733} +{x=1024,m=946,a=406,s=1582} +{x=1083,m=277,a=1599,s=1926} +{x=472,m=612,a=638,s=925} +{x=1344,m=833,a=276,s=2381} +{x=6,m=2045,a=1033,s=3120} +{x=1204,m=699,a=1281,s=310} +{x=262,m=689,a=314,s=2847} +{x=526,m=107,a=1469,s=1423} +{x=475,m=723,a=485,s=1011} +{x=114,m=1049,a=2058,s=885} +{x=254,m=1238,a=401,s=1120} +{x=1259,m=1158,a=113,s=889} +{x=802,m=43,a=1178,s=1081} +{x=93,m=1964,a=849,s=27} +{x=1657,m=24,a=480,s=94} +{x=609,m=198,a=2318,s=682} +{x=341,m=435,a=228,s=347} +{x=3411,m=15,a=739,s=575} +{x=360,m=2780,a=322,s=3534} +{x=106,m=295,a=3151,s=993} +{x=121,m=292,a=24,s=1042} +{x=464,m=246,a=377,s=662} +{x=1060,m=919,a=992,s=631} +{x=562,m=1532,a=1579,s=2957} +{x=484,m=61,a=500,s=1107} +{x=551,m=2370,a=515,s=146} +{x=370,m=248,a=519,s=1796} +{x=1945,m=299,a=49,s=921} +{x=2324,m=2780,a=2268,s=17} +{x=267,m=223,a=871,s=786} +{x=66,m=3536,a=1272,s=446} +{x=1450,m=591,a=14,s=1961} +{x=1107,m=1181,a=2033,s=451} +{x=1197,m=519,a=1782,s=561} +{x=1174,m=548,a=1494,s=123} +{x=496,m=3050,a=812,s=407} +{x=2824,m=638,a=2378,s=508} +{x=1215,m=1033,a=1816,s=607} +{x=768,m=2648,a=2255,s=1314} +{x=1518,m=2155,a=2,s=1036} +{x=1923,m=83,a=661,s=409} +{x=2019,m=850,a=1935,s=477} +{x=27,m=1351,a=1634,s=530} +{x=488,m=356,a=310,s=16} +{x=1321,m=533,a=814,s=519} +{x=393,m=625,a=3304,s=1848} +{x=1286,m=111,a=1070,s=1201} +{x=991,m=704,a=195,s=2104} +{x=3191,m=42,a=888,s=195} +{x=13,m=2580,a=1811,s=417} +{x=27,m=373,a=126,s=559} +{x=280,m=1062,a=681,s=445} +{x=894,m=1350,a=670,s=3477} +{x=100,m=290,a=236,s=255} +{x=1809,m=2398,a=239,s=1972} +{x=678,m=222,a=1015,s=990} +{x=1821,m=547,a=46,s=142} +{x=852,m=316,a=3201,s=43} +{x=19,m=1365,a=49,s=1051} +{x=451,m=302,a=2964,s=591} +{x=1505,m=1563,a=565,s=38} +{x=1799,m=299,a=241,s=475} +{x=157,m=1206,a=341,s=30} +{x=2577,m=893,a=2531,s=1317} +{x=499,m=1354,a=613,s=1068} +{x=3862,m=302,a=640,s=681} +{x=22,m=1499,a=2658,s=837} +{x=1168,m=2431,a=36,s=1560} +{x=982,m=954,a=523,s=506} +{x=637,m=1894,a=1012,s=47} +{x=2671,m=53,a=164,s=2067} +{x=87,m=1059,a=3603,s=1182} +{x=144,m=506,a=3266,s=292} +{x=25,m=1339,a=2362,s=567} +{x=2684,m=286,a=287,s=16} +{x=493,m=1200,a=1136,s=549} +{x=115,m=2243,a=1228,s=1609} +{x=1142,m=155,a=2571,s=2808} +{x=1129,m=66,a=1762,s=1055} +{x=2105,m=1083,a=579,s=286} +{x=90,m=1196,a=1372,s=2115} +{x=198,m=2277,a=794,s=1768} +{x=87,m=2331,a=707,s=654} +{x=2068,m=112,a=230,s=1648} +{x=612,m=716,a=66,s=124} +{x=1935,m=256,a=2203,s=251} +{x=2117,m=1,a=71,s=255} +{x=1244,m=842,a=1714,s=1013} +{x=91,m=186,a=909,s=3282} +{x=1062,m=614,a=285,s=2007} +{x=1414,m=1555,a=781,s=3500} +{x=109,m=568,a=1996,s=50} +{x=96,m=1032,a=876,s=1297} +{x=2351,m=516,a=2179,s=89} +{x=385,m=1162,a=1858,s=6} +{x=1035,m=8,a=27,s=2352} +{x=1604,m=201,a=14,s=273} +{x=5,m=304,a=809,s=170} +{x=1806,m=690,a=87,s=1015} +{x=1277,m=609,a=2236,s=3938} +{x=1687,m=834,a=2969,s=28} +{x=288,m=1255,a=457,s=60} +{x=363,m=2289,a=333,s=1596} +{x=334,m=233,a=1967,s=806} +{x=239,m=23,a=1101,s=1689} +{x=536,m=1102,a=317,s=3} +{x=710,m=755,a=206,s=2276} +{x=458,m=2985,a=20,s=2107} +{x=1582,m=785,a=594,s=888} +{x=188,m=3154,a=337,s=1770} +{x=148,m=1575,a=2032,s=434} +{x=1240,m=134,a=431,s=2672} +{x=884,m=539,a=1963,s=206} +{x=1418,m=1822,a=3680,s=261} +{x=1240,m=1333,a=901,s=248} +{x=601,m=3123,a=1399,s=374} +{x=314,m=63,a=325,s=256} +{x=911,m=1106,a=146,s=70} +{x=1003,m=3328,a=608,s=1374} +{x=180,m=415,a=2814,s=1821} +{x=330,m=411,a=982,s=1378} +{x=3315,m=8,a=505,s=2292} +{x=312,m=2130,a=168,s=574} +{x=690,m=762,a=348,s=691} +{x=1483,m=81,a=2107,s=16} +{x=1390,m=60,a=1620,s=3} +{x=1612,m=38,a=776,s=1259} +{x=138,m=12,a=145,s=1061} +{x=350,m=571,a=22,s=1209} +{x=488,m=1476,a=1086,s=1916} +{x=1223,m=3412,a=1776,s=1521} +{x=1509,m=11,a=1185,s=756} +{x=14,m=965,a=350,s=3055} +{x=342,m=38,a=1161,s=818} +{x=1423,m=745,a=613,s=365} +{x=552,m=508,a=1445,s=2403} +{x=54,m=543,a=1924,s=157} +{x=172,m=59,a=1575,s=1378} +{x=2066,m=818,a=2385,s=1163} +{x=2368,m=1694,a=465,s=1568} +{x=1266,m=133,a=2497,s=240} +{x=663,m=683,a=2924,s=2232} +{x=537,m=1355,a=187,s=1305} +{x=2555,m=2010,a=177,s=845} +{x=1065,m=209,a=49,s=264} +{x=840,m=102,a=2234,s=2890} +{x=137,m=144,a=1454,s=5} +{x=39,m=63,a=2040,s=281} +{x=92,m=331,a=3823,s=1301} +{x=1017,m=2377,a=147,s=2734} +{x=2217,m=1176,a=1067,s=704} +{x=2061,m=1184,a=1660,s=375} +{x=580,m=3270,a=1203,s=637} +{x=1445,m=1059,a=181,s=1158} +{x=374,m=311,a=206,s=76} +{x=2672,m=2024,a=441,s=2436} +{x=63,m=32,a=26,s=3041} +{x=579,m=603,a=129,s=195} +{x=2619,m=235,a=867,s=730} +{x=452,m=250,a=1665,s=1948} +{x=1592,m=117,a=2253,s=1474} +{x=567,m=1601,a=559,s=263} +{x=3698,m=156,a=115,s=3232} +{x=149,m=1580,a=302,s=61} +{x=165,m=702,a=2321,s=822} +{x=1158,m=991,a=1549,s=1155} +{x=793,m=689,a=1205,s=2663} +{x=81,m=1059,a=1142,s=1921} +{x=1414,m=946,a=860,s=1350} +{x=1521,m=1125,a=359,s=1496} +{x=250,m=1164,a=3446,s=594} +{x=1580,m=41,a=164,s=130} +{x=2469,m=1196,a=1060,s=472} +{x=98,m=1444,a=1226,s=2154} +{x=86,m=1948,a=1124,s=1944} +{x=1592,m=618,a=1459,s=22} +{x=866,m=1120,a=1696,s=508} +{x=371,m=1236,a=1553,s=1166} +{x=2679,m=2544,a=1114,s=2995} +{x=761,m=1377,a=1002,s=24} +{x=2122,m=2991,a=883,s=75} +{x=685,m=687,a=516,s=214} +{x=1014,m=1270,a=263,s=1107} +{x=153,m=209,a=16,s=946} +{x=1529,m=191,a=865,s=2634} diff --git a/19/input_test b/19/input_test new file mode 100644 index 0000000..e5b5d64 --- /dev/null +++ b/19/input_test @@ -0,0 +1,17 @@ +px{a<2006:qkq,m>2090:A,rfg} +pv{a>1716:R,A} +lnx{m>1548:A,A} +rfg{s<537:gd,x>2440:R,A} +qs{s>3448:A,lnx} +qkq{x<1416:A,crn} +crn{x>2662:A,R} +in{s<1351:px,qqz} +qqz{s>2770:qs,m<1801:hdj,R} +gd{a>3333:R,R} +hdj{m>838:A,pv} + +{x=787,m=2655,a=1222,s=2876} +{x=1679,m=44,a=2067,s=496} +{x=2036,m=264,a=79,s=2244} +{x=2461,m=1339,a=466,s=291} +{x=2127,m=1623,a=2188,s=1013} diff --git a/19/main_part1.s b/19/main_part1.s new file mode 100644 index 0000000..38bd538 --- /dev/null +++ b/19/main_part1.s @@ -0,0 +1,304 @@ +%include "utils.s" + +global _start +[bits 32] +[section .text] + +%define FILENAME "input" +;%define FILENAME "input_test" + +_start: + +mov esi, file +load_rule: +xor ebx, ebx ; id +.get_id: +lodsb +cmp al, '{' +je .got_id +shl ebx, 8 +mov bl, al ; add new byte +jmp .get_id +.got_id: +call id_to_idx ; idx in EDX +shl edx, 4 ; *16 +lea edi, [rules+edx] ; rule ptr +.get_rules: +; --- rule format --- +; [ 16 ] +; [ 4 ][ 4 ][ 4 ][ 4 ] +; [ 2 ] [ 2 ][ 2 ] [ 2 ][ 2 ] [ 2 ][ 2 ] [ 2 ] +; [bound] [ vdr ][bound] [ vdr ][bound] [ vdr ][bound] [ vdr ] + +; var, dir, & res +; FEDCBA9876543210 +; --- var --- 76543210 +; ...............1 -> Always +; .............00. -> a (ASCII .1100...) +; .............01. -> m (ASCII .1101...) +; .............10. -> s (ASCII .1110...) +; .............11. -> x (ASCII .1111...) +; --- dir --- +; ............0... -> < (ASCII .0....0.) +; ............1... -> > (ASCII .0....1.) +; --- res --- +; 111111111111.... -> R (ASCII .10....0 bit 0 - 1 -> ..111) +; 000000000000.... -> A (ASCII .10....1 bit 0 - 1 -> ..000) +; NNNNNNNNNNNN.... -> eval + +xor ecx, ecx ; output vdr & bound +xor eax, eax ; input byte +lodsb ; lowercase alpha or RA +bt ax, 5 ; low for RA, high for alpha +jc .alpha +; immediately finish with R or A +or cx, 1 ; Always +and ax, 1 ; bit 0 of ASCII +dec ax ; R -> -1, A -> 0 +shl ax, 4 ; correct position +or cx, ax +jmp .done +.alpha: ; either [xmas][><] or a multi-char ID +mov ebx, eax ; save last input +lodsb ; next byte +bt ax, 6 ; bit 6 low for >< +jnc .is_check +; immediately finish by evaluating ID +.imm_got_id_byte: +shl ebx, 8 +mov bl, al +.imm_get_full_id: +lodsb +cmp al, ',' ; ends , or } +je .imm_got_id +cmp al, '}' +jne .imm_got_id_byte +.imm_got_id: +call id_to_idx ; idx in EDX +or cx, 1 ; out.var <- Always +shl edx, 4 ; correct position +or cx, dx ; out.res <- idx +jmp .done +.is_check: +and bx, 3<<3 +shr bx, 2 +or cx, bx ; out.var <- bits 3&4 of last +and ax, 1<<1 +shl ax, 2 +or cx, ax ; out.dir <- bit 1 of ASCII +call dec_parse +mov bx, cx +mov cx, ax +shl ecx, 16 +mov cx, bx ; out.bound <- parse_dec +; parse_dec skips the : so get the res +lodsb +bt ax, 5 +jc .chk_id +; res is R or A +and ax, 1 +dec ax +shl ax, 4 +or cx, ax ; out.res <- bit 0 of ASCII - 1 +jmp .done +.chk_id: ; res is ID +xor ebx, ebx +jmp .chk_got_id_byte +.chk_next_byte: +lodsb +cmp al, ',' ; ends , +je .chk_got_id +.chk_got_id_byte: +shl ebx, 8 +mov bl, al +jmp .chk_next_byte +.chk_got_id: +call id_to_idx ; idx in EDX +shl edx, 4 +or cx, dx ; out.res <- idx +.done: +mov eax, ecx +stosd +cmp byte [esi-1], ',' +je .get_rules +cmp byte [esi], ',' +je .next_rule +cmp byte [esi-1], '}' +je .next_line +cmp byte [esi], '}' +je .next_line +cmp byte [esi-1], 10 +je .check_rules_over +call newline +.wtf: p_string wtf +jmp .wtf +.next_rule: +inc esi +jmp .get_rules +.next_line: +lodsb +cmp al, 10 ; \n +jne .next_line +.check_rules_over: +cmp byte [esi], 10 +jne load_rule + +rules_over: +mov eax, [next_rule_idx] +dec eax +call print_dec +call newline + +; find rule 'in' +mov ebx, 'ni' +call id_to_idx +mov [in_idx], edx +mov eax, edx +call print_dec +call space +shl edx, 4 +movzx eax, word [rules+edx] +call print_dec +call space +movzx eax, word [rules+edx+2] +call print_dec +call newline + +; we're now reading in the inputs to test +; find the next { +proc_next_input: +mov ecx, 32 +mov al, '{' +xchg edi, esi +repne scasb +xchg edi, esi +cmp esi, file.over +jae game_over +; get 4 nums, x m a s (ecx edx edi ebp) +.get_x: +call dec_parse +jc .get_x +mov ecx, eax +.get_m: +call dec_parse +jc .get_m +mov edx, eax +.get_a: +call dec_parse +jc .get_a +mov edi, eax +.get_s: +call dec_parse +jc .get_s +mov ebp, eax +; go through the rules +push esi +mov ebx, [in_idx] +call check_rule +add ecx, edx +add ecx, edi +add ecx, ebp +not eax +movzx eax, al +test eax, eax +cmovnz eax, ecx +add [final_value], eax +pop esi +jmp proc_next_input + + + +; rule idx in EBX, xmas in ecx edx edi ebp +; return in EAX +check_rule: +sub esp, 4 +.inner: +shl ebx, 4 +lea esi, [rules+ebx] ; rule ptr +mov [esp], esi +.next_rule: +mov esi, [esp] +lodsd ; rule +mov [esp], esi +bt ax, 0 ; always +jc .always +; .............00. -> a +; .............01. -> m +; .............10. -> s +; .............11. -> x +; ............0... -> < +; ............1... -> > +mov esi, eax +mov ebx, eax +and bl, 0b110 ; var +cmp bl, 0b000 +cmove eax, edi +cmp bl, 0b010 +cmove eax, edx +cmp bl, 0b100 +cmove eax, ebp +cmp bl, 0b110 +cmove eax, ecx +mov ebx, esi +shr ebx, 16 ; rule.bound +bt esi, 3 ; rule.dir +jnc .less +cmp eax, ebx +jg .match +jmp .next_rule +.less: +cmp eax, ebx +jge .next_rule +.match: +mov eax, esi +.always: +shr ax, 4 ; rule.res +test ax, ax +jz .return_res +cmp ax, 0x0FFF +je .return_res +; nested rule +movzx ebx, ax +jmp .inner +.return_res: +movzx eax, ax +add esp, 4 +ret + + + +game_over: +mov eax, [final_value] +call print_dec +call newline +jmp exit + +; ID in EBX, IDX return in EDX +id_to_idx: +xor edx, edx +.test: +cmp [rule_idx_to_id+edx*4], ebx +je .found +inc edx +cmp edx, [next_rule_idx] +jb .test +; new ID +mov [rule_idx_to_id+edx*4], ebx +inc dword [next_rule_idx] +.found: +ret + +[section .data] +next_rule_idx: dd 1 +final_value: dd 0 +in_idx: dd 0 +file: incbin FILENAME +.over: + +[section .bss] +rule_idx_to_id: resd 1024 +rules: resd 1024*4 + +[section .rodata] +wtf: db "WTF" +.over: diff --git a/19/utils.s b/19/utils.s new file mode 100644 index 0000000..b2ede43 --- /dev/null +++ b/19/utils.s @@ -0,0 +1,285 @@ +[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