From 9dd81486334f1cb92a1b4b32114fbf7ec3a919b9 Mon Sep 17 00:00:00 2001 From: FReenen Date: Mon, 16 Sep 2024 00:38:39 +0200 Subject: [PATCH] add assignment 7 and finish verslag --- assignment_assembly/assignment7/main.c | 30 +++ assignment_assembly/assignment7/power.asm | 44 +++++ assignment_assembly/assignment7/result.png | Bin 0 -> 42918 bytes assignment_assembly/readme.md | 219 ++++++++++++++++++--- 4 files changed, 265 insertions(+), 28 deletions(-) create mode 100644 assignment_assembly/assignment7/main.c create mode 100644 assignment_assembly/assignment7/power.asm create mode 100644 assignment_assembly/assignment7/result.png diff --git a/assignment_assembly/assignment7/main.c b/assignment_assembly/assignment7/main.c new file mode 100644 index 0000000..5e209bd --- /dev/null +++ b/assignment_assembly/assignment7/main.c @@ -0,0 +1,30 @@ +#include + +unsigned int multiply(unsigned int a, unsigned int b); +unsigned int power(unsigned int n, unsigned int m); + +int main() +{ + extern void initialise_monitor_handles(void); + initialise_monitor_handles(); + + unsigned int n[] = {0, 1, 0, 1, 2000, 2 , 7, 4294967295u, 3 }; + unsigned int m[] = {0, 0, 1, 1, 2, 31 , 11, 1 , 20 }; + unsigned int r[] = {1, 1, 0, 1, 4000000, 0x80000000u, 1977326743, 4294967295u, 3486784401u}; + + for (size_t i = 0; i != sizeof(n)/sizeof(n[0]); i++) + { + printf("%u ^ %u: ", n[i], m[i]); + unsigned int result = power(n[i], m[i]); + unsigned int correct = r[i]; + if (result != correct) + { + printf("Failed, function returned %u but the correct answer is %u\n", result, correct); + } + else + { + printf("Passed, %u\n", result); + } + } + return 0; +} diff --git a/assignment_assembly/assignment7/power.asm b/assignment_assembly/assignment7/power.asm new file mode 100644 index 0000000..53ef4d8 --- /dev/null +++ b/assignment_assembly/assignment7/power.asm @@ -0,0 +1,44 @@ + .cpu cortex-m4 + .thumb + .syntax unified + .globl power + .text + .thumb_func + // R5 = n, R6 = m, R4 = result (p) +power: + PUSH.N {R4, R5, R6} + SUB.N SP, SP, #4 + STR LR, [SP, #0] // push LR to the stack + MOVS.N R4, #1 // set result to 1 + CMP.N R1, #0 + BEQ.N exit // goto exit if m == 0 + MOVS.N R5, R0 // move n to R5 + MOVS.N R6, R1 // move m to R6 +loop: + CMP.N R6, #1 + BEQ.N exit // goto exit if m == 1 + MOVS.N R3, #1 + ANDS.N R3, R6 // R3 = m & 0x1 + BEQ.N even + MOVS.N R0, R4 + MOVS.N R1, R5 + LDR.N R3, =multiply + BLX.N R3 // p * n + MOVS.N R4, R0 // move multiply result to p +even: + MOVS.N R0, R5 + MOVS.N R1, R5 + LDR.N R3, =multiply + BLX.N R3 // p * n + MOVS.N R5, R0 // move multiply result to n + LSRS.N R6, R6, #1 // m = m >> 1 + B.N loop +exit: + MOVS.N R0, R4 + MOVS.N R1, R5 + LDR.N R3, =multiply + BLX.N R3 // p * n + LDR LR, [SP, #0] // pop LR from the stack + ADD.N SP, SP, #4 + POP.N {R4, R5, R6} + BX.N LR diff --git a/assignment_assembly/assignment7/result.png b/assignment_assembly/assignment7/result.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb71d011dffe134760817eecb64b37760f473c9 GIT binary patch literal 42918 zcmbTeWl&pT+Xfii-K9u@Qrxu^w^Ce+dvSNS65Lz7xE6=v?(XjH?oMD&-}n1=cV>U= z&N470ha~6Zd2YGn4q=M&QfSD;$RH31?TfUyG6)214+24PBEkblO4-rHfnTsrqF+=I zfiG{w@1ekbB4-H=XB9hBXE#Gf6Ofs$os9{Tld+?TiLH~lo%1JOu(PsrQm}LIbMo?Ya#4s$sHj#c{3rr}C_rDtMO59> zPSV{pROU(g+YJ$7E8%eA2+msX=bG*_W}lqKwQOu=`7Kwyw!4_3i(MG#!@V{nl~n8e zLxsBrc-w`dDUqlfc`(I~9t9LKsP7}6Gk~8p4mfNFdZ@ro16D#*_}mEtYy8D)jvwBVcb4`Y@sO%eLtzUaH5!Qu85DWFQ z8lP?aNL@MHzXsD6$il!tgfy#Va7xd$lAJ8saVyb#zqUxHjxdE={-!xDS|>J zyD%~|RH6P?X|`rFrT9zcN44+9xVDL8F+C9&j(MgaB4lA^^^Pweg=u(HWDj*n_e@tz zqB{pr;EC*~-CBRBOua*NC$#VBfi>olaX5<6@`S+YAoaAHjZxg(l1TR$;odVwpQV4w z)=nA=4mEWSjv)>_)BTkDwI3ahK148781$6^>*5jzyY9SWf1B1&sg_>6eFW?=nG-ws zld`5Rz^q6)7G(qz`%a_+s@{H(T?f4d9mLAPA;#wB=KPZVuF2&Hg!8KGjhKP0}|3-J=> zN}~3ItBfgreZjiA!V6zmB7Q&Trf{+%Waw~@?k!#?jo22G*H~@X?ob^}9+yj{Cxo#b zS>n`B&gwWokymK8rFQ{Sy1o-pQ^SdRviyl$MbZ7D88aj~nQ*39LSI(W^)C2)u-;!7 zga~Wz;u2I+!l2jU4%Lpb!MPRx^sRqphEspKBg6**f`#`kO0)e%XCh}OOqK}MvU=+K zo+sqv_16!-DBrUa6IAGQHqcF949^UjPu5gn(Y)PhHaRl=$Q0TlI3av_V{3FC@iniVl+NS%?6d89Ysiz! z@s9oSxgRw-wb@G&>wv$?07vy2Zt*8a1hoMUm!|Y~LVvGLj4HQ&?gfn!dhf-ld^D^g z#Rua=r`&xMO&jM3G|)7g>!( zq0w>oVxtqL#}T!V{&sYL{H9j(R1&qL(dOClVLrsuH%$D!YPl*@IWx0Hy$8e5OevK1 z@;Ma?Ou1fnH*L&jvn^NY?9%zvnjReeyt)`=U{MEb)#V^-5VSRRA zu6VT+8| z#!k}{cjvoSaFL77`X=1=+tYSCGpIgCZ}E8}8o_iRjrA$lD*@BF}XBH&^mO zE#7$HeC?y+WyG^tiXZJS2H4V?-I2az3gs#XAt&>i;)XXBduG|LwuW@~zlwNwNj=0f zM0_!p%5`VMD7#M>`o3^hj}S2bBQ_%?tnc>N@MeIV5?9&hU!ftMsfhSpe?}odk4^J6 zz9X+H_wwP8BTdkY>=Fs-k6syafgB-1oHQ(`!Rrmm^=vJ~4GYWO(OG=D4~@<7z+kP3 zm;3=SIyxFNq8IqSxVsy3R3UaiLL#p&_wex8^xmKv)8o~BIQ`^*%wuP?U5v-d#U-Jo z#qUe{8NE9gRk-?mh4Kp(qQJugH^=KKPOq+W?b}`u_ zZTNg%qX7VlzJw0;8`@pP^dXrfXP+98t<-9NBNGmNq2sT=^8wo5=H+d{}AYtYt z&_eA*lgH!@RseEj|`G}y|%EM+5ANdpBjh-S7_G4OOahmIFe*`u1^~q(x7pZb_dOeTn zjwJIFN!_1I9WONo(tpSfLqmj}^C2 zTGZ#@#L(-;w*L@J&(W zQrfe?_di}cKD=QP!LeW<1fKs&en0{OiWqJ6iAj61$%La+>xze7oe=|cvFwK#FdxXe zKTovKV97T!I?8rBFGP_r__xdFB{_86OtwGKrDWs4Af~AOH99g9wd`KE-GkvhRc@v4 zF1xi>HS}av)k0IZLic#LR1BNT7Vm@2DlA5Q4&f&c;;rrND*LnZg-T1l9AiO)-|J)` zVVPn=CwxZHXYMk4gL&7HXP*zLoTYZL%%WmqhNiagUs7Rza(+R-k4taeJUNNqWyVFu zA|@{8kuOq>zPWLZiqT<40NtEVqd2CJ_RD8LgHD#3G4fklC(6|r^!WMRcL>MyTfjuq z1qQ=UT;{VaMB=WlX@@7v)t}(+PNVkZh&NX*sgikJaYsf+Ha0hdh0Gw~HY9Udy2sx% z{#v5F&&lEJB4&t*iqqdPuZD$Id&a#wq6rl)t{$BV0rpeIBSHMTGpAWoJYi1Z$-~)F zlotk>(b|dTLW3tC><4IZiT(@MeX7hl{&H$6Dj20nwm*t%QWa_5OJJ{ia-*q+$%XA^ zBD|qzgSGXqz$)`zXDX}^A8y8(1}d7b^;18SatFEc{WUf*3Cqy^Wc)@sYj4rjFAlrf z5ClZ--i6(XE0%yuN~-{;-4tT|*;=4z_P~|X_1!y8o0U-YCZfJh3K)6HVQ_DfVM9BQ zZf{z`KCAJhgKVl3Vy@|f;YD5<;q|dR$Ui8B4wwBj%23rA6_L`uvVPv9Vq`@2d^q4FAlPy&GR2-aZitIhhY`MOkZ1C!}!vbkXZ0M6%aW25))b8|2=F)@l{gM-nI zvZb-K*120Z>C)d$L}3ZN`)`3x?0e9%r6-|V)y1AX*tg6^H(}x^XA^O)`?a|PjIQz)ZzWa zzvbk}e*Sk@U14!>WTfZvS0SrOmqz^Eov4!fe5n$g;F5tj?WhxXs}>m3V-d%oP)(OlqP5Mip~D1F41j2 z=M#j1UB{@$h;QG%0r`)xi4~`HZft8CJ%mSZ;Sv)X9W0vNvC{rJHdU{~94P*?K;`Tw zjQ|vgDCLlNern1*89O8655PJkqtpGLTr6|Nn(H*hRK34UPaP+wqr@QHoh+h(9&QeC z5S0#Y*Q>3}A|EZl^7r%!^f@NeeGkU3`pIl2@6*!ES?H6Zjf8qAnV8UahZ5O7Mm;^e zJaRw-XmNUyDLf#At&-<`n{vUUU*x1^#UcE)PHL{VhjgFVs;U$*fBemtG10{#+!#}D zJ8{u@M=PZTZ){{_P}u!vOzyYh%q$+TBGO;KN;Up9ao%gscG&-*z{{2cWoBg+$oy_; z+yBi_mhf6A4FKU~$Mbs^N#v*R^>s~IF!1s5%@ympZPywjkavCTkIz2Olq<=d$MSbS z5Z1-9D0OTN+k*q8|IC*JH4RQPr&8vjB{>=6Ap|3aF8PB(sU`Wjs zxN=sW{raCWsVQG>ixkZdrdL*U&I3DEx@3<(TbCWu@7yvZ9-Zc^NiD}41}v%J;NURo z@?ykf2=q2aKqXgS*r`@%EoMCuLkEP-?Y_#qw*C&Ll8Wx?>A?j^1uGj{fN<=6xBSZL zYPRA>1H)|k-#YvID{pK50M z%3c-Q70QHlwfFvOl+W{>;asWaAEm$W@@tL$4L$ZROLiaFcZnMAPVlft)^p1%3q>?4!3rRs_?SiRp}oaLr1^61Hf(enBL?{9n#QI zKFb?g)H0#P7$t2;K;LdgdWLSZ!G*$GU|10mF^^^JZBBu_Z%stwC@si*EsxFhWHE+3 z1hp$lyM7`PEz{Qp)w3x%8PUMhG+gYr>(+db_O0(faR6ntgzWkLG^+I(o#JS?CGG^5 zL5~!K`Lgq6jw?tsAU3H&QPSp$m*5|2B5xn-m_xI|a{r77pm6y9)3ZHfl5EWRK--Hp zJJ*^0mfO==s{S-yu_Bd1BKCE?pe`+Nq0*o$yrzZHOuwz*zG6V0=E%t&fPU<62%hU|c4KSpnqOWU8nK$3a0e*ncp=wH;QB{Zm1ntm7M`8miAfj zFN@P9Xk+$x9!T>}h3=4??_t=L_{iC#iCnH^`!wyK4sridZma2x>rfo+T-~IAk56BI z%(J;_TuqaI+}-m((xYK(FhPqvRVLdP8usWZ-8vAW-Pqg zbz&6tc>2=`8A{U^bj)-hUiUv@6!=gf7M$qhpQ0=4?XbwO!khrW{}e@1iG@7bD2BkO z*@n#`DjNH6i1V#n7XfJHGi55jRpxf$anl5x@PSB>R#4~<+~~(d4yvrK-o~q!rWPGZ zY9uo?H6`TDBA>In>`i~Z2U6>Tk{O*vuWcuv#|8zzhRK>0T*vf#V>{3%^lO5_dS6-P zrG0;)8STb|GxWf=wO2>j$pu}C*8@wv21?LFwwzU|Ry!7pnAjy99TG|1Lzf=4Xj$rP z^~=9L0#Gp#pfOr6R-qujm&$!|Hu{@BfL=u|`2Db1Vf^f3wUz|q2RX366wH)REc#YF zk`J+Iso~WGFhKNR5fKr&-`o(DmX;cr_50}=EEmjD$m4ZSO|e^LL$wjw6)I$kXlZH9 zxiBy=g61$u*km9l8%1ra5zvdjm2rH zNN&YrBOS_)$A)n}m2KT(e z!tTjQD5EMuT7~q^{qanPLm3J{W!#mH0bmN@BOK_L*7Ey{bddVmfCHCoz%pB6sH6kf z&od%YmQPl0H+F~v^M#pk3ze-U9ABiB{%Oy3@&!Ah7t!Mu`MCaJ>tIkNncWu^78>gO zZ;67!(^a3=NAcxvOqG@pNpOp2P+s2ng3|`3otyD&8GxX3ty885IXsA?Gx?+3&ey5f z>4}rdVYl|un_HG)bq|L91ReI>yr6?#Kg;v2*0MJE=`%vCGRD-FALF81c76efpLnJu z@bRvrfX}L0jRz2@L7^WHUkklho-O@)GH*c zbp%M?k^Z}O)r-k?Y!ncnP360E{+J3K9u>5o3O%m;Xat3UpfXdWjb0a>7~0@Oe3#(W zA?k~H#PKUF0}6N*Tnnqr(w>FF9Vzm(ky9zd=H^OkNqP?TbKSPpdnDF7@fkHrlR9;@bgJAn~ zXVA~k$Ou|nTYF(?Nt6O}W4k}*;_`A+K>4`ma2f#6HGN#WUr=BBqp6sf-nBNlK!GC3 zIgqLP<%Ne$<&<)@)a2hm1T3KE>=wfZ+h5>QWP{n));^x@!T}OcZZJmgUp1@C?FA%2 zbLqga(dyQ*8OXC4-fM6=CzFi)?Qf}8Y|we4`C##&c(URKT6Q}Z89kb<<-X_}GB(~J z06AOCuLMaUQY)CUNVWBK{`z-Q<%UNz&ty~`7r?n$$PEOH;zv<{5MyQp zPm1IRw|Xn>zJ1k5C3q>ndV>S(l8#=vThm0(ZI*__zhX@~{v}CdIZpR|(ufiM`DSJd zjp{uJI5DLXsLCnOJTQR3bEJc}4va~5M^Z)|{N}{_JldLh3bN%6Rn)c@16_xzE&v~;QyN+grW0mbJB0rJhubd@@n@kjIOG&znX&T-H zNO{QGM55RwSZm$R2#WCV0jA34xFSxv*c@@&fd_)W?MO*U-8fjOd!$7Rb}UhM96Jgr0cx{Q z4X4FfjEcemg_y0o2}Y#&yIr3gkWCI`+fsKyZBi7GT@X}?u>U2@^Lsu%A{30Yjx$-5 zWR&j*r};kUQ}v?m->CtWN2yGPhWZ1I;qut(!D=pootxyELrrzp&Kei8RwVSk%m$b9 zP~9l*_OamvCVlS4fFO9tfVE9Q58TqzG}`7)K!#3WM(ccb0psaf>FH9`9nBBIL586Q;q z?c<**UoiT@V|E4q$06+VBQJv|V58MOCimAX z8W|5SK6e_GY#^MuM#$rdE9mYumJX>=##nFyCz zsKMz?@PmAM^c<76L1&s!B=P-)lJP{Vm6`M50u*S%?;z$O+r|o&h?ipA!R))~kB_*O zfBz0OnT|Zfyf~3E%$34W!j@@qcE2n>x#X6~I(5?6nVNn`t+R;fe!k0cXIqu3a!A;1 zPh{=~G$9MLX0PXO@l3kJ0B%{RvH8TTj|5hwmw+_6u-Z&fYiO6;G@BnHlfK>SM_m8{ z4zH`d{@mM%%evxcb|56~JJfkLx~Sf>xn6Nb67s{gzp|t4v%nb)v2biQ8!`H5>ELp&p^kP?p%W#S1&xQ&*1O6LaoHY310an2KhOmyCd*QGd z?*V)LRV>8ezSF1l!At3zj%YR}=;Ff(lkG}NkR%$(PQ!Y6>oezTVPPQ^JwN=fz9@;X ztzN*z3N$JCW;__K_HZ4e*+6IycTXnJ^Dvpav3VA}>~>}}I5cbT>L^}mtPC`JI(8@{M1A)&Gs6dWcBC&&H|uc(5d5t46b{H zVL&KfQIb=WyZZV*NC`xvqc7CD>7&Cizh_6r2qf?RHcH{>=-gvBU1$Pvb9L>yq5H+U zo0J0b|0hh@94Bg?tu{IL1xm%(GaVFsgE@QY1+Ad?hPHmH>+DjYcl7>ZHv#zEFY*IIS zXvU%=eqXK&0u9p9@w%LmzJ5N!0CEh}@uRVNGIw2A!0!?ok3kg#lBPbaWKgC)4*HV5 zGUo%-uLrV8egt{?1f$z0w1dy~n5nf8C?9yV&Xj8c&X<)YCxmXPD3NQ|cN10}6xIt{ z!^5XjyCvq+e}g1-Y_#gSW{*WcfZ_Ea+bzbHm4}DtBPDwyDN#yFXc)vmvEjtod>;Rt z>OI!W0bo6?KHuf4$JnN|ezhPX`uMGs5Y*8_UFiAls*kXG# zw;zy|v=Xz2ct}AyC`|!|xsv;fF+Tw}u4`@%UT}9PM=xEg!JA95+vnjA8?W=jN6Dz) z{@+eNZS_xXU%aOV*L%7CGwE>(<*jr+ZTP`LLQut)<#pLy_UuB#qIMa(oA1dxqF24_ z**1`gYpnzG8Pu(!^a1T{e$D5A!yHk|?c^t3dy_!(-C1``ZhyAKb2Q=0wu1Z310Boi zWkAg9%x=Q)?m|N^!RphU6!6NI^FMbrZNZqRBwWNLb7lK3cDH}i(t#Yu#K#W?EOaPP zS2vY`jZL~q%jWQ~;%%{-17y!eEzJTOvCN6sZa{3+42a-!tTOnt#zwwy0*2sTls)71 zF`I)2F|QH*8bV+lK_EK1qGUEJZhp51C|V5iuAf2IlQ|Z~^7Vk<;r;qTM7FrM6@S5q zUZsKRpruugqg-SJ2Pnf)lQ^`UcI&=9z5V<2WDMDOPq$}9Y&yi5vHlDJ^ApWpZe@nJ z$Z*OkDh`1CQ>s;s5A$?8NA$K$JFZyOq7Z$2cz75Z8Y#LfgU4rr>ia^-Wu?l&OWG#T zv+D>EoA!SB$me&6oyuv62r^e}7laP96{b(HeBkrgW9*9|ih}WS&6deWCKPhv2TtM9 zd~AIG3d8HN$GA80gy!XDEA~8BX2^o=khlpHdc%he5%bl*d_SO>4W8n^Xl>uG9)|cc zr~`It=0dFt4j_!N*IHz5z zs$LTDv&Ok}y#;P`sYa^44RU$^7mwKRKhrfB=_QI@uE*iZ07?gZhin*xj_y^oas3IN zw+FDhvwIYT@_(D#6Jr8|6%lP3P8ygl#k$QO|e_#w96#Me%RE}e0VHm(fGM8;v zk->Z52fO-o(@%cAM|Cqw61aV|+DZZt)Komz^-i&anaz;W5H;7j=Tph!XkAu|C)9?f zhAibrWGx7s9)_s9IBb*aQF1pEQ0Kvzyayf)TM-U;F9&RvKAJb3wErxK{hjaL^76qN z?*}h4D>6^=^78@BL0c1Er`ywoGEUn5yb}h^4`9?{vqK3RTPOeVuqQ>pC`r)n&BtHo z$5y@AjF)iZ@97W-%*<+RR@trG<@Jg7#DKne_f7zuGF_16Oh-JPwr(oQh`+5hG0Nz7 zx?C5a(D)bdQ~DtF!q1xGa0oSAx5hz`P6)xl{u0vA=#R57uGs-rw0_^i!dY z?!J>Fak%;;zWn{V@BcK4$flkoxHL^z`Y(QE8 z0py;*7^XE_V%$-=X+Dz$)#Q8>%Fkux*aVC$fI5H$a}72qK%&CzaLu+L;oxxA<XwN|I?0prIW?Y@7K;5>S>>H@rrhIVFqGVk5pY4m6ZVkfR`=O$XL0hEC|In;PP^su&a#YCQ&Wl}Ut>P-4zZHw7#UIi8sx-BLJSgBEmp-k z?^?G)+dkWa&sIbXqrPt)e3~fCJV+)Sz(anBXZr2Jw6A3exu6>^9M1?bt1=>PZG#Q~ zMeL3CZta%*8!~bC#FvUG*EKM)fC7ADlPsBh8O?U9`O*N1>o@TVs6fo8C%HLqwSN%V zK6lptm-G~y(TIDE^&Bo$2wH&EWKJ@>k7QyqFoZN$t`m&V8DoDmqB)YrMN(@y*8$YE z+onYg?QY4B;^N<_0Vr$MOMrs|6PKRe=Zfwj6Q4qq%4756Llkk&+r%bfgZJzP5(MIT zFFFndV_<0%yf>QKwYd1D!VeIsaj!2rYQk_ZUk;GQ5MT`kKuuH3R2(=QugOvTwU*h} z7^k(t1YzR#&h{O^96_}wV{M$zza7~18QPpvTQbH0gjj92lddxxZPdG8=_pW8vC>nM z1u6tl$CsB#$!s<(RPfD5(NIN20nwQXvf>?`i322DXL|dFFu9=zKH*wa=p4mF4S$hHPbMh`yPGPzuzJ zQod`7n!jCk?XuG(<$mjH3(e=CoE(>P_4|uB%h%tOn~`#smh`r(jS*Z7iCc5C{-xuS zFkY7cN5dfdJaol?Z-w3|h~j}{$HKC9)^u@k;SZ32h@=X~hD)Yy_LMs~8jxbCy8}r0 z0%!II{{PD0r*PEmn&jhB{IDzw*#6tWNd^XJe1@C|geQJSxSwmisTh6Qvyz?>IA z^hE{2{?n&Vt+pW6EPXqjb_Wyy5D0sVLcj7kU_+^w=h&U=dB_X^f_atEDgR2F8~G#~ zz=9&X>U4bpiBEYy!%F8Lu0Q_9EQK__rL}r4gxZ&i_WJ@DxiT^q+Ia0YVAQT9j*C+= zpQ~X5LST>i1qFDChwJ-wilkv+%qJKaO~d?IomAj=u6J=s7m_U$)wgNfk9Bv)1n>q2 zfGGi21@mwP8ePi;iaEBE69;b9C?DABPo{rK0H6Vjof30#mU}fc=ZZdF5tk_W0N@A^ zuB2sTew>f##^!yQ$kD{nJ9{68$i`NsbxZTNTCDnmT&49aaZ607KQ9y7yxoew_|GxT zV5pASSvU;x&mz_*2zeHo!p2m%IZh$y8h^cM^uS;WK+h=EY5r%G{LwC~(}NJ=Fhh!l zm#cg}0hJ7TT)(BGP~pqMX1!GR_=wP+0nps}x*QWsXryAurJA{IxaxKX9iR7M{~1^z z4ZOgJK-i^9fuZ8tt7hvwU>9iAIKz<%dPai5G459RP!<*dv zohZ}cVVFa%l;Lo6`oh6+L{qI*wyo|g3-Fr;2p)?;i55pv`_d2G!pplS} z_*X$$I*Wfb8h7lhuU3Q8oA0{{t%*u?t8mw7uIKz2(0bIY=H7ENlO-l5{s9E?TL$&4 zJhQX4GYMB$KKW3^{@GqUWs47qjQU{<4ZI5r3t5)C;R`jccsjZ|m_Sh=VAh2PIiF-V zrk-a8K6CBiZ4OVIHzf>j`rVN0w2=BoY5N#j8bRBg|2$aB=K#hK;+W%h78(*5()iJi zW~cdtMlpp5SacH!{(Pzwv+Pw?BSog^B*3nef=lThs=#asR$3C|cU5#VhjF{i7kgjgxyE1L;!f9wt z#nkh(ntrS{gXs;2s;Uy!A!T*9KcnX6F4KmAhJu8O3%7c9ELOu&No5M^zqPFoLE25$ z+Tg+o=FbbWZfNmgx`Uz6(fxC&SRJWjGi+D9F24Br4))^-3X&0WBHBB_gyX}(qr+lj zKZJ~ze4^~Q+^$)*cO9d9d%hPgloyVBUjrdwgO--tWofUPP#3)Z*{fEqhMT5w`l)!v5i;i z6ax^S_HR!&aYYes-44~1fZBT163o211D%5}kwrYm6VtgUy0>M+o zc$5+NMXz7;!HBTnl?IVF{Z^Ujy)Dt*i0il?|@U-XW5c)oA-?ewLL#S<4n~tQO=g&Z0$-6 z6sv*b>BOYVw7_}!m(v(Y-bF<!e{n(2Nf}Le-ek0+Y zcmr;-6Sec+?2>2R>`S!8=*tg>NsCJlC#qI}F|RhD%BGE~hWs4aDZhQ2iBfoKSVAbj z3+ntR9BJIaWm{?)`}!0SJCxw`RH7ae8%5%zSD~L7ODSefgBx*pZaRvpF!BfHIrii!msIp5DFI$Ur()7OEGPEH6C5_slMHoIcO%Isp3 zT0K;uLOUAClq5e>RIEa#IgD8-RN?vS>+8(L%S%dZxo#0#Mw|%AbOb@;ZMRgLFXW(` zl0UVN%?S3kJE_*HC?F+X{1$RW0~zIcwOK}Va4oQqR-mP3j1>Gn%jX)&y%BsAbMbNA z`#6SMRP3<(OEv|yKw9GRhJonG38Ke!upjBuRm_E~pY5*KOEPi&{rNOPdFy9Nh0H4q zzkPJd{I58UN4S(`=qFmJd&SGz5gMDx9h6DUxCyecWx_(l^;NT>7D-+z$% z6HwGM9#e5SmXkW{MDhXxOLdHwOV~1^InL3@x4Rf~pbt##K`cHYQ&)14p-}GZ~ zBJq-M#Tg<92%=i`b8o>O7Zh?Rls6(U6MYhcd!zI)LBqQ5eBjfVA@nZ!YuheoX%1)& zO)iJ$L>zx8B@roYmJ~mmi|GpKT+vWZAgru5)8D(Dn-jLR+V77|BJ96HYM{P_D7-Lf zW3#)Jzk2P=`ERSVJ4)N57ooAnxe9-tQ{(ik$>Q;z9_2?Yp_4IaOC|azl z)aZ5~JkaEl>Tn=Ko_Qyt|J-GO%i50+Y2=}=d4!z6PpI4qSCam zX~pIzm|hr{jHuH9nkmkAL_vr5yo04zgDzIfb=v*Tew3Ijy?^83{^!NZtHjr-@meCu zH#f)prM#T}-l!KfMxVT{uK0OradQ2`2Y*o!zvF*JVser*Lq7e0+Kh*XpJ=5I{^24Z z)7xfw>dVe2H|TsBD28u;zHj6B$)YO${jOJ=_pWXCQ~hnBG!_L-&{!cd3e4+6pq_&4 zj9|7N$zDh*9ScdwfF|EiFuc z^d!>N-k$U1JM2CYk)|Lsvq(X`{F74wsKid>?UJ4LNdH=w>qB_buD<46Ut z)Z0xX;8WfNoSvY1zYGYyw)q@(Q?th2b@la5>e0Cfd@jQBy#4@T!N2}Bn!Kw`Qc%z_ zk$qF&{ONQvnHP(Y9o*#bZ^aG=y9o|_udyyDgz>rqRhvS6O;qGzer)`x48F6~ZxXLZvY18YbqXe? z8p?1I+~M|X9I$$dFVzs)9UjTcrMW$t%&?}RlA3Bgay`viuK6yd{`9{gm9?1$Q*Vlv z-fmzhvLEK*HEks${$7+>M-kHQl{7{<5M3^TdU**(eJ2yz{7ILI%RXx_jjrwHNP;$x zSmsXc&*I|Wps~!#>fDkqZYNnKtO?-YDc+OQLzzCCWzPL9hejStadkm0jR`y}d3oom zj_duI^snuPhTs}2sr_@{d|yU`M*^nZ{QUgrKRvR4@m%73YS#V4PYaF#7XPbU{(Lw= zA-D9zad~uHR?=G zzD(V3K=jjNh1JWJ7ABDH_s6Y{LcaPk zFV*Gm#(1YV?QaNgD|V>~CL9c{w>g_ zByaea%pk0PsBAUMi-h<`_^jn&-2>q|cM{7q*^kiBABp0h)|>5_jG+9>I5_511RL&GjxTmJ;S&*~1H&_{I^IG-6cmiy-kc)gQf zGuXuN)`8Z(wAp?07KU@fYM70Q8Rp*^c$ktZQ?8d!(j6|YT9++$=;11(RX^r&&Tdju zSfy5y78HZoL}b(I>5Nf*a^RH75kgj(mfjbo#y>?%p7e?g)7hz7$jx1Y>SI%`1GUzg zyKi%}b*eqPxv);P?)4NUay%!TDcFcId{dEmt|s&rbe9=dK{y9fZ$lCr535>H-c)Bz zvi`<0p^Z!Lp4zul+gM z#YVu;1JuFhsLwMrCFRWNqmw0X5r<#fQJaOujDoAT&td10N~dxlzs$@my!h8ynvq{?_w|0g#-O}Zigj%aj5 z^}hBmG$SMDsQUD*l0?d#k7C3TkUaJZ2Eh?sV1`WkknxNBS z{=)2RLR4LkU^xqYwyxd?2M;ZmIzg#yW|rmUM!_7d-*SHrL-Tbi#7;F{rXB|V&r4`; z$HS%YWDdX&ne?lw=z(+wx;5z2r{ZoD0@SZ0>h8=C$HAoeoBp1OBs2ts;`PqJfCu;P zDfex7roy|snwJ*eGRG3#-)C8NmNL@?0%c;F1&vc?=C9+wrEW`ay4Bhmr-UqVZM=Z@ zuWy~OungnttJ()FtmUk#*pT;)9qP@jUHMgSf{@2(`^(JuX18#&t8f&te?3p7Czns~ zOu1Yp-$q=!&h0Nd$nm=Vb$&XAcSh!hIr(+7?`|!`cqgod#2$!~LWSwGwHnUu?!x>@ zQKu_vi1TUjrwm#Ja|Qi&-==L8Wawg5Hre1RcH`zA;>u9*%pSI%We%V@Rd-rh6VsLHhX?l2jEWBKo>dUN~BQ`sp z3B#nV48h4^kld~|g!xQQOBul3Cj`lJyuQe?h>k9hItCCPMoqa|L@=Lwtl+}b^r6|h zU_xdb)gi0BJ*!QFj&48zOc4pCaJ}sf<@F{Em+DyBW@dRy@cz$n!o%}Pn98~WjEM{T zj-H+igt$y{OibZvje^KMn1{8`8{1M^etpsTuUp${t(rQA+rQq1$ikyYEEFz!BRI)u zo`!hTpX#l%CH>ndpUSiYuJ;296)aYUu7;)FJc1M;a|r6MJ6vzE<4=tqzxHfuEpLc! zPl$Xj(U5b_p01Jr`4rY7w!J z=i27gCJE_gS1|7<9Cj;wN(&1<$jiCkO>T6%5M`|u4mPH+^zj^+(@Jt6f#F8)^_AXF zr4ai)HkOfz#K6@qcwl!4z*QcJBsUm@vgFd>Cp4-qh82dW z*{XFb#2Sm~<|-k!-RaXw%=9$-?QopH)7?oO+++N%&jgjSCgSeW_~~xC!9iZgX%F;^cA6*84FjpLgs=9*pOu@-VmqPhTuYH7knMum&YBP&@w<6`#?n0Tz zzGyYb{<2pAfH?Ru#%FK|IR`2$+1PH-WXRvg9o4sfo>f!DeU~^8tz)|Yc~mS+HNiW1|M6OBCi!WP^+`-^s1(d~%s;u{9Q3=l%7|0;4n}WJvC}ymMT#xx2dy zP@W3Qq!ux^w#;>vgs5A@k+jB)j1Pa%2>wwBvvEH8)KB1Zn#BLS)K3WR`iJr^Q<9e?R^9IcJ}<_c`Z1 z*ZY6Z_5Lo`u4{+2*7JP7_x+jf?^D{@AP5U}PNlQZ+%X!vHu3Hh#wpsCo_-=V$ugph z8%IwJR8|((nkcTl?A~nZIWMC(q&+1fs)I%rUNh&{frdrea?drmT6^*%-I<$4 zrgN%a4TMCX!Y}l7HGZ0#D?Iec_LMh|!&Pc(ub|`D8*2G12~i) zhBwbOjd!NaX>Bd^4RrnR&0zPKsCXWUSLa4Oefq)JsD-vi@|wV-G(B6}_a;gM)y5{B zWvuh3>dMAW=_YxWO*UI%MMdY%ied;knz$Rz+?DD0-q!E0&+y}06g55Pdzydkr&9n~ zYb8v#&ed9Uv5kEXjQ4bmwlz#kBGCLN`Io~`%Xnn3%UZG~jWm;82DI_R|BUh)blwQuWx*Bu)e3zTvc7jknG&OGzp zcVTBVb6lf@JNnLEnfouH9rSKkdY0TN;d6!d#$OGBb49B7Pmhcgx{2(sa@=-n@sa4s zFu3bkaQ80kXfCbU!PHoqgpZ<6P##$iXMQq#)x05M*wEP)#{95Bz(OTOCBbHR_KKFN zsc?7pPzt5q_7!1=S2@2eIu5-N3Qtsl+Y92&B_)sMLnJBhdDZrQ+JcB0zAK;?2Dw5(3PRsa zOUth(t6M2tHZSY>8n_!y8aIc@gqpoQC$3xM;`41cX7`=e@5xu8OmnxYm?g3Fd4) zZ_*i0hFplzr zJUOGvcbXb@ZFql**#({@;xj$e*jOFHuz6v3)y`F8xxg6MVkhbSGW**`Mn6g0lkZk< z&TTFNVR~`w)a>|T{gZVgSMJ%ajLmiz9-ivX2*y>bpw&PcVwsTkjnnEm{I?EDmhst< zqkAGxSv1Vi()1SxqY^*48pU|P90s}8PV4t^4x4}crr-?hY#H++#;`% zDUg+8u50iMgCt;I3=ey%#1RSA2Xh2KPmc>_r?{i3Sx%m`pCG}BThTHTlblR2qQtoH zGCM6yZ}#OfF;}|Ig~-tV6TROVTUv8ULe_*0cY=(iuCXz1A8v~K$$*b|I{x>rmcJsx z)N}c9AgRcf+52c{ocuk0=f`}{&51p=jS?+EO}6N(+OoN8WoXY?^rD6Y356<7S&7wX zNJv6k2TY9%sSc(R1_u1KQZlDhD}i zNw*aluP95v`<&*K_7A4$v3~OY$_cS4@6#%HOT&>{5(7p1;%+;PXC9R`gc3xF{eKvf zyox*YQs(=~?nuE~<7pSKFeqTmT)PiMU%r`_-4`xgj+b zU7>H}%Pd30d;5q{>9K(0Kdh%W_6?1ikG6~u6U%$(TDErnYV+jYhyU636Lo8o<-~C9 zx5ZC6*ROF&TM_8#lT_>b#0hef%lC|o@A4bTZeY)lCF_*?zkIn#U=og+RgH9bqnXX5 zE}!PrQW*7Am}`2rppzv-UuBfQCkf-<3ZcBi=FgO^Sv`OtGzv z-F5k<$LMj!&!aNw=TjCbTU}5xsp7lQ^2vIh9h7Ei5tq4^^j*79pOYofFCFYVl@q0; z8bTK~7Kh{>>I_#L3EnHxOkT9YecRt2Z0#E?_`WK2<*r%`eynTGe|>#(NnVN7-tIzE zBh{!F#~!^-Y5Og&Q_Y0b422IWCq)SdwYQ()Tyd8^by<3UJ*ULT@&&1WjlK_2UI^h@}PPN+-E@x_a>&9ldX}T)Up+iPgt`ye~yX zCH3eLR$c0FN9ohfL1n4UQNld&EyJK9+s#?OnW|v=EeF{Y)5H$a7dtDbaNBWJwnAQp z)B&V+n`4)TFc^GpN~ut7;n))v1qGZQTS$o1DK=XC5h#3eYOhWI)Ux>+D zxfjZ~?GRG7m%3~f%rgtul|(&TbUaPZj~WCmq4U=`jNJvUpS>VZnVj_IBZf{om9ie? zAwoA?k*ODxz%_!GUZNO#7g82T6L9tF@j+GXgKM}+xf5e=j5-eqWygF}X2KorcUd>v zoRxWBpPI2iTroBlvk`i3!!Cl?57yk_^}QJ^X4%4Gv)S6ppNxz#r*B|eu2nhvu${qP z(xxL!t|t5V_^mhzd%UILo*muaqgoo~%)a`-sUDwjLy4g7p_715iJeL68$El06;p=A zz#=~~wZF2(bko;wAy%&}S)8b}>|B+V^_IG3Q*%H?1*4}=ZwxAD&7!d>TBH>UHlnrhhj|xJvfY zZDG%Y@%>37kA%%9_m(?q?L4y8m~MLzDqZ&Jiv+zyoIXu$dk}E7PrlsOq$9Ocylzf3 zq-8s|qQBRyx2gW)-E~&4i!8!uU394S#G|0}J@npP@v=7y>zej{Q=2S1AmP+#2UiG;1qN<`kRIVYY18vnyCG1L2dpO%wP{26d z*wW3D^~v=XE-CCihFT_-^0M*u>94C zq?!c$D|M;5dKtGuXM*5BQQ(j7-&aR2aZD*>V^WaMK6pBG8CHaO(=M_gaKs z2pCP=HC#Oft{~=6e@s0ORfoFX9I>+DKxY-)Uqaw(#&q-!1M>0La;a`Qk@e?G5+2SH zaG2`trRukQok_ zOI!v4-Ij=bCUuvHii&bUu-HR&y(9zAE~@j1L1a@e`@R-=UHu_q(nHFkY07Z|3WPc> zgJit<&j{)Z0!7cyDgVY7eIa(;I&^}Gq)-z_J5oY9+ebOukutHbmqEO}LTc~uV&39{ zh}I~6ymsrkwzk(?*Ng9gFJ2zPT@Rif-&RV>v2{=i#z#k`5`+Wa(cvP0Pp@_|7W&~GaHGK!KNK0LdxoYJvk>u_G2;c?Z?(3R9nxX66r z1oQpsemo6*5<_dV0^tmImfBnrstV1d@kJW*S)FHXTaYWGl(y96KB4MU)2*fbt|Tx0 zTE^ns0#)?+Yi!XSoOUI)3k3Uv^=7~36O7#ifzDm^;QlkE-vhSa#fTPEL`qR zbR58SrPqqnJ(Vr@e9#823qm#ojRqncY0j28_3XsV3sN_Lo`8*yOk#Y@9w6*q9Q zYY!clUa}qyrpGQhId-F4FpeC0FAO6ZKV|WE^S>{D8y)aM@|9?ne}oeke3rnVhG4fL zE`4PdMkbwFFCr|DcIa!@A+9|`5jQooFTXh9X^D>$(ZK`F&p7`}pX=~>F7CH}H8r7% zG?|3*ex6~S1jvj8r(vV(@XFdm zsJPg&Nuhk^!{6mARc=GAPjt?=jWS5`du4t4RCBPmF+Mwcl%1XZs%GI)0RaIv_0!bU zFRiV2J?R~KM&BJf#RkWhoU6bBB~G`;<99HETAuLYLtmZ9MV>8Qdk`p6KWK}gproWc zedf%E)YQY{N}^m_>d2Cnz+oiH#k z2#byNQ;6kehCt&&U#@NONJf(9YxvKkIh08}$n5jb#cO;vc0o2 zJB;zuT{n`=nmRA${-&a`GLEayjQ{kxb8V@RP{%c0wijg1nCK0b%N z0X!f1{{4Fg)b7U7(IgT|MnxJPUH*@zgT>a!Zyf&Wl%iYd+OfZaQI?X51tET<((OTs z&G1n#m7VyT4n7qIxGc3S^ZKB3sSmHnrK#T6(4dWuih9#6X84MNUK*yoFU2-G^%2Zv@YNY=$O(Vjn&*zv<8O>#M65U|M~BV5)B{NgAb3A<|Y;JL?3oG)G~Esi~>($jDP^ z>FE*P-o#Urld_*K@bN{GP|!&UCxl$Na^<6PlGsBvH8zf1jxAeoxNq2wSpA+3B(;N& z>$tu6_)~5!d$6=5a`W#7o)yqqiBuLde}EEn+qNPjBV#GjRNC6wDzqDypcD7JMMX8| zC_F!k5%=};d*I|GFkI%~m*|N#|8m4m=?Do)=g$O@IIdXg>R?7uO`#9gL#5$|4juB@ zggqMuCp{#Hy2V&nSj^T3(>pE=2zU$Q_eTj4etv!(+eN*Y6zSk(fB&POK7C65^y$iL zfB*MSC+g*Fk{+Tyq6zq@q$FkdK=7~rQrk&UOQ#m}^0D8GbHCL0`I6H}vA4tC3CjSX zZ-1$Tq*+o@(tLk=DJnkxs;0B7>`^Ygs-e`)UZnEaK(x=kEZ)M>()ZTR^6*7eRAS=D z-)=HQ&OW|>?}fa_saU;qs*BP`=Tz(cq9z(>4fp5=W8>mDgOZ>QXv)T3#|KlzG1Y~v zNM|!J8O#|h3HBZI(B*Fg_OIc_{g^tF2nVKL-FCR)dVTf82@hAg#rpfJ0qKUC!pf2y z&8glARU^RPY;S$4hBo>up$@CAXt`06za1yhbg^0QapLnl#m!I*ckY33XFrdCXU)KdgM>esJd;c;p zo;>+7WqoXHd8ka%zHI2p%POaZvqbMOLsT)tAf%#Ho;@p0-IhDzC5D~7=xuDUuiUi# zmbzM06Vt!#G`)NM#*6y8x-i%b%fsbeuyud}k(v8ZGNp%Kl!;KwIzutGy)-BTI~U#q zYX&{1o|R{ZMbYHUj12t^tM_og=@kx+538$ohi;pjo3oYVvXc3}++G>wsZh`AIqU_^ zBOoyhl{0rHA9hVaK>^Ek{R4VKE6*@{cR`D#-D{AM!A-xzq`Gb%u-rf=+@6g$0VHfpTXaCAg}vmV6wvtgX3#CT|ovujoc@BlW|4>A>tWE`2wJ#4e^@Ot+|{ z1bP}PTpK%R8Ru`>A4aL@>T=J$`gU;O9xvuW$Amt}&s!|&)Ahz+#FJA}IPudq-GerJ4qe2Z$XX7;Ol8MWj*6;JYp zdV9}8;VgAtVT4mzj$<=n@0w(mXBTQ(e=&wlbQ*69*CX$qzCJV5Z;@0kR#sLhvZPSr z@;*DSj6iq04V?$Oy~H^n_TV@j|BtcCe!PRTvtZc?LuW?KSE2ngv$2uLgfjYS+Z;R_s`aCsfcDKCQ3lYYkE^scVHJ%m9s!K}iMmKGlj2Gh8&{24u1qp|;1D1|6KG?Wr5 z<8)h6Xlg19hHJrL9~981>>M0UaSb&$lb4m1ku+ObTR&as<&q1ww8g2ywkZ<&b&^U# zLL$$kmF~Q-<54(%OUQom=nb18vl!Rm;b9ooT5aaR@QW~yeQV8!ns}Lqhvvk5Lj zI}5Kw3(?foF_)~YEJ>(fPsgf>6yt7Cpz_>yY(8riku`)c)PB65@-BK*^Q*?*gN%D; zKs?`B3Ekaw`OuOe;>>dGTKkx}TK;xGnFkzfNJvg*nROH%&y>z=(9;TG%G~4P(h^gW zWgyhk#xbQbjs|Orh-oUscH%?gF{z1qbPR-Fm(nTU0Qv!lA{7@GhnqE;ievA^Sodfmw@5$7*Z0VDYaHpVUCuH1)Bp8r z2`Q<=aK3_Y#nbd|!id{S(VV4x5Y&W^A3xq6t@2=o5uJpDU@ooVH`(qqG&G7yVhn*a zJZIUC1xtJLnf^pk=Da%2Abi@g_wyYc9R?^XYu`wj3N_SJRjG?@hRG7{nHF!4f72V4 z2|51)wi{fAJkvJD$n~~&0_02{n^e@NPTha-z#DESj4;uCo|u~Q{r%fOyTXOaWwqyo zs>}1|`oHS}G>R;uR}Zhf6R^DY^tV(;R{8XWV#2%PFGWk1wuIsgkMyA2;`TYmen=of zkwR|y;-Zz+XcYtOB~ldfreWcH%*?!_q(lMu70wSTIeY)`;lsC6 zI^gT5I&)AOfJ$Reb2Bp()ra(S53HR01NN$zZEY8or?#fU$ ztnoQ^^u&q!wTTA6{zNd1^<@#WeZAL{?M1%Zn7{w0tSoc zCZaV7LFf3);A}y*Sf1^ZwNUdLYiqsFpFeN5*q@ISR=OKjZ^9T)pO&h0-Ac9@{u-{x zb}?H1uCnOXX=5X!lcJ@^N=(}l5jctZ(a{kOiTVj_2I)P z6;D7uKrSLxGgo-s68|L&a0zP5z!y{Hz@1~TJ_Ua|y?bmprdU@16b6Qdje~<)F0ZrF{FKzPHSg-`>Q0W0-EO z8Lgn8U=GZs8-6=r=!`OlnHz4en>F@>0PTJtA|?q_&Af!_PLZLU2Tfk5)b5Ukj1?ik zIw>C?tqRTXt)+Vr8!M~t0R#_FL>C|$h;7!x!(!LWjxqTeFK1(8V`OfQAaH)?Wo>V_ z<#(=|j77lz$fm@w^0Klgm1sDVF17HO{)}g)r>8F{DoW!utZ#>-<}Q^elle;AA%$cE ze0orwPM<$-wdxhqzt;D$XpQxe<=&u3Rh@q;WqpWk{zUEh23xlo9$o`LpLoJ#r1Fo! z!MMdmhaNjc zzj{aFDEQ?%uicNl2AcZ?H_lyqf?~ONaj%mPnDI7gwKEz11fb(P*=iSASbjeh^yLMD zoKQV0dHl1bO6Eg0Ld_BQ#`>?^RfhmnA!OPP^*{QHDH|^@FDz4=;)7qNNxra*WXu8IUrM;Q@xX>st+a7BsWD=b3xBUmqDOPqd7{R6}VYL!*Gxq zN3^{A&aiW6`MJ-56MN-`{v>u%aJ+}hVGUOvcwIZkp%`SZ{@j*UC5<6eflumW;oQt$Iq_>o8bHH z+qc%24I49UhERQgVXIt;ej{kh$WIqM>6pL%eL5D-gsfPtAR`xb-jwveR;tB{3KI3_H4>k`F-D_n*jgjmV(dxRqmgT~cn%VWGPbZ!j z8y^9{2=jQ3n!|!NLnn1IICpZRmKHwMP5Z^ipRcQ{yTHRk2{cbaUY@KsS8vp+Qdt}a zD#Mx97$$Mg^IuF_C18FXPB04#4}SqUbcK6=pvGHarz-$u0---0>`sLKXl%S=WR%*t z<(#@5!jpe+{q1L+DZ&UYG1S&!?&IFz`8By%wr#_0CnqN$ZsVmW+l*CK1fK58{ z4I9js28s&du?>xT00J9h4KX^_j z>dIeMS_;#A$?feb-b@OF8E}f0mzRxol;P~W={Q@d1>F)G2G|~N zqDD0L3^o*?FgF@q?=<6=NVM$B36G9G^GIF2B-0}lN>icJf*KtZ3h)aM76}s3vAKHS zRcppUQ3n9+pDhjCy>sUdLat}qKRC{H);jp~??xmS?Y+1JR!4)3TZmr%c2NmIu4eD< z;%*h-BW+o(GBptT^*=2*Y?DxUjHv&N+5t&}cGB%8dDWi?0qd zCq!|ZT_)sX@5qiHPX%CdLyMc$i(b^V&`x5o^yx+DT}S8KwilUAA)(>6eYK~%yFHj* za26y75~qV541pCiyObr%Y_v=;-CZgws)vsr-F@`v(P=8GI}`Q6kwapcDCGWfh>Iry zEQWuf3Ro297z8+GuoY;nXBy1Iu~7?z^hZ}$WEE~(%X{j>hYy7w`_GUSm@RVYl1~he zp3UDx64>AuK>aByDw0Ta+gXNXs;q4LV4o5EF|!|#C{arxiyN>w;VsE5{M(BPcX8$y}y2&~r;&)z#G|&4bj{h|U3L27Ej00hHm;Z2%cjF)`985DRY0juu(= zouYxWalap1;nA&-1>#V%4;ZQoP-0N;a4%{ZG}pskz`rkEEq}hjM)V#qq1;j=8Omd` zLx!Ze4v{nXSiRf|J@c0qTGouMJpBU#n4z~1mpf-;>mdDB9>Lz_k0)C`QjE zS1s!pYHE6#T9lbcyNlBRRB5D$8P)6x*7qM=nA)}J9$3@Asw2PODu9;Tn%%o=g%^Il zehCVPu-zD{r>~DbstDlRJCIgk86BG`9vIL>BrEfkkxI5D@qGN5u7SM{xCd)86l21h z4T~Ea8&9#D=I+pLYYO^w-6&w{&OanXI#;(cXu9N|GHaV&`m=gyoKppMKC5P*QPlM) zL0L)Zu9el*>wJ9r=H>yQ`2y{Ho2FZ&Ns(~Rk4D$!+mo{FY_8XVflpUPL^U2iKDYTG zNz9`~)mh8DXuzb|b$gNHU=*&!lLR1OE^cnlvRd-;^6dcHK0dsn{}|r9zP|noXfvBj zgX)DI>9qW2VF)XmSzflWXQ&_8Hp2yL4py-nyJzcG(t#ZPqq({EtJ6Z*yLYca>>V!| z^^{apJRSmeQrXb%QYi=>^$WR}kQABFVwc5|C~o8yvBWl0F)@WsHOHnvoY~Iaz6Pr5 z>USEw>e|}c)a`S?I9Lxxhld&L%g&eBj!MJ3ipw7C%^zf}s;a6XSX)`C=;=|uF+ZUH z2U2!n?ZCha{|*2gJU4*~RB*u&7h-suaHZjNmWJvV#7{xL0b!K{7(ywUAO_SU?CslQ zfJP&CK=LT|&EMvG%0O2Q4+&uw6zqHQ7A_~ibXE?`e@>DWLB9YJw+VCq>LX!+@G};9z?Onpj)v@V*kh!B`W64RKu?Rb;7 zHkMf-bFRD*IQTh`P^A~(XUxpZpaYMLjC{<=0dwiYwMJOB5?MWThgqh-9vf_GYC?n! zOHH)pAbT2GD+^=3$MqbHqE>9YC!M0s=ix73!#uV4T6yj@MTbC!=j=N!?`5zqRcLXFl>hCSg^@hE?hv- z1(VPPOP7*C`TFe6v7sO-N$iixHoD=!^`A3f* zKb=!0caF(g)N>$CZ~jjuZ0~3&iQ0CaJTMN~Xa=b2Q&Dm2Bo$)YEiMKX6kH$scE&_q zT^$ksPO&N82H7=)N&EzK;r?I0-Wn5%VqrTSt6P4dAScHRd+g9{)DN&h@awS{#{pAh z0rCTvP`wguWNWJomFMB($G@y9&+(bG1DH_a)>~wL1(iP%;QUP?p>{xyNO|SA>c7S; zdik=y>(=~T5bZ9$Rg?z(6ftC)e*C!LYIn+}Em5>_VBj4p3=aR^S{c=o1$(E^aZYu8 zbMum$n;ZO*3M=Nr!ROCc$xfVLOH-AD%2Eh`_w33k0ET>}W&IDchl!m5^sevhu!90c zcJ%0b*aL#)q}c1lt*$^B2cpyKii(OK-@d&_d_H|n zzf6Mw?oemN^No-2+b5To?>Wr;wB9}q*X3MfWTYf9$?*&D>Zp$(HFkrF2zcyeUPwRw z)S#Fljx!C~AYb3EMR5M!ovfZtV5g0(t-)8hxDZ?oJJHgvP3J-ANXoOFWt|U0GJ0^b zNb;P)RHV<|6nw9dp`j$4&BJffLM!YvA2qox2S;$v0%%5zCxDt@mQgUaQ;Xo~if&Y; zT5zGkm!r+!`_{k4_00Xv#IE(q0ju=l0ZT6-$$kCUb2qohgaig?fbVWPq<@oq3DQ>me1qPZ%p&1qID8-!1moB9$VIIj#fvhX@0y!`dZnj^X0V zjEIUl4Th7!%+CZi^!Oskd-; z!=fJIq&sngy9Ij}EKhQ%Tt~q35PG&q3tng*01vYw&Bkb}p;9W_%B{0CwY6*DvNWWU zaBCGG2RUYUL62bJSb5W7`pI<5TefK2Wmv*e($dMr#b=?ppuE5=0HKNm#1`kG}h zR8&=2CNn>Ou2bNtJPgDJ_OCu7GsAkE+yoN}!62X-dxOCS*6?dU2+X4Ja2`O_-q2}C zj?;R<@X9l5!w1s?m_N5mTbj63tHcJ@EmD)w#sCZMf~dYW z)|HaG*xq2BtRhe1-v(hudkY<9YOlR3cmXKv{(*tDz?fEhwQPw{$ki5A2}?=}1<8|KJqk4j)=e##w(r%lT01u# z2YZ`Dojf=#tH%PGCnC$(IXnB6mx~-CCPqFkD7658YT-_U4ocm$(3KJTtGK-Kuj?M_ zmzFQZ#KZ(Y*^(rVcpGpEwlstuK4)i-PfxRHmd3`ae+m8lmv521T~cxCKl3Z{bpILD zNS^yQJO*Y>$7ejCwD(n2j9?)H96f~c-d`EW`qy^@2_|4Nh}eXB4^_MrmOThu`FTfB1 z%yud5-(UzY7$jb#OqPj%fJl+`KLH}eAe`zi^kygTklpBs{_CzXQsd~tfg>A$5KSxW zco|uj(0Hx-^FBCel8yntgGbX=zu`4hQB!;6<%PPn(Zbi-yT3P+6doUM)%%r;i)#(+ z+22frT~d%lKri!;)${!IBq2*Z*8tRN2Ns5AJNS?ptauN&>C=az@!L2oM<`(w%hKl29_1xFse7UZwxV@(dulpq zAJWNfOpFc2!t}Feo+zh+a*PB+#!|G9s)rL>Q#Qx_f2*7JeUBG$J|UmB{#4K#soA{K(ejq(%O!7e6A~EA0s?2C;6QTa1v~^5@DBN{T^BxnWWZ@CaDzArK)tPJcsDRsnqJK%T0j0HKecyM7pi8cauf`-N2H zzZ_!Z2CQX>d{rk~O){fv+?Phz3u-Pr*9a)vQApPyXuqQ3Jmh(1d$M9x zbU_;s&enqq$GdG*u=t~AQCA62fx=mc3)`A0)w5uZG-0 z-qQ(b@2!_FU)sTZmXVRs1-K^wbHTf$R&s_qugF%*gE@d|6l$_HTKbguFN@d@umg&A z2#t6g`QquLtvl6~z}2j=@2Cx7H9$b8y~I`zo-u{69>7l|3kREB%D@1LslGKdkpBGn z^D-xAWYqHS-!JF7G7Q&#f4_YBG79yt6z;#QobEjI$fqQ|Kv%6(<$jKch=`WYCMsMyqVO$Eg%4qv3I zeoUShSdziT>Ovxc-@p5UcuvkZmsw{PXVNhnwn z?#X~T)t#Zt1TD?d!H<8qD!th1mqeVP?TxaEbRumKSgiZ=UcgU*1s*Ybhba+~Z6NZ? zrF68zJ2mS_zAJ%;LLG)bm=W&+GB20W)d9iVIp_`%U4W*P5Vu1uE3>L95g>>x)N^(g zlqKym*1Xw-i`S}&C%+26&ezyLzj?PJe@ zlNQ=f$+NIPxbQszw}M`}7i;hzwQ#csrnkO&OrJb|Uh!{1PFT?V`Zb5YI%aN(iMgy^ zfH)u7igMyDIZzo+oEN$cx3aZYFvb%GNF$o3kYwG}@_(8nYyM0$G+ygxKKUa&wZ|gv zh#iBdXQIzqBkU@t!;M5k0JXv7zrQ;h>VH{8Bn}KH50H=%E9^etZYnBRb}Ddr%DcWp zKIuLz;mqP+Ry8X6ipt_$le>fJl}zjSb8m0nQ&TFzES$Hqp+ z#>TEvO#&B%-P#~325=xhgoVRv5MrKS2DX0>q@jorS5x|Eb7R7g;C{%nuU zpPd8SZ@u$T_cFS|Vf`+_P(}X;^oD}RsJ_b(u0>L-D;Ppm>Lz$`5sgL=pj|rK*Vfp` zj3QyWxiX3wwIUhS$|U^T0Y@)vcffp%#VuTl5A6cflL(ssW@0KSCzS+?+#fcg*|j z;Jc_OAMh_EGP>kOs-SzN0NDUZ4#~ejEC*Z(X!xK36rNxb$N2qOAVoi5L;^`as9#|8 z0ACUc5u{98lf;t%tp6Gue4wH6#?HIyW~WF*)RHB?Vg2!UqHe{FPW~P~5Vo{I;aMOAD ze3bmugbfMugTi5EC`80lj2EJU$1BRGQA51lTRMfeEIBMJ>;^7o7N|`yWVjIG49|wU zb!%u$q|yH<^lngkd?3BnI2HKzn*Jf9>*wGL?i29WrvQ4s^lhY44-(Qh(Qugj9lPgq zova^hnLKcS5t8?a-WL|01~n6*ym4{#09*s1gdLqTm>@+#xQZ9@QXpd_!!86m9@*{5 zvBd`$g5eIomx$+qkV)%1UwDpiYHI2QfDJ&#Zv1;4iP`F(rSfSy1#L%yps*UwcW1Ii zTfSC`yYa#w;r6k*uE(GS!CEx;>)E+PHAqn1C%}CK<-qqF?3!2Opf{7`u2k)x0AXZx zXNRVh5(RhdLfkXzodwUJQ+l?6DN%KS& zf+Q_C^f8~cN0nC9g(Nnpx`-x2MFrsFKW6y@1AVtvhRbCfrdybS^FkJg6|!~m zii%P3IUQz~uV0UVBupdZrw}I^)~$pqC_=#uA~DDs@9T>lao=b?iw+vmW*jD{V)g#5 zVJ2J0T{o8h!fS99ZDw{Ec->^p!J;qXq zRzkp3b{+fAd6A7p5y}hh<8Ls+Zj?$GKu81y$vEi^Ffz|ylnyd`Q2F;XHOw5u45TGy zJB-&HNl_mgxFRI<1`)PFwMPOYpt*uvzu@7xI(7%L0H;Ti{#|l8F5C7h4xA`t_TlEu z#~RQ6sTZy8r}KiZn4q;lfLKZw+&ai!tJ>QabQE)G30WJe*<0Ss=NzNfdh6H>uSAbZpZPk&4T8pkL2_bprnbpKoPKndVG z$(o_}fM8C4n85%bCd6Yys|a{E#Fm6<0YR;di^QerOdrJHfW>BhXd`q&b{8lZZ@q!; zAzAy1f=^=x=0P&T!cGEQwctfrbN$ziTKJOJsX+qQ7W(<~o6xB`{vg#L5J<7|r$o*uS?*dXjQb3ny4k7ECy^>t(dbFa|FN8c-(Dd+15b%J59l zFYiBRrcY!P7stSY;SdqglFj|}i3Q~dTJ(v`KR1T7!)*)#0A3KFngEy$I+&Mq$_w~X z%UW6ub#@YFfCPOgToe(ZhnP{r>UgaZ_W}@7%dWmRv?)CnPy$~-7F>cm7Wo#f zVk=&a85nqw(A8!1KMKnQgmdY~kKd*`{#yoD`pz996y#OMzyNwX_=^cLJSot4Ir_+0&5d!2}}<7dE&4i0P`eIWI#XBfK7Ln zM>hz-RCjmx*iy-8J+Sr;*xt|j+7Q%v8gLw3OvL2{2|wukO==izs#yTXBB8SyBpo`i z#Sxo>jO-;4y>H&6zMIXlJQqR1H>?l319<`%Vp(nBYvbpfnMp!R!)AIsXaY$DK=>yK zyA9&+A706aNKpk0dy*`GpnV3sWM7cRU3Zo#fUs2Hu?rDh6Tg4AgVz;ACjjQ#3B>nx zcL#vR7C8>)6sXx=&@^FqD_C9kdD{14B%p|->Mz79pl$9p;bR8~^@{^VAK0Zt{T6=P5dOtO%LvT*bd zaM7{j<2*&|cihdL%YeZEMw|SDf}|ck?4Gb8LqNnp09t;55|-a_FdHCL^cS3=y zzn*+|+r_2yoAbaw@OvLDJu4fV0sKZgM@K1;f=<%VutS0kZkWy4^MOU7f36-_JpTkg z#Qr-8RM`f&Vm%1QyiW7oH`3y2feqi5`q9?b08Wz+OzV9pEG(>@cZ=}fS^@pE10*2G zLyk8vp``%lfO0}~Y(l1Kw+SMT5G;X$Xa`sez|j+kZ%W|)CK*74BLKWMxVcXt3nhUC zFag=%akfS#%#u+UA0f4w0Z%wDGWP`-g-&PY zK2Oyy3xmkBARzRX_9K4>RE+IiQ~m|1e2Vi2tp`+vflC$t3xGul(t~Warj|ilNG|WM zfMHF+-vtac68m?l6p-Eyh^OdXmCdj)tQo42(DOGVAXeBjk5!$Ap`ppSIk{2yjbO9U z*MDv!A8F+Bi*i5~_maedSruYre>y-!2I&bd%Vjes85n}0@1F-}Bw|DB@na&Cqp(g~ zCq2bq*dq91qejaB?=MVgZJ}1m0XbJY3o1npTV~Xg=}>Io1CP4Or@6 zxU3y!57{b4LBP+}$gi1{-2fp_IyWyMt>h789Ug0HMidnZAgYWH9In%u*1M1R>!)dH zFIR~FyR?{~)~E)YDD5l@%@vAf-Xctb9rgl6i-U_R7zHH%MOYQI*)O^;EW1?+7DbxK z93%z(4HYneVcb*2#YG5V6@@0o{=rGTo&Nx&v|2F#3clo}r2aGL!WGk@iu06G-vj$`fD%ZE_EUEDnHY0^y7let8%KpxUE(1y7plVK z1V;BekdG`fR5mZ+B-U)78|g!qDNr~ zgXM#7KIYsyK1R5sn<`WzbSNk2(9`daK9|4ejw}v}?YHNOEI4#&#NdmpiQf`fxuSd#k|rXat=!a_|)cLnkvh+G3MEGTYg_aNnJ z-Kz<(5SGj{f?E4y7`r}n8y=Vfc11H}ds!if_bIe;t4qE7yFoa}x0$)Qu{k;1;0=Xa z4;D9qW*j9Jcf&dY=x;MH79)UE@OpQ1`vQMiodwt-r=SoCpjh6);R_rZ2Fh*%WFh3u z%svk9!Be=t8(k0h_T;4Zw+kTc{9ah#B=NojpXK}~Z1E1THYb9frTK3C(8Qy=U9^tWd>7BYTB?VJ{yL)@ga7Yah^c&7&Fbe=q^Z4dM z$qt?oSQ$t-U?YFC%&mL{cYKqsb_6?@HEeam5R_I#vp_udLx=KQ)(ocB-L$mgRQtL@ zAsBXLMGq)&eJB$ph%b^ z6&4mC+QeVgIZ=B6F)v-YA`j#K3!8h}EpdX%&vhVwL4D>7tKSI*y3Oa>M16$zY&3kH zkXj-e$n;@UYP{NKgFowZkwAC<~PBszzRQ=0M4$L7|YI*Ok_7{vJF!^AVTZ{_p%2D$*_x=A>2)WV~pCLOK8EAEGhf%PGy>oATq{)Z*Obk%Rj>G;CLFsQYFZJ$Dz zEe&DpYYu<2XaLgFre3B1T4GHCE=l?4UV5UWFsWjGyS1WoWL zx9onbO^__d2l)SZeqyOQEhD4ZZKaYODB_pFlFy$Nk*E$8)j3`RAE>cwtE(yl-Y;L) z8C`FL!JwrO+m(ZmkP{#!#+R0tE5M`;BvHVpj)X*JT#*jMbgK5I>E)D_nF_IkgM+L* zJjyVA!YU-Bf!{8{$T>Tg4DZb412Subf;1J1K1iw9UoI~IS)~k3sH&Y2&uKNt-yF1s z@aX#BD86_6srB>S)en%0dM%xDeGRV?8$!*8=#1KjIx5L?V~G_$*h0`$Sl}_F|EIQdkE$_W z%cb&Pr8vu7>A=I?uM#vD+ybuKp2A& z^}hmz+Dq^)*AI@-+aqclm5=2>T3&>kz(y5q9ysv9wb#!X(e zF8t%+!}Yi~v&od+D=3JW{84aB^xR=f#`K*WpzhjZ;N5^Xul5}Ov z9h=qF#@t1a2A|2tDN9PqanGSstB*9f)|rnQ^$#Q$UN4jyGkEAwZKB2Jnl2dG1!}R5 z(*&?FZ(oT=h-K7V0fNx!R-9k5fDVjna*0j`CA%-v#knP8s$agmj@9lQhdaE4W+J2h zeR|z*hD-fZ1u{Te-mxhqt3qt~21#45ZMuK*R7QtKDThwIp=qvG zQevXPV6P@YPe`sJ-eXlGgD{iL)32SiC&CX) z!$T{lLQxaSKeP4i6r-P!iAycs>%U)gWcu0h{JD1=A6K_@!i>!O!h9f_Qi4q(tUz|-plklO@K(v+x%b%)4}iTXP6y`>O?CpC)18ckjeSI2r^2n%$;sa3Y|^|b$J(5;-{Xg7x&Fyd#(sIL&&}N2{dswL{G9IDdocuZcOS-l;HqKDJA{J5D^}Fhj3mJZIO=XkaX|PLitsIt>!Du02m88S_)8R_`-lRcNKTxwaTM-w?%Ld1F^SKa zIyD3jo9+0l%dIcdOWZu5QE?xdx}Nh4byN*EHZC|JeX;6|M7Y1;Z{q%%Ap(iQ1eSZ} z&J2J5H`B50Kjp;~eAi}GA^5h2+bS)#kRQ}rhV~qd$^%ev*jviChL|>$A(9wl6 zRw8}4)3^P2fU7i zJWi##;NIpBNHJZzch82E_ib9$5T+=qdRADdP2@^Y-o>TJg~I9idMkAtQ>4o=wB`Y@ z?}m2=nV76j|Muk`-{h>twr5B}$W3714)@UG`ctK&u6{vj$E_ude%ZZ=ES3`! z`c~oP5Ey7X&C#(yskABEzH;TtMs`7HNmxAqkI{`H%wZ57ZqmeJ;BapNx+3fl3k z?Zrf&b?d?uUe{>s_lk;MNCWw7g-|ly%Icc8#R@j`v|yt!l28`KR6Nf41^BKmdj3@In$LN67!PSZi0WZ zz{162^vg&7+T>;~-fAD6ZJUF->VkC@if9JS;vMCEk!enIt1CbGT(q_b+ z9q8b2?Sx)Nhg~Pk^a@4~-rR&P_rde$ycGJlEVn1sB77_s!Nrx z-e3DJF)YJlbnr*rqL!aNoq`sBS;_e!+47#)|1fp?Q^QYw!u{a@fXg zcrjOQhh8v)VE}OCX(?%b=wYC)}`E|2&s#&a&eHn<}w1 z`0%_i&)iL%+Lj@Ij_Di+{nCM|nwn5XaD2_Wk`{n6dsVKu2X~pcpk3$R z;AC_YyqQ{Gx(~yF7e=5*SwWeO_4)bvtX{}q*-L&0!QGz5@;UdRR2*9;O6PCuct?$# z{tY!!@bsynv4fvq`uc5Od~v9ka`%iO7%JJ2aw=_;zyCBRu?tDQB{d}lihQ+S-qV&h zwW-Aod97Z|z9*~VpLxVA9n*KDnb~2Wd<_q)C9?JS!dKCGN37~Dw&!|LGE%m+2TYQd zg|HN5Ig?klMnHZGuj^f1u^`E0Z51Y0_JfgULlH1@^Q_My2{+!Bg&FCpedo5WoDdy* z`SS8%e?Br4gn;rf1RW^7w&}^HXR{m~!zB0|dVXl@pTN*=Q`n$VnPc%u!4w5vMccgW zZVo-s+xP%rHDdSfNGQk8m|tKTbD3LxQj4fnH*eqWy-QK?sxGzp?eJm4cHZ>v1y=$| zf`?4ZDTNXfu2DbnB=-1B=W*{J`wItLsI$tDoFkX~5H0%X=V!GLU&uqT( zK~d4)UWQC=w+>K`kT9lp=a7l8VBuOTdT`{Rev`o|-LQ(yEA~|NT1!5M8DMOH+K0_Q zCJ^2!%FvSYEA@y$jl;D`MP^-O?%JF@_e}TX9HM$ePzXZAJg7lkh)+X18p2e9{!1rt zbap&!q zMl6g$sr^Y;n}8c9RHaRP-y45{a7AB2_LACpP-V)ChdDfa7@u=6v|*Lsp}9Y4^2+B# zjvtDvVKBYwyQrv1@9 + +extern int test(int a, int b); +extern unsigned int multiply(unsigned int a, unsigned int b); + +int main(void) +{ + extern void initialise_monitor_handles(void); + initialise_monitor_handles(); + + int a = test(3, 5); + printf("Result of test(3, 5) = %d\n", a); + + unsigned int b = multiply(3, 5); + printf("Result of multipy(3, 5) = %d\n", b); + + b = multiply(3, 0); + printf("Result of multipy(3, 0) = %d\n", b); + return 0; +} +``` + +Pas toen ik het werkend had, kwam ik achter dat ik `a` en `b` heb omgedraaid. Dit maakt gelukkig niet uit in een vermenigvuldiging. Daarnaast heb ik ook `i` weg gewerkt door i.p.v. `i` te verhogen en daarna te vergelijken met `b` heb ik `b` verlaagd tot het 0 is. Dit is mijn implementatie: -![asambly implementatie van vermedigvuldiging](assignment2/multiply.asm) +```assambly +.cpu cortex-m4 + .thumb + .syntax unified + .globl multiply + .text + .thumb_func +multiply: + MOVS.N R2, #0 // set result to 0 + CMP.N R1, #0 + BEQ.N exit // goto exit if b == 0 +loop: + ADDS.N R2, R0, R2 // add a to result + SUBS.N R1, #1 // substract 1 from b + BEQ.N exit // goto exit if b == 0 + B.N loop // loop otherwise +exit: + MOVS.N R0, R2 // move result to R0 + BX.N LR +``` -En het test resultaat: +En het testresultaat: -![screenshot test resultaat](assignment2/rest_result.png) +![[2 - elektrotechniek/rts10/assignment_assembly/assignment2/rest_result.png]] ### How many instructions does it take your procedure to run the code: `multiply(65535, 65535)`? -65535 (decimaal) = 0xFFFF (hex) ofwel 16 eenen in binair. +65535 (decimaal) = 0xFFFF (hex) ofwel 16 enen in binair. Voor de loop zijn 3 instructies. -een interatie van de loop zijn 4 instructies, deze loop wordt netzovaak ald de waarde van `b` uitgevoerd dus 4 * 65535 - 1 = 262139 instructies (de - 1 is voor de laaste iteratie waar die uit de loop springt waardoor de laaste instructie in de loop wordt overgeslagen). +Een iteratie van de loop zijn 4 instructies, deze loop wordt net zo vaak als de waarde van `b` uitgevoerd dus 4 * 65535 - 1 = 262139 instructies (de - 1 is voor de laatste iteratie waar die uit de loop springt waardoor de laatste instructie in de loop wordt overgeslagen). Na de loop zijn nog 2 instructie, dat een totaal maakt van 262144 instructies ## A smarter tail recursive multiply algorithm -Voor deze opdracht heb ik niet exect de gegeven C code na gemaakt. Ik heb de twee functies als een geschreven. Hierbij is het argument `m` van `function multiply2` verplaast als laaste argument i.p.v. de eerste en de `if (b == 0)` heb ik verplaats naar `multiply`. +Voor deze opdracht heb ik niet exact de gegeven C code na gemaakt. Ik heb de twee functies als een geschreven. Hierbij is het argument `m` van `function multiply2` verplaatst als laatste argument i.p.v. de eerste en de `if (b == 0)` heb ik verplaats naar `multiply`. -Het verplatsen van argument `m` is alleen een probleem waneer er andere code is die gebruik maakt dat deze functie behalve `multiply`. +Het verplaatsen van argument `m` is alleen een probleem wanneer er andere code is die gebruik maakt dat deze functie behalve `multiply`. -Het verplasen van de `if (b == 0)`statement is een optimazatie. Deze statement kan nooit waar zijn na de eerste iteratie. `b` wordt steeds 1 plek naar recht geschoven tot dat de laaste bit die `1` is op de 1 positie staat. In dat geval eindigd de funcie direct. +Het verplassen van de `if (b == 0)`statement is een optimalisatie. Dit statement kan nooit waar zijn na de eerste iteratie. `b` wordt steeds 1 plek naar recht geschoven tot dat de laatste bit die `1` is op de 1 positie staat. In dat geval eindigt de functie direct. -De asambly code: +De assembly code: -![slimmere vermedigvuldiging assambly](assignment5/multiply.asm) +```assambly +.cpu cortex-m4 + .thumb + .syntax unified + .globl multiply + .text + .thumb_func + // R0 = a, R1 = b, R2 = result (m), R3 = odd/even mask/result +multiply: + MOVS.N R2, #0 // set result to 0 + CMP.N R1, #0 + BEQ.N exit // goto exit if b == 0 +multiply2: + CMP.N R1, #1 + BNE.N check_even // goto check_even if b == 1 + ADDS.N R2, R0 // move a to result + B.N exit // goto exit +check_even: + MOVS.N R3, #1 // set R3 to 1 as bit mask + ANDS.N R3, R1 // and R3 (bit mask) with b + BNE.N odd // goto exit if b == 0 +even: + LSLS.N R0, R0, #1 // a = a << 1 + LSRS.N R1, R1, #1 // b = b >> 1 + B.N multiply2 // recurse +odd: + ADDS.N R2, R0 // add a to result + LSLS.N R0, R0, #1 // a = a << 1 + LSRS.N R1, R1, #1 // b = b >> 1 + B.N multiply2 // recurse +exit: + MOVS.N R0, R2 // move result to R0 + BX.N LR +``` -Het test resultaat: +Het testresultaat: -![schreenshot testresultaat](assignment5/result.png) +![[2 - elektrotechniek/rts10/assignment_assembly/assignment5/result.png]] ### How many instructions does it take your procedure to run the code: `multiply(65535, 65535)`? -65535 (decimaal) = 0xFFFF (hex) ofwel 16 eenen in binair. +65535 (decimaal) = 0xFFFF (hex) ofwel 16 enen in binair. -vanaf lable `multiply` duurt het 3 instructie tot de eerste branch instructie. Deze word niet genomen omdat `b` niet 0 is. +Vanaf label `multiply` duurt het 3 instructie tot de eerste branch instructie. Deze wordt niet genomen omdat `b` niet 0 is. -hierna komt `multiply2` waar de 2de instrucie een branche is die genomen wordt. b nog geen 0. +Hierna komt `multiply2` waar de 2de instructie een branche is die genomen wordt. `b` nog geen 0. -`check_even` heeft 3 instructies tot een brance. deze brance wordt altijd genomen omdat `b` in binar alleen maar uit 1en bestaat, dus het schuiven naar rechts (de enige bewerking die gedaan wordt op `b`) verandert bit 1 niet naar 0 voor dat `b` 1 is geweest waneer de loop eindigt. +`check_even` heeft 3 instructies tot een brance. Deze brance wordt altijd genomen, omdat `b` in binair alleen maar uit enen bestaat, dus het schuiven naar rechts (de enige bewerking die gedaan wordt op `b`) verandert bit 1 niet naar 0 voor dat `b` 1 is geweest wanneer de loop eindigt. -`odd` heeft 4 instructies, waarna `multiply2` weer word geroepen. +`odd` heeft 4 instructies, waarna `multiply2` weer wordt geroepen. -De loop van `multiply2` -> `check_even` -> `odd` word 15 keer gedaan. Voor elk bitje dat 1 is in `b` tot dat er nog maar 1 over is. Deze loop betaat uit 8 instructies dus totaal 120 instructies. +De loop van `multiply2` -> `check_even` -> `odd` word 15 keer gedaan. Voor elk bitje dat 1 is in `b` tot dat er nog maar 1 over is. Deze loop bestaat uit 8 instructies, dus totaal 120 instructies. -waneer `b` == 1 is net nog 6 instructies tot de `BX.N LR` instrcutie. +Wanneer `b` == 1 is net nog 6 instructies tot de `BX.N LR` instructie. -Totaal is dat dus 129 instructies (3 van `multiply` + 120 van de loop + 6 van het einde). Dit is signifikant minder dat bij assignment 1, dit waren er 262144 dus deze implementatie is ongeveer 2032 keer minder instructies in dit specifieke geval. +Totaal is dat dus 129 instructies (3 van `multiply` + 120 van de loop + 6 van het einde). Dit is significant minder dat bij assignment 1, dit waren er 262144 dus deze implementatie is ongeveer 2032 keer minder instructies in dit specifieke geval. ## A smarter power algorithm +Ik kwam wat kort in tijd en heb de machten tot 0 niet werkend kunnen maken. Hier wordt p * n terg gestuurd i.p.v. 1. Verder werkt de code. +De assembly voor de power functie: + +```assambly +.cpu cortex-m4 + .thumb + .syntax unified + .globl power + .text + .thumb_func + // R5 = n, R6 = m, R4 = result (p) +power: + PUSH.N {R4, R5, R6} + SUB.N SP, SP, #4 + STR LR, [SP, #0] // push LR to the stack + MOVS.N R4, #1 // set result to 1 + CMP.N R1, #0 + BEQ.N exit // goto exit if m == 0 + MOVS.N R5, R0 // move n to R5 + MOVS.N R6, R1 // move m to R6 +loop: + CMP.N R6, #1 + BEQ.N exit // goto exit if m == 1 + MOVS.N R3, #1 + ANDS.N R3, R6 // R3 = m & 0x1 + BEQ.N even + MOVS.N R0, R4 + MOVS.N R1, R5 + LDR.N R3, =multiply + BLX.N R3 // p * n + MOVS.N R4, R0 // move multiply result to p +even: + MOVS.N R0, R5 + MOVS.N R1, R5 + LDR.N R3, =multiply + BLX.N R3 // p * n + MOVS.N R5, R0 // move multiply result to n + LSRS.N R6, R6, #1 // m = m >> 1 + B.N loop +exit: + MOVS.N R0, R4 + MOVS.N R1, R5 + LDR.N R3, =multiply + BLX.N R3 // p * n + LDR LR, [SP, #0] // pop LR from the stack + ADD.N SP, SP, #4 + POP.N {R4, R5, R6} + BX.N LR +``` + +de test code die ik heb gebruikt om de functie te testen: + +```c +#include + +unsigned int multiply(unsigned int a, unsigned int b); +unsigned int power(unsigned int n, unsigned int m); + +int main() +{ + extern void initialise_monitor_handles(void); + initialise_monitor_handles(); + + unsigned int n[] = {0, 1, 0, 1, 2000, 2 , 7, 4294967295u, 3 }; + unsigned int m[] = {0, 0, 1, 1, 2, 31 , 11, 1 , 20 }; + unsigned int r[] = {1, 1, 0, 1, 4000000, 0x80000000u, 1977326743, 4294967295u, 3486784401u}; + + for (size_t i = 0; i != sizeof(n)/sizeof(n[0]); i++) + { + printf("%u ^ %u: ", n[i], m[i]); + unsigned int result = power(n[i], m[i]); + unsigned int correct = r[i]; + if (result != correct) + { + printf("Failed, function returned %u but the correct answer is %u\n", result, correct); + } + else + { + printf("Passed, %u\n", result); + } + } + return 0; +} +``` + +het testresultaat: + +![[2 - elektrotechniek/rts10/assignment_assembly/assignment7/result.png]]