ࡱ> JEFGHIF*Nт۳ Y*JFIF`WANG2 CREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 C    $.' ",#(7),01444'9=82<.342 i }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?Ѷm:LREQEQE܍L-QMM/L3NQLy5=XMqq' X?|%bVX?|# rgK6 ¢G4'  ͷy!HAx"I9ϙ6kR,cT]cnAJ,1Ymi鷾lFƻcTQ = *HVA\RqIQӬY!/PdJA5o:MfӮ+u~$=kwkV/nF )s4ޚcS.* |WB襎Xuu# ԔQEQEQEQEQERQEQKEQEQEQEQEQE! s[څF@3ɯWNjˢ^L|9M$K^ៀk3ϖzk <9SI 9MvQQ5EQ( s2f&K>ҷTr rEr4_^Z fmX6%2J:״+2#"z6ycOh[jtj?k:"ߺox~4Etrkc9unp?*xE2q(@¹:mkrQy"jo⻟@#mOS^V~iVQ@qL4H/`[$6+3Q4Z&K(f ܼu~$*inֳu5!a? H4(r%4xNt5]>34ף2K]6Pۆmkw:FCoT4gr=+pjxU ?*? 6#^%1׬xR.4EB2Mp+*Q GtR1G,O#c ¾CQ>'%7A|XQkpf=6V%*E|.'PӭnapTs򯡭mm*U=MZxA)@-nI#+ſ 5 3M-sj"X S<'K]l 2E} 7ɝb }* -QEQEQEQEQEQEQEQEQEQEQHzkM+̲(rs_9ǚߍ/v4 8?`{}м/xr R%hw2Xڤvq 'sIK5FH6*? h^'RW!~VV+|-]E1&=mR5E(WcIh/޵? $ 6%ٌD}*Oxz/ecm:r1{׿ibL$J +ʾngC^5TWxݲSRJ'K?4b\۵} {-GCӂ fAWVj]/ڍ66~5|;:3I+:Mg3sonMڑ׌pmoZq\\JҊJul&]!qYfXSpѱ#XHG*9,/_In|^ xs_nFJk< 1i }­u-%!J(((((((((()@Ҽ[/;Lr(9 4sZKoF7}31uy2^: ڕWnaZQ^cxZC5 #{y~hq4n٬|\qҾw+M\S ⾗VWPAdyYzݨom2W+/jZ]QX(uiؽ*иL ̺ cg+0$5~{y Oz'58𽿊=qg"5Ah xxKIJxgX-}_5b:aՁR2=k>3,>p%F>Z|%`4 ָd ƼoZ?!62GAaKM m^Sy>w ѥHc]Er3 7w{pCQO^:ϊ5+^M>/0dtm졊_:UP}kGc4; rTaG"y #gdJ<UmY_Mcźglub@~e5QEQEQEQEQEQEQEQEQEQTyG c+築?Z]+CdI0<ҹ_;|ev;0ْgJc|3`}G+TA'.xͯkHۡDoG9h$<+q;(P9$N/\jVf;N/zNWUC۹\U#+7^O|S tqGnk`Mn$#pZOKi V׊m*(/. 0ֹ/2ҼW($^IPbxcږi>%ɶ&|xᯌ5kUKłMqs^yYV5@ 1׼[Y4rVQ7c!ul)?_TcYۅ%\~:QLwTFf` OJoֱI}M{4<9[i n u5cmj6ڎ!Jx|H|\ RyWDktG2^5 j:,k ,с+t_[.2A4M 6(VE"'EQEQEQEQEQEQEQEQETI.%_ďW$M7Nш$dsĒǩjHir_Iime)HEhqA/jmnOGc/Դ<hM ނo豓yBU5ɏ31oՎfV7 4L:ҴW?&owSђ E|cZtMnTNA_FitW$jq*ʹwVA.J:=NgúLq9,qQ?P)䢂IP=jڥ􂩟9n>2<xӓŚ [fufwI?-AZ r#XڃW7xcKuK۸CMlۑȮc-yŏp#9S{xP?ɯl"F5u'/ v Si^ɵCv7G$;hZY3tg'WUËXıj 2y]k"d=W?~!YRi_x-QEQEQEQEQEQEQEQEV+hi$H2OJĩCw.R3`>|/_T)`*>}'imvGP8W;yhPy o#I]G{k%˺9)5ZvSO^ZIc#]W¦r~lk-;6ifx*e7EWv]wJmcJNNVF@kZ,g&YFI5*F bczou(UUk>9Xh]:\o];I"~|G՜5+১Vu1;ո~ig៼9?_?AQyWj{|j|Fmu˸{U)>xMoxWQ;3?5Vm>4jk<@}E?һⷅu;ՂCq]ݽbKyD=5ltV>{e,S"-mo 5"ws)נs66g+cw>0Ք~[ts./ ߵaש5R2[A!yz54k.xMP\%` #_zr=ih((((((()ŘI=oyt-&l@HJ]l?j xE$U\|qikCPbWMq'Éj]#4NUМ0?Jk6:=7w1ƈ3 7ѧvhaֿ|su=^OX8~wpk>LBVJ5k51x퍬.+on<;Isr"f[>2ibŚt|0+i+6yzyjsJѰSWjռ5OFBmZkTExr.b xVγa+ح-" (UQLu m6K(MxcǖX+CYaxn7ۻRpG;źd*#k;Pռ P4St9WEb^6yv^4jvu2W`: Z(#{Zi=C[xDbPng5-B)μTQv j2Ǵ V|;r{[xKKv?ZmB.-fIbq)Yx $QeB"Ny-*[ǜk&Ծ+kei-?t+Yxke孔A#D k7'|}us:Hϧ^t/hOhf");s׵E4w,0daa^Ucz&a]B >7o<-@[d5}gjvƟ C iEQEQEQEQEQEQEQA\|UoMk\y"%'MFR}p3_Wx3С X֝a][NpvƤ?GS-k)m.Y!qiMgƫ.M*M?ƻ߃VΟ& f2r^8mj;\_؆kHzG_ʽӌgj6]^Lă%׊jF7IvKZC_k5?wr8ׅEp~;e2u'A\1)xOvmq^[ë~ex!;H6yG>64=Bb-?,~( QEQEQEQEQEQEQET,$N)UWcelB}kվ t-uP-{;tƋ[]_HLVk,q^OA9mm2yS]+?R-uk)m/"YaU|  5'KM'=Sǚd6̻nf샽z<e8E.fiRkK~(3p>T,k?|]9B7 ? _K͒X@||konfQOݦm97$}szP !x6UK(sYk C\\n>|Q}lBMGQף 59j4 㷒:v ?Wc]FCQ^y^yOxYG\֦Mrpj# BےU-x1oK"_\wqDeQɌ4RZσ|U%,,pƀҼCڼ/Ֆf ~t.g^<ϳ lo/m|95M( | [_ ev/3LܜoKQk]: 6a <]K"RH=kt5K lPZVƛrq a 8+WŚ LRosGu &hyCjMT^/Zkvicf?vOŲxwB֙7ן5 NwjW_;uJ%vEx-rY3<֨'d3EX: }S!8ߎi~EaԠ>~7\S:W|]ާ}&Ny3e#'"+^0l>6X4Y=֡r  ~'x#ðJv^=/ÏKPcS m+~(x:?jcYlr}x)ܲ }}yaAYCwT UҊ((((((+?SMn/ep…M|}}f>-nvM/^3_M;~1;y[kc:s UI=Myx#Ŗ7(;3;RxŖקMfϛIpzޥkdrSE"vq^[=JӮ6ڽ2AJqO3_^:F XWiVgW7ţ߻ ^img[Ek(EV^Mze!#0 s6UI֋ˤOBӚ]kD3ۈ|C:/DRk !7?fn/dDu x'Ě*3(2޽VWW+o>&_~U/.'7:&n?y]~i^{URh>QTGV-nzQ1yfdGkz(u+s~*_vZ1j#[f;vX:Ljt.|< tq3zwzrּMߋ>(}X-V[DqJG&| r+>Q%eP1jk^:&uKhktrp8VW~ݦs&f((((((+ž;;HMLMs̀\? k {O}>v^mmحTVC7e^Mж:vuj.-2F E<|?eˋ-6dl4,zUi_j`;r {W=sV<o4f6M"9x Az$#FrTJox [٣ҭ+oz֑i}{oy6rYi#{ƛnEBKWm_^7G'oagmuM 89>DvO F+f?d/Ү^T]cP_WWk:**yoa^ QM.IB[۞ M{-EtH֬69Q0S}k%BH-,,dAֻxŚ$w! X5*") ⻋%9{ 3';Ew𭷄? 4c'dҞE|;tgz*Vg%Ք4L35DƓ,;Gn=+%_QU4]f8U#=E'҉C&Q^ڕ9o5 Qx87ľ#ƻ0Ѯam)Z7enດw? ~2k,o-ﬡ*R 6->."VI>(oheT$^?,M;I,Y#A]Ox~oQrbg^ooa!Qs1Vy]h@;5zKíLhp3W@(((((;W^~ Tkݧ5 |: "n_[*(*N:dSrsw a|z0kzkP)+wc j/kiu,Mz~>$&pAjτ~Q~Ɉ8=kXeX~j> oI$:5Ǽ^)vi5Myxwz&c]-n[|n6{\/&aBB=Hz$Y۴Hkbz X Yz'~G3$2s[KGtE+s=V#EyKu$W"P$ՏbToTsФ ߻aSGҵQel?rLӴ֯Nb? 鱎_Nv%_4ؚ- t\*1f{!{?LXՏirkǩ&vgZ4>yMr@C]Ay4Z>ﬥVGySW"w0Ĩ6[hk1dV81!QߏtZ_5/j knLH-8"^W%e#K(фF}%Cj񯆡O,Am-w \?Kg4\g"HhڂF"cĖߠndӝ*_ ƕzy|358q8WXZKs1csjfk1Z˾\wſsw4qn<Wďː]4((((((ȯ~<{XV˒]R꒡ܷԵ-A46_ #ֲ-o1@Uw n~{Qǵ~=-<3b |ώ벽7&!Tu5kWpxn.$A+حn`gD6 "J,(WzbG?`Yrl)e2Mx_O{ wO by^XxCL /v5q+[98Y~ /GN q]ei/)*?xu';xl攅 I^T|7 D1f}9 "{q^Vw,-C&@$WTkAhV׿h7Q>S3}\qkKm:[$1.I'mͦY6UP*;Wf&0Vms[Iӄs;Ivt71=OL,ed0 SE⏴[B~A蠚'Stom\4R`G8{z֯cv0tP`ڇ CF9ci յQjr#$g> ^&ݶ*A?<9;SlOWZ:k |'2c`2]<][:"NNϯJF>'jwTbdcJZ }+w^~H"81Iף\4|5{Tm#_UxXMw}X+((((({tvS9ƌğa_2Ɠ6Kg_^xgLO21!u gqt.Akw|7Ϧ]m/<,::g~h4&m%aҺ~(xk"[ubGL}+o̺,&7OjZZ//@=)9תM㒅8Y/qs\<xɺPa$AcO5$o[hsK/$.z2[r|yZ~+x]>)j7ggAx" i+5n$#VW0oåj*lH77/^ Ct9t_|Ga#}?k?ɑ_Z]#DAw+WVZ%׊_ 0zQ⻏j;TcҺxW^*Ok?-Nr[WuԺ圂n<;x#7EƯoho4Oפ͢xFfc$W1O~$6icbGZkZƐuy9*IT o h;+!\>2hZeÍ0q,uO4%hB:W7xO[8O/8HsM?H!FyW>> o>O 9A^Z0Ad\V Iq3Xx^cpV~:f/[rZωP}Α>Y+!c!|Wզ6C=@)8Eb{Ӊ:lrzҮ~am3!Ҋ(((((;W SV]#n_<%=) uvG?6@h~+>WYSOgWxh63i,:\3_AVKaZ"E? ڃ:bKO 2^[gHm`|s^p4_|D?M?MȀFp\d^ii:jZķ ~3\Kf|c]p‰EgP3X$ sN,jpsڼᖉ?YRG]7Voi887z.j=SF"⧃naDwVH|gz~G]qOV.{MgVY Zb8'ں1rV&uuv>bȥȮG)>κ 'A_?WIc\+a׺!k3-.Ogm/ XG,5tWK4p^GTP9,p+>!i_c_<}ki#TϨ!=sR J,>&h h(O#41*i\j|#h|,{)7fH¬CK<w5~2xj-gmoRO_ŤwSr c"/x'9 :g-OW{cvZb%B+_Km+~Cgۏ]d-!a¾9wQ| n5 yzd5}?zYMRg^pȬ"4Ka!w}kh&}-@9eɮុ/eLA?Ȯƚ%V"ϭpƋw:/%-u h֟'R=4j~ĖX[lW :j7V0_3>3Z.~!x Z[wH98ֽ+V#4 s^;*]D,:׹+Fu4\<-xՉ+5!NJJKwbo-4F܋z{ױk"/6R(_j._[C 2Fps\2ַ$<s槬$ 7@.HX5T[լfᢶm Wfuow-lFckc$sϪ1777kM͌m9]L^H@XmUyo|cOMw kgivpo[x\5Xƪ}gO e{-]lF_h}(=+E}i|C! 9gְu?M񞋪rZZkmb:|$~5ƟHGae(J|Cڴq[Of?o/.bU x{u+ ϮYC= ƣ<'}eiMRqXc3V]Fw[|qsZ~jFDxf_ƻQR{ K]o$.]hlC_ײl*0BY:|?VCd2|J%w2 Cl/SPXDW`;א3;/W&;RW.ZҊ(#}3vczWkVڷkvϦ6d3Wg4, }*ޟ=LU[m6qܦMjX]B"AYAk;kUD=@}寏:x*OI$׭|&&*(((((V <&,_s('}[@ +ɭjGNh.%&GpHֶ<j\w:%ܗ+k)sI{Q7Z߇NםKzgXXm1)obkpX ]7Qeq `oEݤcuxiö pť0%#j4 ~`n-bF4 ?SL46GEe#FA?Ox]ktGF03^-'$=X6*Ww4:\N]q?V!Q}*iffvZFWڹ/Bκ (#LAwn"ZRzW|OHH FT)ָ C㟉/1٪[„?G?B@j(]T8;Nq^&7ާ'^0á{X״]?R1 gV gmD\&~aڕp}___񭶏ak s-ܻ0thpZd=xIs^EQEQEQEQEQT'1 6`x|ů_i٨K8#QW|{eMJb@In;] ;/ʚ?UKIMJطt@J#Xy5@kx#1so@!A5'孚H(,~_ c }*x>ɩ]%ˮ'r? ZytZOl[Kp~ +_o)-ZR.bŝٷq9>"i{!i{\cQې> Ȭhb!\v<W"tmƖ'k'V{--Լ~VKn/n)cR:&p-杇ʋް'sɫf6ZW{yLTqNԾ%\i#%u/ @ ^c,Xy91S+]F!Zf Y*-IA|u ݵw pqZGXլ@p=EYv_Gko9!PxSҼKkxLK8dY𷇾xqVC{kup:!'v‚8KdU* q?‘HPژ~*xETy{"֎m+ReKApP9t;1ιoN:4vc&s9+L-gW]B8ܟ¼Tx|%!oN-kʷfb[yzcpuO]Y^Ǧ&-\O+~:Ϣ%4c<r8p5;d {eku^>+)Ͻm?oJCs*ך(}kmѫzkh}Nq9ʻ5H^EQEQEQEQEQYz>5} /t{bYg k=Yi UpdE|}Fhn]O`븏_ᶳ]cJ!km5ŶE9#\U*+ {-4WxOZf]>_¼ ߎ:̬ ~D׼y)kd1z5?4Iav֤Vgw{{Zܐ; ʒjNw-q`p \gl#݆FbA OR?:jI{-A~&k5[y#0u,$cH]mVjpN%aj};z[!x;~ė c03of1+(՗崻no5IE61Ut[MSM2I ]^0*Oxm`uijey4KN:H85ھ}iq{B_'yŚ ]>w_QBkY.KAk<()ҡt,+h-l0e@**c6x:C'4W '>0k}&5KZWg[klcm#ci'EtT(?j|5X|rndB- T]ڶZl"P8~n%wd8x/tM2OJJt#T hœ85l^'>it?Q^X*HG<:'Yg"^]}XGѣm='+OuI5G@9et}+>>6k5Ze,OWxƱ<,pRMq%cSr׾1#1+׮bZmD)ɵWX7𯞙wcZSOM,H0H@NL1JFU8k ҷAں}n1LH5(Q+!Tui8Ȳ?V#vB3A1sJ|9g^^E}]׃|l֯t/iW#>Kḳ~_ t?-pan᫧mATsَ+zZn/|Ă㬨< 9qWoP?#Hʺ#)dW#xC՝/٧<`;Nk ìFվn~چ{6I\#~nT~/q7! _X4)"m$y4mNKh$91 ?/ _}yMwQw[y3tV_P8 :(((((u-ꎦF9nzA}t*U.=B-Ṿ* 7FӴ87}jZa|15xW`sWA=cgDg^iiS-ĐD+~}Y5Mnw8xNs=›:PxWKi=F'`ɭU`2 xg[7 pg_ֽcږ}iQ;W|⼔ F1sk *0ʀ7Z{M99)H KVV+"I\b?X/m[ܸHFf'\?<˫iM=:_.+MzaF1ʳ-nY?UZ MxŶ!Vo%U:4O |,V15C gGT|* 4'V_ \nfZe5dQ:^݁ƹ$w.}JUXC+jvOAζ#TsFK;KƔȏ^޼㴅C7//zސNfq"xHxiT3u=EuY[EooQTp*;Ra}/j?Ez;sVG⟿[?}EQEQEQEQEQU̲OFKׯ4]C +P oFnjkbTMWN5s~5=P,?wy&~'1ku} 5Qx1_v~ ߘlKk wFxsI#dL?y׈>I 跗8W++Y 0A'-vӯ [57@e ?VӴ:5=svv[¹\o7Qz \U?o5EC o8n Hs^\ l69o!-CY./[tyKimMqg>HSMsTPӬDKҘ=ƩikVEp/=i$ Ecs.~&w;ִ5[]^%ôI_硫nZ?!!(;dk#z4Bg=t񖣯_^LdXPFW :oH״?GՃNneHӖ栓UѴ3@l kޡqx#IA<5yiEDY#w~w |c,;NCDV/>u` =㵌 $Oeow@:|?Gf{M+kAE ºG!v6?_^ 1PҼg/|=umS^w70^jQGjܼ8zV=īH2YOvq뫲IfYbnC)ȫhɶåEnZYx((((()2z/d*s -I9y*_jMzFZ(Z¾Ծ$K6^J9#$~ k>H\<%IJ6y?{WvvV:[İkZ9h^g2Ӄ`G^ WosT_/G? u/daH;|Q Ed:ɎGhզGyg(x~^Ƽ㝳K 5^Ch67L"gVC`z8-kz_PH@Mx>9^,?/zy6[ꗑ M&q־q2.;D_ݏmf˦<3[Ն8W'eˢk:4MxҴz](7kh wQgt+m8EvatCJORj|2lpXJ;kᯇZ+#37Ax~NV2uh汴_6m^]K}7):jv7GeҐ ~Oҍ T/9Kg}|/=}b|;ahiS)rƼ~{K2/kVZ|k׭kU!N2Pvc.+OWlb^lVJ#}F[Kּ?OoexgF H$WSZ|SM9eSM3Ym{ J%Mѣ_n?_XLӦ-4}2i H >Cފ~\zF]Z ['^@j&ut# @7t=GX2ʻw?ZuDŽ|{uᕙ?6;C|C^x=Cfa,s^EQEQEQEQEQA_$k6^?|af]5 uOv9tOš 4'5|7f*(&t=r87~,JM.n$epp^k 3oks/2R λ\B[ysA)OQֺ?u1TާXc90=L1Pƣy '̈Bi~ eaxv֬Eq,j)Wx#$;4[͍ # ٹ W9S]7m6fHb^y-Ċ3JkǚΦZ\;|ipG] wjz{Wu)ΈARď]:g@R1q^iJ"1ҩg ;Dd690`z 8|E!Tui8Ȳ KI)qHG/Z~R$HH ǿ5zu4s\"Wz>'i>" mrMFolנRQX^'F.3+>\.+; ⦭seᆲ25S\FSVʹ6$.#DuPda$8"o!xNg}*ki,@Xбx{v~ kE?t=wQoᑴ@mgaOXtI{hMy ] B66d%jNYb2I^W^oWkezq^?|> !9XF07~QEQEQEQEQE|C5]?Pa?t'Չ9xdHbϴ, bsMkUY ႀݓ] 2YCWKa *#nâvOQXZ74;:fomkv,W AٲZ0knb͞ED25ZVw kjЬC]F23Uiz֭}b&kч!y׫>wt,˂پ|_cPl=9fҬ y ~_ʴx8bDOEyUTdڼK?^ yY&^7Ω~\s+)RxkźՍIF,j$;H cAxԧTFy"GR`7/ݶehMK|#7/*kAOӭ#Pz™D;#!5=?tʩ*;tPp7 OPsjKVp+>4jS >mqn7_+oVn(^Upd#ǂ3@yl)"Xھ2麲yEp?Ǻ^$w H-9+$cwجjP Pyeş=Zu#3G_K֗2ZȞa3<I|w=`Fz~yo3i [AݹwwFi5':X6$8FA xMg y⻽7K,$*cc? [?|헐uj&`V<"?|Kruݹ%뭃}}!c> Q٢(((((& kgx^w W[O`ͅN=}9ڠwyQn9l f{maiR4fc+̼CD{{{N~7n:fv'N_N,Y,W{QҼ#4 _zg`bpֽ?k?\2"주̄1^x[(/>d⭷/yږW|NԡlM^:]x.'< c X}narq]G_ IJ7e 2خN{BD$^C]_<A-pw4-֮9*zfVMEE^ (> yV>*#HبX0yeJ~ʠ7-ԛm{Pk-ɾz ԑRIX4ڌo4gL&'*sqo@Mb8k!:/Dnu"H*58K6Lc"X j4K?g~l]bڬM] mHͥۂɽQQaSK/jh-׬FR2j6qrcKg=kƾ^*NE״wO<=+l>i:5yIخ_he bD*/#יW1Ck <70s-oC}HͻnH UMka.+>:xYXihiWEᏎaVD_O4Mn :2g` oAKQ|q J>[Z{;ۦٱ)QEQEQEQEQEL: B/#M͜1\yo?¾͂d9ǥxſZxWG/vɰ< M-b7!MzlVV;x@r)ml>hf`*x}Zm?P'BżsޛOÃDy =qx¿Bok2ko--[<lEmI/EQRM,pHʨ$9&U5YGFk?FQyeq( 86(_0ޕxCZ悗{7SW޼_%-ofK .y5^,A ۆG+dI|RGgI;mLK,jLI +2V༷`J_D-LW(q\y#~dE?5<32ohu^únyj7;Z-[Ð?;6~vjO~1\V}Zus%,sj/+zW]x.ħZOHb ʨo/B Hq^q| 4^Nqʦ fE>"+y+)k>24[cfNޣҽxQ+>cZlm~Gq4qs+I+nZ((((()0kω<*lfewvW$j#qJ xO"=W⎹^|k) qs^E&xL?[xy2L֯g4'GPU(O^6Rnzku^GҸOn,$=^uK{[ 5&?>0Lӭ~+g|QMcp,#cjo> o A^#$WRr+uռcx>^M= { <9]7b pB>f>qcW7Kcה.Tާ'Zo~ E$ ˌhI}8UπlGjٟYw0^/^GA bebF\}?W<\m~>d?6zZxn%Z/:>,C9S\7Q&t9=z W|PvI[~UTh]_;CJ_R٘rSXxvkHn_b;^[u 4,̮ x&f%t.yZVo^[8hPC#Hl:@ׅmmvbWPs]x#RъLJ{h.P$Pk| 㛽n("p? Ofu_Ih]) 'q:m9J((((((xOlӘ3FC>x8+ȴwyM렂Km? hO4粑gk 鷚Ov Xu&cy_ I׸\^Z~6*{O8܊HSGZƩ[=֛pۧN}EUimt<g\|ALjk}>& WA vQT@Ҧ#">kA0s\<{s^ t2|~+L!<2659#it$մ>!x[4m=sGQ;{xG¨y]7v3]H ]<73mb.Ҝu5EiX=uF𽍒.ݑ ܊:~l um9/K"2BTÊP3Qqd5>/c.Tvt5nM[×9Y!rUM{5E}+7k7ˣ˟n碷{Ҳ-*T1\*WW7xZ[ɎF:Wl^)e ,R2@A\ΡGREc+):<+/Bk,7vAJXֶ~7bX$l~WꚔF=˅$,rk<c?}q[&Ȅ7JSW6Ǧ[sll MFfI#;WJk6\ Z6]#}\׊&.y~d+{ uqߌ}GivֈXc VQEQEQEQEQEPzW;5 X:/+WZq1%^m3_cj:|d O|O3f9;z_xJ-o퓄9${> zd>(i$;brGZ>giYıƒIu}mcN;Wsc& ex믇^=VrQd^ݤ֙ UV쌛yc?ʬ)R0x,|ahTCz1̽s^sx\{ 1%;b9}kb״}:Y%LVt2 *-^,{k_#nN:Wzcx5umlʷwUJ=K:8A {XPxFeж\qu{^/6"]?i_z%+mz|:T`b8ѝ?uaV%KC|dpNkH#hC Ic]{ęT~Bׯ* 8S>(^:3\2 x~ |27:hjv]i+G$T8+ςEΖK%?ѼoO5Ő9|muGKm`}IT1NEղ1^kFSaN7_@ O߉ɥCW1k֦BRa2;Ҁ t((((()|Ÿ$т=|W|A<>t{5aXf[;UmooP51\?>!Cn:qs^ox%:05 bx@>t$t> /~x+; 9;(xgM%j"c_=,znrp>xO2ގ$f7zteXȘWSA:|v;cƶ3\?iZ}3^ڼM<7ƕ+;#>v:$܏{V4]HxpE]gtp*0>W=O]͎"CMyƯ/MtptȯG_Í/‘1qxF^w9AKER1WKgMkKWߨ܍"T*M6ٵUwj76[תqҗ`T34r"2+[sCU,YrC'BkuxcO쯶lE {/ 1H?[ԍK1>?qOYZO.!gῇÞ)CqMvQEQEQEQEQEQE|L70$y㜊 ^/g܊ys)}yeyWhP5JdH|[^OS /y\] +Wm<7e>m#K';N3y[v(j+1+.Z'."m9q4.Fes\ÏOouD^ I(p})C( W⟅ݥ}%c$?K}FNN+WK,-IMg( wx:*jz+ⲷhFk G+c^ rCklుa#F pcڗ42`GRxŶ^dUQ5ugU"H GYzvcOq V;KAY?k"l;^-,>)~/Oo+UUT` ?0Ўm 7\6*_|&VI= WJ1ҝEQEQEQEQEQEQE5*As_,dFڅx;FKoq^H*y_>|Ix/?oA'{|9\P𪂀k;N43dص~ϺaCԝ~y'Wꚵf7 H9,kt?C':-ܘ,A*=s^oq)4.7PGz󯈿VYxߊ4?Pq E: 񦕪&y߀v u(Ԁ3ßĒh"_&4R ^W FG=iJ =+U𾏭!}5j7u!զ~Y"m#ēEflLtjTҾ/.j%k&_֝_5/)µ>i*VMJNGuOp^&DB;jiMJLbº;_@~35yn}iͽ1oV6k.x%}k<9ͤhZM3*[ [?z[<.,Ƽz+C2鱶b#Z=œ2 > ~<-O4&y74>`lཷKyVHd25x:w"+veITa]T}4ifKnmީAܾBĚŚό|[$2ģ5Ï -onT y[k(((((((ҹOfxvDaRbltjVPOnh :dfοoM PpC3i۬c ؊ƨ 㟴Ӂ;8R*| r}쩹 ,xt xj^&Kk xKº,)hl>Z:Զ;hQ.^Gj+ 6hڎ>ϪE#/4CpbLf%7WF A=+|y;Bkk YU1mF㻵k4I!u"AxQЭIR2qW>|A SXp4ZF>o<ѵl#nrXhCKMN1FGQ(ڎFOݱYZϋI҈\f<[X Ge$vVcJiu=sƞ#[FK=*7,J~fi=>_د3O׼OizYeaL0{΂PIF\l`mҸoEӼ%fM|G מxkߏu/[=ۢnvXGoo4UQwTFa7{o?yi+ >Ycq |WφӅ?,L3Ǩ⺻OXK [v=&//Gq /[.,)b(,l4Rvڳ/cc5e&Jj^َ/ֺ?4zZvIP?|UYE·G&㪹zJՎ`|)Y;$r=EbxEYk4xj5kbڗb[FŋN+WZNEu4riv8B ziwt]:]Z1Z|-k-E[?xHEq^ݵCCsq -,*F,q?|ZyNX1FB7d_&M&-{qq"U?QH@$l4h IDSn\+\6l* k~,(,"5|צ[gCQWpGA_0}U) }k I>".l/Tc;=+ڻW -,"snJ-QEi6Zū[0Wk _6)+Wß]7Ķct)r0 S!IgXd`j(hʞbTM^n!cf,7dj%\e.Z'`R1>][ԏ6rx5ү7 O<1YOq"+k!w"["(9=Mz_è5I1n7_#FWogkuq|jO NծSCb*_4{cY\|GY|ɷֻmk4N8hZvA%Q2H_|Nм4\]tX993e+&ߌ/|>)ngIuS8v t(K2k^P^y?ɱ-hv\N0+ۆ6Yޱk]ȫ`OZ+>%@]џd1¾W4𾊗WHGz`Җ(((((((J|S_X]v>9S_'ZV?4/nxLq([Y[޽jZ(3Epk/_Dq*5yρ|iu纶>Kp+OGַ|rdہ}'Ś.cR 4[kyABۢcՂWDӓQ{i\a&ܖЬj͸W8v+B3Q-gr[@FXcPԬ#/ws*W`+2hN,zd~> ;X_MӛxcHzB^ 1A*"Q*P-dQEZ$ #V'|1aI G.G$ֹFs1=fNVRl(}k9-uXs~((((((()O-`9W'A๷~Wa_Ox6~2ҖU%%<]#(UZXU@',EC'Y(x[G"x-[pk_Ф~bB fŧo _0F]H>F4RSmֶM>Tw`9}ϊx9o'`lZ|%+`[iֺ**P>(]ZY-۪@-_&x]ֵ }tI_ |DZ¸ˮ{קTnbAh2ǁ_<|Tɣ貕^%O/X x/oQӐ嘏}+ >L!Q@QEQEQEQEQEQEQEQEQE!+;"9}oèF27{[[/-aoa_Exem`TN7}+҇AKHyx3Kִ{á+&>l1߅fGf9o0pGTy /zt[Wyr -<+V,*<I? iX|t(=*դ7qIꧡ+Ŀ5}KKm(g +# H aT 7 A(d;xY̋$%1ι^y;Ld ' ^\B"l2=qEQQIrEǰZ,+x"pP3}+KX@6ƁGSH8ERMxz׶ZeshP:R(x6N@!W|(oNuWrDC{WјA5_W?'gBT̥C޻/|EC4 lTQG5?yncVSE gŽsIlmInWx͗.E_f=5)  `:~5reܟE$t ( TQETM,,qVc+ǼwK2X.n@~Umwq#{?;Y#!+֕* ?QEQEQEQEQEQEQEQEQEQER`TSC4Rtad|Ԍ*nycx#V$'F]gE%i|:ne[W1 [5KEW^ֿ vQ$_/7.$|ڽss^2xk×Z?: 5b牙RcNъQKᆭHZXW׾x7^_fSd_{դ K$mXdi:zp<Ҿvau~9V`ׯ,2A#}XHS&kĶ2Ga]Gmj>(EsdEe w(4 )$+gĽвp3HpFNO֭x/6YR6',9j'Ҽ+nX[(`>iHqREQEQEQEQEQEQEQEQEQEQER0x wW^PI>9x_4z+zG s^6E=ū#s{m)oBc~>_tf%)ʶ◵QY!+) O^νn#/`8'Ʃy:5ɂ|ֽy2}G?fh[yQ}=v[u".2ɞ^{~hGu}J((T Q*J((((((((((((R0kt?}f#0>( {h^CϋzH5'#<[QR^g+м3rme>: \`{S$8q\εh?ڵ8wk̵-ѥzIҼ\oV[U_99Ğ%rڼ1&Y<+KH.5/˅i(5p6,QT`U8((((((((((((1H@KEHW֑N̼כFO%<:f\)}-FqH|57KFQEQEQEQEQEQEQEQEQEQEQEQEQEQE*JZC0?L%|%K9j5?NiD}뗿6Pʽ;uw6_/Ys=up1U-86zgя?Y<5/Ɣh,'gԿ?zz\WK?[6Wr}pKښN0u\N_KHYs]$qh4U_E&((((((((((((((((QE`S4QO"ȣȋy'*LQ(((((((((((((((((((((((((((((`! GH{g"I Sc`:ePx\_hEvwv۶ nSsշoP rR\l "HAQl ACA'!}ABrimv([&Y \ړyxVx3ݸGA89lǼ6=~)nlAOM 0&cp& Ul&AV?=]A?f/3X_ofhi2o Tnq,UYQ겪ȂŷbT}a/qN'cq- pl1,^8e,X|$T,ߘw'Ud3}lagrs1OXkK|aN7w6\F˳hO&C <zeoQ˳ٌp4 -  G-#(GA1FӮ [~C5׈,ºz2eS'ψ,B䣞i* F˳S߾ ߋ4ya=@=] 4)0 ˼QOF4e^!Zш>ogSo 4yYB= #zY_TF=詔e^!ZوY j%C!bD>r K~#c'E䦍6[ ƾݮ}XuƯBwM?DMr_&r'r'r'r'uw!߅|]Hs9䧒J~*tN:?:uZ'uZ'!I_I럴I럤s9~Q(wZ]n|߰GC1ޒ1U$]( 2/ 0`DArialicawmantt  0"DTahomacawmantt  0" DTimes New Romantt  00DWingdingsRomantt  0@DVerdanasRomantt  0"PDCourier Newmantt  01`DTimesr Newmantt  0 pDHelveticawmantt  0 " C0.  @n?" dd@  @@``   2@   () *  - <  :  Bi   $ 444<9<(   :+'1o!)10> 63;<?DABCSDEEF GHHIJ0K"L)MN*OP3QTRSZUVYZ[\^&- bef1//mnopqrstuvwxyz{|}~?$R$Nт۳ Y*22$GH{g"I2 AA1? 3ff@338; ʚ;J%5ʚ;g4dddd  0pdppp@ <4dddd@k 0t  <4BdBd@l 0tg4<d<d  0p p %0___PPT10 ___PPT9nnIt>"ՌPNG  IHDR +tsRGB PLTEfffm cmPPJCmp0712 7tRNS@fIDATWc`  SP1H $XLIENDB`? -O  =8=a(Machine-Level Prog. IV - Structured Data)) 4Today Arrays Structures Unions Next time Arrays P   >bBasic data typesYIntegral Stored & operated on in general registers Signed vs. unsigned depends on instructions used Intel GAS Bytes C byte b 1 [unsigned] char word w 2 [unsigned] short double word l 4 [unsigned] int Floating point Stored & operated on in floating point registers Intel GAS Bytes C Single s 4 float Double l 8 double Extended t 10/12 long double [d1R [  1  ?cArray allocationoBasic principle T A[L]; Array of data type T and length L Contiguously allocated region of L * sizeof(T) bytes W "`@d Array accessBasic principle T A[L]; Identifier A can be used as a pointer to array element 0 Reference Type Value val[4] int 3 val int * x val+1 int * x + 4 &val[2] int * x + 8 val[5] int ?? *(val+1) int 5 val + i int * x + 4 i 9r -   (q   Ae Array example@ Notes Declaration  zip_dig nu equivalent to  int nu[5] Example arrays were allocated in successive 20 byte blocks Not guaranteed to happen in generaltn$   =$>gBfArray accessing exampleCgReferencing examples  Code does not do any bounds checking! Reference Address Value Guaranteed? mit[3] 36 + 4* 3 = 48 3 mit[5] 36 + 4* 5 = 56 6 mit[-1] 36 + 4*-1 = 32 3 cmu[15] 16 + 4*15 = 76 ?? Out of range behavior implementation-dependent No guaranteed relative allocation of different arrays ,'h/7 &'h/  7DhArray loop exampleEiArray loop implementationvRegisters %ecx z %eax zi %ebx zend Computations 10*zi + *z implemented as *z + 2*(zi+4*zi) z++ increments by 4  2                   (FjNested array example Declaration  zip_dig pgh[4] equivalent to  int pgh[4][5] Variable pgh denotes array of 4 elements Allocated contiguously Each element is an array of 5 int s Allocated contiguously  Row-Major ordering of all elements guaranteedEZ*ZZ$ZZ0Z  0PSHGkNested array allocationDeclaration T A[R][C]; Array of data type T R rows, C columns Type T element requires K bytes Array size R * C * K bytes Arrangement Row-Major Ordering H      HlNested array row accessxRow vectors A[i] is array of C elements Each element of type T Starting address A + i * C * K (sizeof(T) = K) m  , ZImNested array row access code$ Row vector pgh[index] is array of 5 int s Starting address pgh+20*index Code Computes and returns address Compute as pgh + 4*(index+4*index) >@  (    > LJnNested array element accessL Array elements A[i][j] is element of type T Address A + (i * C + j) * K< 5Ko Nested array element access codeArray Elements pgh[index][dig] is int Address: pgh + 4*(5*index + dig)= pgh + 20*index + 4*dig Code Computes address pgh + 4*dig + 4*(index+4*index) movl performs memory reference R!3     t +LpStrange referencing examples9Reference Address Value Guaranteed? pgh[3][3] 76+20*3+4*3 = 148 2 pgh[2][5] 76+20*2+4*5 = 136 1 pgh[2][-1] 76+20*2+4*-1 = 112 3 pgh[4][-1] 76+20*4+4*-1 = 152 1 pgh[0][19] 76+20*0+4*19 = 152 1 pgh[0][-1] 76+20*0+4*-1 = 72 ?? Code does not do any bounds checking Ordering of elements within array guaranteed`$R$!SMqMulti-level array exampleVariable univ denotes array of 3 elements Each element is a pointer 4 bytes Each pointer points to array of int s pD) 7", aNr#Element access in multi-level array Computation Element access Mem[Mem[univ+4*index]+4*dig] Must do two memory reads First get pointer to row array Then access element within arrayZE@@OsArray element accessesISimilar C references Nested Array Element at Mem[pgh+20*index+ 4*dig]j   bDifferent address computation Multi-Level Array Element at Mem[Mem[univ+4*index] +4*dig]  # !QuUsing nested arraysStrengths C compiler handles doubly subscripted arrays Generates very efficient code Avoids multiply in index computation Limitation Only works if have fixed array sizel N& % N&  %RvDynamic nested arraysStrength Can create matrix of arbitrary size Programming Must do index computation explicitly Performance Accessing single element costly Must do multiplication % & 8 % &   8Uy StructuresConcept Members may be of different types Contiguously-allocated region of memory Refer to members within structure by names Accessing structure member Vvv  Vz$Generating pointer to struct. member g Generating pointer to array element Offset of each structure member determined at compile time **>*>W{Structure referencing (Cont.)C CodeX| AlignmentAligned data Primitive data type requires K bytes Address must be multiple of K (typically 2,4 or 8) Required on some machines; advised on IA32 treated differently by Linux and Windows! Motivation for aligning data Memory accessed by (aligned) double or quad-words Inefficient to load or store datum that spans quad word boundaries Virtual memory very tricky when datum spans 2 pages Compiler Inserts gaps in structure to ensure correct alignment of fields *2w @ *  2w @Z~$Satisfying alignment with structuresOffsets within structure Must satisfy element s alignment requirement Overall structure placement Each structure has alignment requirement K Largest alignment of any element Initial address & structure length must be multiples of K Example.,!;.,  !  ;^Arrays of structuresPrinciple Allocated by repeating allocation for array type In general, may nest arrays & structures to arbitrary depth Compiler may need to add padding to ensure each element satisfies its alignment requirements*  aUnion allocationhPrinciples Overlay union elements Allocate according to largest element Can only use one field at a time* ^ ^b"Using union to access bit patternsiSummaryArrays in C Contiguous allocation of memory Pointer to first element No bounds checking Compiler optimizations Compiler often turns array code into pointer code Uses addressing modes to scale array indices Lots of tricks to improve array indexing in loops Structures Allocate bytes in order declared Pad in middle and at end to satisfy alignment Unions Overlay declarations Way to circumvent type system L O3 L1    _   O3/Hjklmn o p q r stuvwxyz{|~ "&)*1O   0` .T3f` T3f3f` 999MMM` lff3f3޲` eoHff33Ҷ` ff!` T3f3fffq` T3f3fff[>?" dd@ ?nPd@ d " @ ` n?" dd@   @@``PR   @ ` `$p>>  C; ,(  , , s *(  "`0   T Click to edit Master title style! ! , c $<ٍ  "@0   RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  , c $ݍ  ":    AEECS 213 Introduction to Computer Systems Northwestern University2B0(2* 3 3 , Nff??"` , Nff??"` F   ," , Nff??" , Nff??"  , Nff??"  , Nff??"`  , c $׍  "ce   L*"0(2Z , B޽h))? ? T3f3fff[ 0___PPT10.Zj&___PPT92p22 1_aqualab01R  0  0@(  0~ 0 Hff??"A 0 0U  "     A Click to edit  0 <,  "    T Click to edit Master title style! !T   0 "  0 T0 ff??"  4 0 0 T+ ff??"  4 0~  0 Hff??"A~  0 Hff??"A  0 RAk B?nwu-seal-gray"@P%  0 c $   "`0    !Fabin E. Bustamante, Spring 2007H"0(2 3& 3& 3Z 0 B޽h))? ? T3f3fff[80___PPT10.Zj&( 0 d8(  d  d N= yy .  =  v* a11aa d N= yy 2 . =  x* a11aad d c $ ?  = 4 d N= yy 9 3 =  RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S d T = yy q  =  v* a11aa d T4d= yy q2  =  x* a11aaH d 0ηo~ ? 3380___PPT10.eۡ ((    N\& yy .    \* a11aa  N7 yy 2 .   ^* a11aa  TP: yy q    \* a11aa  TJ yy q2    ^* a11aaH  0ηo~ ? 3380___PPT10.dz͓ 0L0  $(   r  S * 03   r  S = 0     H  0޽h ? GGGy___PPT10Y+D='  = @B +  0L0 &  (   r  S  ,`0     S ~J= wawa1 ?,@0   >*4p 0aYiH  0޽h ? GGG)  0 m)e)0KR$ `((  $ r J$ S  ,`0   ~ $ s * ,@0    8 `p P$ `p $  N 8c?`G Lchar string[12]; 0 @ p O$ pT   $ #  l $  <8c?l  $  <8c?l  $  <8c?l  $  <8c?0l  $  <8c?0l  $  <8c?Pl $  <8c?Pl $  <8c?pl $  <8c?p l $  <8c?  l $  <8c?  l $  <8c?   $  BK= 8c?zp ;x0  $  B= 8c?p Vx + 1240 ~B $ ND8c? ~B $ ND8c? > 8 `@0P  R$ @`0P  $  N%= 8c?`@'  a int val[5]; 0    @ @0P  Q$ @0P T 0@ $ # @Pl $  <8c?0@l $  <8c?0p@l $  <8c?p @l $  <8c?  @l $  <8c? 0@  $  BA= 8c?` zG  ;x0  !$  B$2= 8c? i 0 P  Ux + 440 ~B "$ ND8c? ~B #$ ND8c?P P  $$  Bd+= 8c? i pP  Ux + 840 ~B %$ ND8c?  &$  B,7= 8c?@i P  Vx + 1240 ~B '$ ND8c?   ($  B 8c?i P  Vx + 1640 ~B )$ ND8c?   *$  B 8c?i 0P  Vx + 2040 ~B +$ ND8c?P P T 8  I  L$  2  -$  N 8c? 7  H double a[4]; 0  6 @  I  K$  I ,T 0  /$ # B pp l 0$  <8c?p0 l 1$  <8c?p 0 l 2$  <8c? p0 l 3$  <8c?p0 ~B 4$ ND8c? '  5$  BX 8c? I  Vx + 3240 ~B 6$ ND8c?d d0  7$  B 8c?`   Vx + 2440  8$  B 8c?   ;x0 ~B 9$ ND8c?U U  :$  B 8c?O   Ux + 840 ~B ;$ ND8c? '  <$  BL 8c? Q  Vx + 1640 ~B =$ ND8c?l l ' 8   N$    >$  H# 8c?  G char *p[3]; 0  @ `  M$ ` T 0 @$ #  pl A$  <8c? 0l B$  <8c? ` 0l C$  <8c?` 0 D$  B() 8c?`Z ;x0  E$  B, 8c?  Ux + 440 ~B F$ ND8c?g~B G$ ND8c?0 p0  H$  B`2 8c? P  Ux + 840 ~B I$ ND8c?p pp H $ 0޽h ? GGG  0 C;@( (  ( r ( S v ,`0    ( s *f ,@0   6"4 aYie 8 p ( pT 0P ( # 0 (  BpÍ 8c?0 P =1 0  (  B 8c?0 p P =5 0  (  Bpx 8c?p  P =2 0   (  B 8c? P =1 0   (  B8g 8c?0P =3 0   (  N(h 8c?p a int val[5]; 0     (  Bl 8c?`Z ;x0   (  B8o 8c?  Ux + 440 ~B ( ND8c? ~B ( ND8c?0 0  (  B t 8c? P  Ux + 840 ~B ( ND8c?p p  (  Bty 8c?  Vx + 1240 ~B ( ND8c?   (  B~ 8c?` Vx + 1640 ~B ( ND8c?  (  BD 8c? Vx + 2040 ~B ( ND8c?00 H ( 0޽h ? GGG,   0 R,J,PDD, +(  , ~ , s *h ,`0   ~ , s *n ,@0    , NȖ wawa1?"`_. Lztypedef int zip_dig[5]; zip_dig cmu = { 1, 5, 2, 1, 3 }; zip_dig mit = { 0, 2, 1, 3, 9 }; zip_dig nu = { 6, 0, 2, 0, 8 };{0 {(F `  ,  `@` s N  ,   ,  H 8c?w t zip_dig cmu; 0  $ N  ,  T 0P  , # 0P  ,  B 8c?0 P =1 0   ,  B 8c?0 p P =5 0   ,  B$ 8c?p  P =2 0   ,  B 8c? P =1 0  ,  B 8c?0P =3 0 xB , HD8c? P  ,  H 8c? >16 0 xB , HD8c?` P`  ,  H8 8c?  >20 0 xB , HD8c? P  ,  Ht 8c? 0  >24 0 xB , HD8c? P  ,  H 8c?P p >28 0 xB , HD8c? P  ,  H 8c? >32 0 xB , HD8c?`P` ,  H` 8c? >36 0 s N  ,  y  ,  H 8c?w t zip_dig mit; 0  $ N  ,  T 0P , # 0P ,  B 8c?0 P =0 0   ,  Bp 8c?0 p P =2 0  !,  B" 8c?p  P =1 0  ",  B& 8c? P =3 0  #,  BP* 8c?0P =9 0 xB $, HD8c? P  %,  H- 8c? >36 0 xB &, HD8c?` P`  ',  H 8c?  >40 0 xB (, HD8c? P  ),  H5 8c? 0  >44 0 xB *, HD8c? P  +,  H0% 8c?P p >48 0 xB ,, HD8c? P  -,  H= 8c? >52 0 xB ., HD8c?`P` /,  HA 8c? >56 0 r N p 0,  fY `  1,  HE 8c?pw s zip_dig nu; 0  $ N  2,  T 0P 3, # 0P 4,  BL 8c?0 P =6 0  5,  BP 8c?0 p P =0 0  6,  BT 8c?p  P =2 0  7,  B\W 8c? P =0 0  8,  B[ 8c?0P =8 0 xB 9, HD8c? P  :,  H_ 8c? >56 0 xB ;, HD8c?` P`  <,  Hc 8c?  >60 0 xB =, HD8c? P  >,  Hh 8c? 0  >64 0 xB ?, HD8c? P  @,  H@l 8c?P p >68 0 xB A, HD8c? P  B,  Hhp 8c? >72 0 xB C, HD8c?`P` D,  Ht 8c? >76 0 H , 0޽h ? GGGg   0 ` 0 (  0 r 0 S w ,`0    0 s * ,%  p    GMemory reference codea 0 N8 wawa1?"`@  9int get_digit (zip_dig z, int dig) { return z[dig]; }:0 :Z { 0  f wawa?1? .G = # %edx = z # %eax = dig movl (%edx,%eax,4),%eax # z[dig]>0 >P xH 0 ZPg wawa1 ?p  Computation Register %edx contains starting address of array Register %eax contains array index Desired digit at 4*%eax + %edx Use memory reference (%edx,%eax,4)    -'  P.*%H 0 0޽h ? GGGC:   0 ..pEG4 .(  4  4 s *ȫg ,@0   :&4 aYi~ 4 s *l  ,`0    q L  4 # pw 4  H 8c?w t zip_dig cmu; 0  $ N  4  T 0P 4 # 0P  4  B#g 8c?0 P =1 0   4  Bg 8c?0 p P =5 0   4  Bg 8c?p  P =2 0   4  Bg 8c? P =1 0   4  B`7g 8c?0P =3 0 xB 4 HD8c? P  4  H@;g 8c? >16 0 xB 4 HD8c?` P`  4  H$g 8c?  >20 0 xB 4 HD8c? P  4  Hg 8c?&   >24 0 xB 4 HD8c? P  4  H`g 8c?f Z >28 0 xB 4 HD8c? P  4  H 8c? >32 0 xB 4 HD8c?`P` 4  H̓ 8c? >36 0 q L  4 # Y` 4  H 8c?w t zip_dig mit; 0  $ N  4  T 0P 4 # 0P 4  B I 8c?0 P =0 0  4  BG 8c?0 p P =2 0   4  Bԕ 8c?p  P =1 0  !4  BDb 8c? P =3 0  "4  Bu 8c?0P =9 0 xB #4 HD8c? P  $4  H 8c? >36 0 xB %4 HD8c?` P`  &4  H  8c?  >40 0 xB '4 HD8c? P  (4  Hi 8c?&   >44 0 xB )4 HD8c? P  *4  H$k 8c?f Z >48 0 xB +4 HD8c? P  ,4  HHt 8c? >52 0 xB -4 HD8c?`P` .4  Hp9 8c? >56 0  04 N 8c?9 F  s zip_dig nu; 0  $ L  14 # iR@T 0P 24 # 0P 34  B| 8c?0 P =6 0  44  B 8c?0 p P =0 0  54  B 8c?p  P =2 0  64  B: 8c? P =0 0  74  B  8c?0P =8 0 xB 84 HD8c? P  94  Hd 8c? >56 0 xB :4 HD8c?` P`  ;4  H$ 8c?  >60 0 xB <4 HD8c? P  =4  HD( 8c?&   >64 0 xB >4 HD8c? P  ?4  H, 8c?f Z >68 0 xB @4 HD8c? P  A4  Ht0 8c? >72 0 xB B4 HD8c?`P` C4  HL4 8c? >76 0 # D4 C xL6  jJ11?) 0 ,$ 0 GYes(0 Z" E4 C xP  jJ11?  ,$ 0 FNo(0 Z" F4 C x(Y  jJ11?  ,$ 0 FNo(0 Z" G4 C xD  jJ11?  ,$ 0 FNo(0 ZH 4 0޽h ? GGGN F ___PPT10& +g{D* ' = = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*D4 %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*E4 %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*F4 %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*G4 %(++0+D4 0 ++0+E4 0 ++0+F4 0 ++0+G4 0 +   0 8 &(  8  8 N wawa1?"`\  Jvint zd2int(zip_dig z) { int i; int zi = 0; for (i = 0; i < 5; i++) { zi = 10 * zi + z[i]; } return zi; } w0 w&~ 8 s * ,`0    L 8 s * ,    ROriginal Source Computes the integer represented by an array of 5 decimal digits. HB BaYi  8 NH wawa1?"` 0 ~int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; } 0  $ 8 Z wawa1 ?  Transformed version As generated by GCC Eliminate loop variable i and uses pointer arithmetic Computes address of final element and uses that for test Express in do-while form No need to test at entrance  naYiH 8 0޽h ? GGG6   0  !! <  (  <  <  f- wawa?1?` ,$D 0  # %ecx = z xorl %eax,%eax # zi = 0 leal 16(%ecx),%ebx # zend = z+4 .L59: leal (%eax,%eax,4),%edx # 5*zi movl (%ecx),%eax # *z addl $4,%ecx # z++ leal (%eax,%edx,2),%eax # zi = *z + 2*(5*zi) cmpl %ebx,%ecx # z : zend jle .L59 # if <= goto loopt0  2 +.7^   r < S h. ,`0    < s * ,@0   0aYiL < N wawa1?^P ,$D 0 int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; }<0  c  <  fܴ wawa?1?` ,$D 0  # %ecx = z xorl %eax,%eax # zi = 0 leal 16(%ecx),%ebx # zend = z+4 .L59: leal (%eax,%eax,4),%edx # 5*zi movl (%ecx),%eax # *z addl $4,%ecx # z++ leal (%eax,%edx,2),%eax # zi = *z + 2*(5*zi) cmpl %ebx,%ecx # z : zend jle .L59 # if <= goto loopt0 & +.7^   L < Nܞ wawa1?^P ,$D 0 int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; }<0 - N   <  f wawa?1?` ,$D 0 @ # %ecx = z xorl %eax,%eax # zi = 0 leal 16(%ecx),%ebx # zend = z+4 .L59: leal (%eax,%eax,4),%edx # 5*zi movl (%ecx),%eax # *z addl $4,%ecx # z++ leal (%eax,%edx,2),%eax # zi = *z + 2*(5*zi) cmpl %ebx,%ecx # z : zend jle .L59 # if <= goto loop0 M7^   L  < N` wawa1?^P ,$D 0 int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; }<0 F0   <  f wawa?1?` ,$D 0  # %ecx = z xorl %eax,%eax # zi = 0 leal 16(%ecx),%ebx # zend = z+4 .L59: leal (%eax,%eax,4),%edx # 5*zi movl (%ecx),%eax # *z addl $4,%ecx # z++ leal (%eax,%edx,2),%eax # zi = *z + 2*(5*zi) cmpl %ebx,%ecx # z : zend jle .L59 # if <= goto loopt0 M  .7^   L  < N wawa1?^P ,$D 0 int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; }<0 ]%   <  fD wawa?1?` ,$D  0 $ # %ecx = z xorl %eax,%eax # zi = 0 leal 16(%ecx),%ebx # zend = z+4 .L59: leal (%eax,%eax,4),%edx # 5*zi movl (%ecx),%eax # *z addl $4,%ecx # z++ leal (%eax,%edx,2),%eax # zi = *z + 2*(5*zi) cmpl %ebx,%ecx # z : zend jle .L59 # if <= goto loop0 M +. ^   Z  < Nd wawa1?"`^P ,$D  0 int zd2int(zip_dig z) { int zi = 0; int *zend = z + 4; do { zi = 10 * zi + *z; z++; } while(z <= zend); return zi; }<0 f H < 0޽h ? GGGRJ___PPT10*+tDN'  = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*< %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*< %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* < %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*< %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* < %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* < %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* < %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* < %(++0+< 0 ++0+< 0 ++0+< 0 ++0+ < 0 ++0+ < 0 ++0+ < 0 ++0+ < 0 ++0+ < 0 +  0 ./@ Y(  @ r /@ S D ,`0   ~ @ s * ,@0    @  fh wawa?1?"`@ {#define PCOUNT 4 zip_dig pgh[PCOUNT] = {{1, 5, 2, 0, 6}, {1, 5, 2, 1, 3 }, {1, 5, 2, 1, 7 }, {1, 5, 2, 2, 1 }};|0 |, YF @@g  @    @  H( 8c?@p  ezip_dig pgh[4]; 0  IN P w  @  p@g xB @ HD8c?`0 `   @  Hp 8c? w  >76 0 xB  @ HD8c? 0    @  HȞ 8c? w  >96 0 xB  @ HD8c? 0   @  H 8c?% w  ?116 0 xB @ HD8c?0   @  Hx 8c? [w  ?136 0 xB @ HD8c?`0 `  @  H 8c? w  ?156 0 N 0P 00  @  0P 00 N 0P 0  @  0P 0  @  B$ 1?0P 0  =1 0  @  B( 1?P 0  =5 0  @  BL, 1?P p0  =2 0  @  B/ 1?pP 00  =0 0  @  Bt3 1?0P 0  =6 0 N 0P 0  @  P 0  @  B07 1?0P 0  =1 0  @  Bh` 1?P 0  =5 0  @  B_ 1?P p0  =2 0  @  Bf 1?pP 00  =1 0  @  Bi 1?0P 0  =3 0 N 0P 0  @   P p0   @  Bb 1?0P 0  =1 0  !@  B` 1?P 0  =5 0  "@  BLs 1?P p0  =2 0  #@  BPo 1?pP 00  =1 0  $@  B E 1?0P 0  =7 0 N 0P 0  %@  pP 00  &@  B 1?0P 0  =1 0  '@  Bx 1?P 0  =5 0  (@  B@ 1?P p0  =2 0  )@  Bȏ 1?pP 00  =2 0  *@  B 1?0P 0  =1 0 l +@  <o?0P 0 l ,@  <o?P 0 l -@  <o? P p0 l .@  <o?pP 00 H @ 0޽h ? GGGy___PPT10Y+D='  = @B +I  0 ph!!D (  D ~ D s *HW ,`0   ~ D s * X ,@0   ~F   D  p  D  B\ 8c?  AA[0][0]0  D  B 8c?` `  E A[0][C-1] 0   D  B 8c?   C A[R-1][0] 0   D  B 8c?0 p  F " " "  0   D  B 8c?`  F " " "  0   D  B 8c?`` G A[R-1][C-1] 0    D  B 8c? ` @ @ F " " "  0   D  B 8c?` @ F " " "  0   D   B`CpDEF8c?`p`p @  D B  B`CpDEF8c?`p`p @0  D H 8c? P   b int A[R][C]; 0   8 F PP  D  ` 0N    D  PP  D  B% 1? P  E A [0] [0] 0   D  B* 1?   G A [0] [C-1] 0   D  B- o?   D " " " 0 N    D  P  D  B1 1? P  E A [1] [0] 0   D  B@3 1?   G A [1] [C-1] 0   D  B: o?   D " " " 0 N    D  PP  D  B$= 1? P  G A [R-1] [0] 0   D  B4@ 1?   I A [R-1] [C-1] 0  D  Bx[ o?   D " " " 0  D  B} 8c? P P H" " " 0 dB D <D8c?dB D <D8c?00pB  D HD8c?`0` !D B̀ 8c?p  R 4*R*C Bytes* 0 H D 0޽h ? GGGy___PPT10Y+D='  = @B +  0  ((H (  H  H B 8c?P   H" " " 0 ~ H s * ,`0   ~ H s * ,@0   F   H   @ T    H # `  H  B 1? P  E A [i] [0] 0   H  B$ 1?   G A [i] [C-1] 0    H  B o?   D " " " 0 lB  H  <D8c?p lB  H  <D8c?p lB  H  <D8c? p xB  H  HD8c?  H  B0 8c?@P  dA[i]*0 BF P  H    T    H # P`   H  B 1? P  G A [R-1] [0] 0   H  B( 1?   I A [R-1] [C-1] 0  H  B# o?   D " " " 0 lB H  <D8c?PpP lB H  <D8c?p xB H  HD8c?P H  B' 8c?  LA[R-1]*0  H BL, 8c?P @  H" " " 0  H <$0 8c?P `Z7 ;A0 pB H HD8c? G pB H HD8c? ppP <F P  H    T    H # P`   H  B4 1? P  E A [0] [0] 0   H  B|8 1?   G A [0] [C-1] 0    H  Bx< o?   D " " " 0 lB !H  <D8c?PpP xB "H  HD8c?P #H  B@ 8c?  JA[0]*0 lB $H  <D8c?p  %H HtE 8c?  b int A[R][C]; 0    &H <J 8c?  g [A+i*C*40  'H <lN 8c? `g E A+(R-1)*C*4 0  pB (H HD8c? P H H 0޽h ? GGGy___PPT10Y+D='  = @B +m  0 L $(  L ~ L s *܌ ,`0   ~ L s *dg ,@0   8 L Nh wawa1?"`@4 4int *get_pgh_zip(int index) { return pgh[index]; }50 56  L  fhn wawa?1? PG b # %eax = index leal (%eax,%eax,4),%eax # 5 * index leal pgh(,%eax,4),%eax # pgh + (20 * index)c0 cP !xH L 0޽h ? GGGy___PPT10Y+D='  = @B +  0  ))P (  P  P <\ o?` p  F " " " 0 ~ P s *X ,`0   ~ P s * ,@0    P B 8c?`   H" " " 0  P < 1?` P  E A [i] [j] 0   P < 1?0 E A [i] [j] 0   P B o?` p  D " " " 0 dB  P <D8c?ppp dB  P <D8c?ppp dB  P <D8c?p pB  P HD8c?p   P B[ 8c? 0  dA[i]*0 BF P  P  0 T    P # P`   P  B0 1? P  G A [R-1] [0] 0   P  BX 1?   I A [R-1] [C-1] 0  P  B o?   D " " " 0 lB P  <D8c?PpP lB P  <D8c?p xB P  HD8c?P P  B 8c?  LA[R-1]*0  P B 8c?` p  H" " " 0  P < 8c?` G  ;A0 pB P HD8c? W pB P HD8c? ` <F P  P   T    P # P`   P  B 1? P  E A [0] [0] 0   P  B, 1?   G A [0] [C-1] 0   P  B( o?   D " " " 0 lB  P  <D8c?PpP xB !P  HD8c?P "P  BL 8c?  JA[0]*0 lB #P  <D8c?p  $P H\J 8c?lw b int A[R][C]; 0    %P <J 8c? P w  [A+i*C*40  &P <J 8c? w  E A+(R-1)*C*4 0  pB 'P HD8c?  ` pB (P HD8c? P  )P <4J 8c?  g q A+(i*C+j)*4 0  $H P 0޽h ? GGGy___PPT10Y+D='  = @B +  0 $T (  T ~ T s *؅J ,`0  J  ~ T s *J ,@0 J  p T NJ wawa1?"` 2 Fint get_pgh_digit (int index, int dig) { return pgh[index][dig]; } G0 GZ  T  f|J wawa?1? PA b # %ecx = dig # %eax = index leal 0(,%ecx,4),%edx # 4*dig leal (%eax,%eax,4),%eax # 5*index movl pgh(%edx,%eax,4),%eax # *(pgh + 4*dig + 20*index)0 t  H H T 0޽h ? GGGy___PPT10Y+D='  = @B +3  0 ##22X "(  X ~ X s *[J ,`0  J   X s *lJ ,0 J  :&4@ aYi X Hv 8c?d ezip_dig pgh[4]; 0  GL P w  X # [xB X HD8c?`0 `  X  H(& 8c? w  >76 0 xB X HD8c? 0    X  Hd& 8c? w  >96 0 xB  X HD8c? 0   X  Hl& 8c?% w  ?116 0 xB  X HD8c?0    X  HL& 8c? [w  ?136 0 xB X HD8c?`0 `  X  H& 8c? w  ?156 0 N 0P 00  X  0P 00 N 0P 0  X  0P 0  X  B& 1?0P 0  =1 0  X  B& 1?P 0  =5 0  X  B& 1?P p0  =2 0  X  B`& 1?pP 00  =0 0  X  B& 1?0P 0  =6 0 N 0P 0  X  P 0  X  B& 1?0P 0  =1 0  X  B& 1?P 0  =5 0  X  B& 1?P p0  =2 0  X  BH& 1?pP 00  =1 0  X  B & 1?0P 0  =3 0 N 0P 0  X   P p0  X  B& 1?0P 0  =1 0  X  B<& 1?P 0  =5 0   X  B& 1?P p0  =2 0  !X  Bp& 1?pP 00  =1 0  "X  Bl& 1?0P 0  =7 0 N 0P 0  #X  pP 00  $X  B4& 1?0P 0  =1 0  %X  B,& 1?P 0  =5 0  &X  B\;& 1?P p0  =2 0  'X  B=& 1?pP 00  =2 0  (X  B+B#style.visibility<*-X %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*.X %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*/X %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*0X %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*1X %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*2X %(+P+0+-X 0 ++0+.X 0 ++0+/X 0 ++0+0X 0 ++0+1X 0 ++0+2X 0 +7  0 66SS\ 5(  \ ~ \ s *s& ,`0  &  ~ \ s *t& ,@0 &   \ Nv& wawa1?"`6} azip_dig cmu = { 1, 5, 2, 1, 3 }; zip_dig mit = { 0, 2, 1, 3, 9 }; zip_dig nu = { 6, 0, 2, 0, 8 };b0 bld \ N\~& wawa1?"`p 4#define UCOUNT 3 int *univ[UCOUNT] = {mit, cmu, nu};50 5b 1F  0  \  0 `N @  \  @  \  B& 8c?`0   <360 xB  \ HD8c?@ `   \  H& 8c? @  ?160 0   \  Bh& 8c?`   <160   \  B& 8c?`   <560 xB  \ HD8c?@ ` xB \ HD8c?@p `p  \  H& 8c? 6  ?164 0  \  H0& 8c? 6  ?168 0  \  HX& 8c?`@,'  Zuniv 0 f2 \  68c?  f2 \  68c?  f2 \  68c?p   \  HD$ 8c?  Ycmu 0  T  \ # 0 T 0P \ # 0P \  B$ 8c?0 P =1 0  \  B$ 8c?0 p P =5 0  \  B$ 8c?p  P =2 0  \  B$ 8c? P =1 0  \  B$ 8c?0P =3 0 xB \ HD8c? P  \  H$ 8c? >16 0 xB \ HD8c?` P`   \  H$ 8c?  >20 0 xB !\ HD8c? P  "\  HH$ 8c? 0  >24 0 xB #\ HD8c? P  $\  H$ 8c?P p >28 0 xB %\ HD8c? P  &\  H%$ 8c? >32 0 xB '\ HD8c?`P` (\  H)$ 8c? >36 0  )\  H@-$ 8c?0 &   Ymit 0  T  *\ #  & T 0P +\ # 0P ,\  B,$ 8c?0 P =0 0  -\  B$ 8c?0 p P =2 0  .\  B:$ 8c?p  P =1 0  /\  B8$ 8c? P =3 0  0\  BDA$ 8c?0P =9 0 xB 1\ HD8c? P  2\  H\L$ 8c? >36 0 xB 3\ HD8c?` P`  4\  HO$ 8c?  >40 0 xB 5\ HD8c? P  6\  HdE$ 8c? 0  >44 0 xB 7\ HD8c? P  8\  HLW$ 8c?P p >48 0 xB 9\ HD8c? P  :\  H[$ 8c? >52 0 xB ;\ HD8c?`P` <\  HD$ 8c? >56 0  =\  H|$ 8c?   Xnu 0  T  >\ #  & T 0P ?\ # 0P @\  B$ 8c?0 P =6 0  A\  Bء$ 8c?0 p P =0 0  B\  Bإ$ 8c?p  P =2 0  C\  B$ 8c? P =0 0  D\  BD$ 8c?0P =8 0 xB E\ HD8c? P  F\  Hd$ 8c? >56 0 xB G\ HD8c?` P`  H\  Hg$ 8c?  >60 0 xB I\ HD8c? P  J\  H0l$ 8c? 0  >64 0 xB K\ HD8c? P  L\  Hp$ 8c?P p >68 0 xB M\ HD8c? P  N\  H`o$ 8c? >72 0 xB O\ HD8c?`P` P\  Hv$ 8c? >76 0 R Q\  TG!NH1I!N8c?(( x ~b R\  NG0*HI.8c?   r S\ TG>H],I8c?h  H \ 0޽h ??`\ \ Q\ \ ,\ R\ \ @\ S\  GGG  0 1) ` (  ` ~ ` s *$ ,`0  $  ~ ` s *̎$ ,@0 $   `  fawawa?1? P o # %ecx = index # %eax = dig leal 0(,%ecx,4),%edx # 4*index movl univ(%edx),%edx # Mem[univ+4*index] movl (%edx,%eax,4),%eax # Mem[...+4*dig]0    p ` NLawawa1?"`p  Hint get_univ_digit (int index, int dig) { return univ[index][dig]; }I0 IZH ` 0޽h ? GGG8  0 880UYd 87(  d ~ d s *la,`0  a x d c $$a,@`  a x d c $̺a,@ 0 a p d Nawawa1?"`  Fint get_pgh_digit (int index, int dig) { return pgh[index][dig]; } G0 GZ r d N,awawa1?"`@  Hint get_univ_digit (int index, int dig) { return univ[index][dig]; } I0 IZ d  fA jJ11?  1F v n   d  X ON v+   d  v+   d  Ba8c?`0   >36 0 xB  d HD8c?@ `   d  Hta8c?t  A160"0  d  B,a8c?`   >16 0  d  Ba8c?`   >56 0 xB d HD8c?@ ` xB d HD8c?@p `p  d  HXa8c?v i  A164"0  d  Ha8c?v h  A168"0  d  Ha8c?+[=  \univ"0 f2 d  68c?  f2 d  68c?  f2 d  68c?p   d  H8 a8c?6 (  [cmu"0 5 T N. d # n !T 0P d # 0P d  Ba8c?0 P ?1"0  d  B a8c?0 p P ?5"0  d  Ba8c?p  P ?2"0  d  Ba8c? P ?1"0  d  Bda8c?0P ?3"0 xB  d HD8c? P  !d  H a8c?N @16"0 xB "d HD8c?` P`  #d  H%a8c?.  @20"0 xB $d HD8c? P  %d  H#a8c? n  @24"0 xB &d HD8c? P  'd  Ha8c?  @28"0 xB (d HD8c? P  )d  H`Ya8c?O @32"0 xB *d HD8c?`P` +d  H+a8c?. @36"0  ,d  H"a8c?h Z ,  [mit"0 5 T M, -d #  b !T 0P .d # 0P /d  B8.a8c?0 P ?0"0  0d  B$]a8c?0 p P ?2"0  1d  B(6a8c?p  P ?1"0  2d  B=a8c? P ?3"0  3d  B|Aa8c?0P ?9"0 xB 4d HD8c? P  5d  HEa8c?M @36"0 xB 6d HD8c?` P`  7d  HJa8c?-  @40"0 xB 8d HD8c? P  9d  HHa8c? m  @44"0 xB :d HD8c? P  ;d  H9a8c?  @48"0 xB d HD8c?`P` ?d  HLha8c?, @56"0  @d  H$la8c? /  Znu"0 5 T M, Ad #  b !T 0P Bd # 0P Cd  Bma8c?0 P ?6"0  Dd  B,oa8c?0 p P ?0"0  Ed  Bsa8c?p  P ?2"0  Fd  Bwa8c? P ?0"0  Gd  Ba8c?0P ?8"0 xB Hd HD8c? P  Id  Ha8c?M @56"0 xB Jd HD8c?` P`  Kd  H,a8c?-  @60"0 xB Ld HD8c? P  Md  Ha8c? m  @64"0 xB Nd HD8c? P  Od  H\a8c?  @68"0 xB Pd HD8c? P  Qd  H a8c?M @72"0 xB Rd HD8c?`P` Sd  HU8c?, @76"0 R Td  TG!NH1I!N8c?(( x ~b Ud  NG0*HI.8c?   r Vd TG>H],I8c?h  H d 0޽h ??`d d Td d /d Ud d Cd Vd  GGGy___PPT10Y+D='  = @B +  0   Pl [ (  l ~ l s *U,`0  U ~ l s *U,@0 U 8 l NUwawa1?"`x d *#define N 16 typedef int fix_matrix[N][N]; +0 +>  l NUwawa1?"`   /* Compute element i,k of fixed matrix product */ int fix_prod_ele(fix_matrix a, fix_matrix b, int i, int k) { int j; int result = 0; for (j = 0; j < N; j++) result += a[i][j]*b[j][k]; return result; } 0  5EF  P  l   0 f l  61?b U  l  Z`)Uwawa8c?0   9A0 `B  l  08c?N QN   l  Z8-Uwawa8c?P p  =(i,*)0 N 0 P   l  0 P f  l  61?= b   l  Z\1Uwawa8c? b  9B0 `B l  08c? f  l  Z45Uwawa8c?0 P u  =(*,k)0  l  Z8Uwawa8c?   C Column-wise 0  fB l 68c? P  l  Z6Uwawa8c?   @Row-wise 0  lB l  <8c?@ { H l 0޽h ? GGG4  0 `p t(  p ~ p s *|RU,`0  U ~ p s *TSU,@0 U k p Nl[Uwawa1?"` 0 Sint *new_var_matrix(int n) { return (int *) calloc(sizeof(int), n*n); } T0 TH  p NvU wawa1?"`@ 0  "Nint var_ele (int *a, int i, int j, int n) { return a[i*n+j]; } O0 O p  fXU wawa?1?0  r q movl 12(%ebp),%eax # i movl 8(%ebp),%edx # a imull 20(%ebp),%eax # n*i addl 16(%ebp),%eax # n*i+j movl (%edx,%eax,4),%eax # Mem[a+4*(i*n+j)] 0 !HpH p 0޽h ? GGG  0L0 XP|  (  | ~ | s *`U ,@0 U  X | NU wawa1?"`p``  .struct rec { int i; int a[3]; int *p; }; /0 /Z  | TU wawa1?p p t  lAssembly( 00 Z 4aYi |  fU wawa?1? 0 ; # %eax = val # %edx = r movl %eax,(%edx) # Mem[r] = val <0 <  Hg | NdU wawa1?"` P  5void set_i(struct rec *r, int val) { r->i = val; } 60 6b  ~ | s *U ,`0  U   | TU wawa1?p  s Memory Layout*08 Z4aYi)F 0    |  0    |  ZU wawa8c?   =i 0   |  Z,U wawa8c?   =a 0   |  ZpU wawa8c?!1  =p 0   |  ZU wawa8c?0   ;00  |  Z,U wawa8c?P    ;40  |  ZU wawa8c?   <160  |  ZU wawa8c?   <200 H | 0޽h ? GGG  0L0 G? (   V  N U wawa1?"`6 A .struct rec { int i; int a[3]; int *p; };/0 /Z    fU wawa?1?` T '[ # %ecx = idx # %edx = r leal 0(,%ecx,4),%eax # 4*idx leal 4(%eax,%edx),%eax # r+4*idx+4\0 \tH  NdU wawa1?"` p n  ?int * find_a (struct rec *r, int idx) { return &r->a[idx]; }@0 @~~  s *'U ,`0  U  ~  s *d(U ,@0 U    Z)U wawa8c?q  =i 0   Z wawa8c?  ;a0   Z wawa8c? =p 0   Z8 wawa8c?  ;00   Z wawa8c?  ;40   Z wawa8c? <160 jB  BD8c?  H 8c?@ i r + 4 + 4*idx0  jB  BD8c?` `   H 8c?  ;r0   Zv wawa8c?p 4 0   Z(u wawa8c?  20 H  0޽h ? GGG  0L0 aY (   V  N wawa1?"`R .struct rec { int i; int a[3]; int *p; };/0 /Z    f wawa?1? p0b  \ # %edx = r movl (%edx),%ecx # r->i leal 0(,%ecx,4),%eax # 4*(r->i) leal 4(%edx,%eax),%eax # r+4+4*(r->i) movl %eax,16(%edx) # Update r->p 0 t  #HC  N wawa1?"`r  7void set_p(struct rec *r) { r->p = &r->a[r->i]; }80 8> r  S @ ,`0   ~  s * ,@0   F @ A   @ ARN 0 1    @ A   Z wawa8c?   =i 0    Z wawa8c?   =a 0    ZԐ wawa8c?!1  4 0    Z| wawa8c?0   ;00    Z$ wawa8c?P    ;40    Z wawa8c?   <160 f2   68c?`    BpC DEFԔ?p @` @@0rB  BD8c?pp   Tԙ wawa1?`    Element iD 08 Z4aYiSF 0 1    @ A   ZP wawa8c?   =i 0    Zh wawa8c?   =a 0    ZH wawa8c?!1  =p 0    Z wawa8c?0   ;00    Z wawa8c?P    ;40    ZD wawa8c?   <160 H  0޽h ? GGG   0L0  <(   ~  s *pF ,`0    ~  s * ,@0   H  0޽h ? GGGy___PPT10Y+D='  = @B +p " 0L0 <4% (   1  N6 wawa1?"`q  -struct S1 { int i; char c; int j; } *p;.0 .6 ~  s * < ,`0   ~  s *< ,@0     Z8> wawa8c? EH`  =i 0   ZB wawa8c? E5`  =c 0   ZE wawa8c? <, `  =j 0   ZI wawa8c?h M  =0 0   ZM wawa8c?h M  =4 0   ZpQ wawa8c?h M  =5 0   3 rLU 1? *1  yEImpossible to satisfy 4-byte alignment requirement for both I and jF0F   `Y wawa8c?c | l ,$D 0 =j 0 3l <c  % c < ,$D 0    `^ wawa8c?   =8 0     `c wawa8c?"`<c  4 0 l $c  $ c $,$D 0    `(b wawa8c?Yc \ =i 0     ` wawa8c?Yc I =c 0     ` wawa8c?$ =0 0     ` wawa8c? =4 0  !   ` wawa8c? =5 0 5 # 3 r 1? ,$ 0 _+Compiler inserts a 3-byte gap to solve this,0,H  0޽h ? GGG  ___PPT10 +k*5D '  = @B D ' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*$ %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*# %(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*% %(+p+0+ 0 ++0+# 0 + & 0L0   ](   r  S X ,`0     S ~0 wawa1 ?,@0   -F 0 u    0u   Z, wawa8c? ^  Ba[0]"0    Z` wawa8c?0  Aa+0"0    Z$ wawa8c?n  Ba[1]"0    Z wawa8c?  ^  Ba[2]"0    ZĴ wawa8c? 9  Ba+12"0    ZP wawa8c?  Ba+24"0    Z wawa8c? 9 Ba+36"0    Z4 wawa8c? u  B " " " 0 jB  BD8c? @ jB  @ BD8c?  3  N8wawa1?"`A /struct S2 { int i; int j; char c; } a[4];00 06}8 @` 5   ` V5    Zwawa8c?@P 5  >a+120    Zpwawa8c?P ` 5  >a+200    Zswawa8c?P z5  >a+160    Zwawa8c? P 5  >a+240     `Gwawa8c?`   =i 0     `Awawa8c?`   =j 0 l   <8c? `     Zwawa8c?`   =c 0    ZTwawa8c? P p 5  >a+210 H  0޽h ? GGGy___PPT10Y+D='  = @B + ) 0L0 P ?(   r  S ~,`0     S ~wawa1 ?,@0  l M    },$D 0#   NL¦wawa1?"`M  3union U1 { char c; int i[2]; double v; } *up;40 4FN 8 G   P     Zdwawa8c?H8   =c 0    Z?wawa8c?H 8  @i[0] 0    Z\dwawa8c?H 8  @i[1] 0    Zwawa8c?H 8h =v 0    Zxwawa8c?bG @up+0 0    Z1wawa8c?bG @up+4 0    Z wawa8c?bG @up+8 0 &  N$ wawa1?"``! 4struct S1 { char c; int i[2]; double v; } *sp;50 5$8  kM  k     ` wawa8c? ` =c 0     `wawa8c? ` @i[0] 0     ` wawa8c? ` @i[1] 0     `P wawa8c? ` =v 0 l   <8c? `    ` wawa8c?hJM @sp+0 0     ` wawa8c?hJM @sp+4 0     ` wawa8c?hJ M @sp+8 0     ` wawa8c? h M Asp+12 0     ` wawa8c?KhkM Asp+20 0 H  0޽h ? GGG~___PPT10^+YDB'  = @B D' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(+ * 0L0   `  (     N wawa1?"`bp 4 g+unsigned copy (unsigned u) { return u; } ,0 ,  Z( wawa8c? =u 0   Z wawa8c?P =f 0   Z wawa8c?Js/ =0 0   Z wawa8c?Js/ =4 0 i  N wawa1?"`p  munsigned float2bit(float f) { union { float f; unsigned u; } temp; temp.f = f; return temp.u; } n0 n,Pr  S  ,`0   "  c $ ,P@@   Store it using one type & access it with another one Get direct access to bit representation of float bit2float generates float with given bit pattern NOT the same as (float) u float2bit generates bit pattern from float NOT the same as (unsigned) f+f (  "      N wawa1?"` ^,$@ 0 ?pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax leave ret@0@~ N   fЛ 1?  6,$ 0 LThere s no type info in assembly code!'0 2'H  0޽h ? GGG___PPT10t+rD'  = @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(+p+0+ 0 ++0+ 0 + 1 0  <(   ~  s * ,`0    ~  s * ,@0   H  0޽h ? GGGy___PPT10Y+D='  = @B + a 0  (   X  C d   =   S t= d9 3  =   H  0ηo~ ? 3380___PPT10.  b 0  (   X  C d     S  d9 3    H  0ηo~ ? 3380___PPT10. c 0  (   X  C d     S C d9 3    H  0ηo~ ? 3380___PPT10.# d 0  (   X  C d     S ȍ d9 3    H  0ηo~ ? 3380___PPT10. e 0   (   X  C d     S  d9 3    H  0ηo~ ? 3380___PPT10. f 0 0 (   X  C d   g   S  g d9 3  g   H  0ηo~ ? 3380___PPT10.@0 g 0 @ (   X  C d      S  d9 3     H  0ηo~ ? 3380___PPT10.඙ h 0 P (   X  C d      S ) d9 3     H  0ηo~ ? 3380___PPT10.඙ i 0 ` (   X  C d     S L d9 3    H  0ηo~ ? 3380___PPT10.= j 0 p (   X  C d     S T d9 3    H  0ηo~ ? 3380___PPT10.= k 0  (   X  C d     S [ d9 3    H  0ηo~ ? 3380___PPT10.J l 0  (   X  C d     S a d9 3    H  0ηo~ ? 3380___PPT10.J m 0  (   X  C d     S  d9 3    H  0ηo~ ? 3380___PPT10.`џ n 0  (   X  C d   J   S  J d9 3  J   H  0ηo~ ? 3380___PPT10.`џ o 0  (   X  C d   J   S UJ d9 3  J   H  0ηo~ ? 3380___PPT10.X p 0  (   X  C d   &   S n& d9 3  &   H  0ηo~ ? 3380___PPT10.X q 0  (   X  C d   $   S \$ d9 3  $   H  0ηo~ ? 3380___PPT10.ޢ r 0  (   X  C d   a  S `ad9 3  a  H  0ηo~ ? 3380___PPT10.@e s 0  (   X  C d   U  S  Ud9 3  U  H  0ηo~ ? 3380___PPT10.0  u 0  ( (  ( X ( C d   U ( S ZUd9 3  U  H ( 0ηo~ ? 3380___PPT10.Ц v 0 0, (  , X , C d   U  , S TU d9 3  U   H , 0ηo~ ? 3380___PPT10.Ц y 0 `8 (  8 X 8 C d   U  8 S |:U d9 3  U   H 8 0ηo~ ? 3380___PPT10. z 0 p< (  < X < C d    < S  d9 3    H < 0ηo~ ? 3380___PPT10. { 0 @ (  @ X @ C d    @ S - d9 3    H @ 0ηo~ ? 3380___PPT10. | 0 D (  D X D C d    D S 83 d9 3    H D 0ηo~ ? 3380___PPT10.: ~ 0 L (  L X L C d    L S  d9 3    H L 0ηo~ ? 3380___PPT10.P  0 \ (  \ X \ C d    \ S d9 3    H \ 0ηo~ ? 3380___PPT10.G  0  h (  h X h C d    h S < d9 3    H h 0ηo~ ? 3380___PPT10.0U  0 0l (  l X l C d     l S  d9 3     H l 0ηo~ ? 3380___PPT10.۶  0  (   X  C d      S  d9 3     H  0ηo~ ? 3380___PPT10.orH ]k\sz=0)8,q5/lي*VuKPQ U@NͽZC^a Fi@c0257,9@;T=h?|ACEGIKMPR0TDVXX~ lZ\@^`bdfh k m4oHq1Oh+'0T hp    (0 CS 343 OSFabian E. Bustamante aqualab01Fabian E. Bustamante102Microsoft PowerPoint@O" @QZ@`O7MGSg  )'    """)))UUUMMMBBB999|PP3f333f3333f3ffffff3f̙3ff333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffff3ffff̙fff3fffff3fff333f3f3ff3ff33f̙̙3̙ff̙̙̙3f̙3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3ffffffffff!___wwwTh4'A x(xKʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___wwweeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮϮ՜.+,0P  $ , On-screen Show$CompSci - Northwestern University 'ArialTahomaTimes New Roman WingdingsVerdana Courier NewTimes Helvetica 1_aqualab01)Machine-Level Prog. IV - Structured DataBasic data typesArray allocation Array accessArray exampleArray accessing exampleReferencing examplesArray loop exampleArray loop implementationNested array exampleNested array allocationNested array row accessNested array row access codeNested array element access!Nested array element access codeStrange referencing examplesMulti-level array example$Element access in multi-level arrayArray element accessesUsing nested arraysDynamic nested arrays Structures%Generating pointer to struct. memberStructure referencing (Cont.) Alignment%Satisfying alignment with structuresArrays of structuresUnion allocation#Using union to access bit patternsSummary  Fonts UsedDesign Template Slide Titles,_r0Fabian E. BustamanteFabian E. Bustamante  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     !"#$%&'()*+,-./012346789:;<>?@ABCDKRoot EntrydO)PicturesCCurrent User=SummaryInformation( UPowerPoint Document(PrDocumentSummaryInformation85