Παραγωγή Τελικού Κώδικα Γιώργος Μανής
Τειηθόξ Κώδηθαξ Ενδιάμεζος Κώδικας Παραγωγή Τελικού Κώδικα Τελικός Κώδικας
Η Γιώζζα Μεπακήξ Καηαπςνεηέξ R[0], R[1], R[2],, R[255] Ο θαηαπςνεηήξ R[0] πνεζημμπμείηαη ζακ δείθηεξ ζημίβαξ Ο program counter ζομβμιίδεηαη με $ Πνόζβαζε ζηε μκήμε Μ[address] M[R[ ]] M[R[0]+offset]
Η Γιώζζα Μεπακήξ ini tr outi so1 tr register so1 register addi tr,so1,so2 subi tr,so1,so2 muli tr,so1,so2 divi tr,so1,so2 tr=so1 + so2 tr=so1 - so2 tr=so1 * so2 tr=so1 / so2
Η Γιώζζα Μεπακήξ movi tr,so1 tr := so1 tr μκήμε register register register register so1 register μκήμε ανηζμόξ R[0] (o SP) PC
Η Γιώζζα Μεπακήξ jmp addr cmpi so1,so2 jb addr jbe addr ja addr jae addr je addr jne addr addr label, M[..], R[..], δ/ζε(ανηζμόξ) so1,so2 registers addr label, M[..], R[..], δ/ζε(ανηζμόξ) addr label, M[..], R[..], δ/ζε(ανηζμόξ) addr label, M[..], R[..], δ/ζε(ανηζμόξ) αddr label, M[..], R[..], δ/ζε(ανηζμόξ) αddr label, M[..], R[..], δ/ζε(ανηζμόξ) addr label, M[..], R[..], δ/ζε(ανηζμόξ)
Η Γιώζζα Μεπακήξ Ο θαηαπςνεηήξ SR είκαη έκαξ πίκαθαξ 8 ζέζεςκ θαη ημκ επενεάδμοκ ε cmpi θαη μ έιεγπμξ γηα overflow. Η cmpi επενεάδεη ημ SR[0] θαη ημ SR[1]. Ακ μη δομ ανηζμμί είκαη ίζμη ημ SR[0] γίκεηαη 1 θαη ακ μ πνώημξ ανηζμόξ είκαη μεγαιύηενμξ από ημκ δεύηενμ ηόηε ημ SR[1] γίκεηαη 1. Ο έιεγπμξ οπενπείιηζεξ επενεάδεη ημ SR[7] θαη ακ οπάνπεη οπενπείιηζε ηόηε γίκεηαη 1. Όηακ ε εκημιή είκαη jb, jbe, ja, jae, je, jne, jo ειέγπεη ηα SR[0] θαη SR[1] θαη ακ ηζπύμοκ μη θαηάιιειεξ ζοκζήθεξ πεγαίκεη ημκ PC ζημ ζςζηό ζεμείμ.
Η Σοκάνηεζε gnlvcode Μεηαθένεη ζημκ R[255] ηε δηεύζοκζε μίαξ με ημπηθήξ μεηαβιήηήξ movi R[255], M[4+R[0]] όζεξ θμνέξ πνεηαζηεί: R[255]=M[4+R[0]] movi R[255], M[4+R[255]] R[255]=M[4+R[255]] movi R[254], offset addi R[255], R[254], R[255] R[254]=offset R[255]=R[254]+R[255]
Η Σοκάνηεζε loadvr(v,r) ακ v είκαη ανηζμόξ: movi R[r], v R[r]= v ακ v είκαη global μεηαβιεηή - δειαδή ημο θονίςξ πνμγνάμμαημξ movi R[r], M[600+offset] R[r]= M[600+offset] ακ v ημπηθή μεηαβιεηή ή ηοπηθή πανάμεηνμξ πμο πενκάεη με ηημή θαη βάζμξ θςιηάζμαημξ ίζμ με ημ ηνέπμκ ή πνμζςνηκή μεηαβιεηή: movi R[r], M[offset+R[0]] R[r]= M[offset+R[0]]
Η Σοκάνηεζε loadvr(v,r) ακ v ηοπηθή πανάμεηνμξ πμο πενκάεη με ακαθμνά θαη βάζμξ θςιηάζμαημξ ίζμ με ημ ηνέπμκ: movi R[255], M[offset+R[0]] movi R[r], M[R[255]] R[255]=M[offset+R[0]] R[r]=M[R[255]] ακ v ημπηθή μεηαβιεηή ή ηοπηθή πανάμεηνμξ πμο πενκάεη με ηημή θαη βάζμξ θςιηάζμαημξ μηθνόηενμ από ημ ηνέπμκ: gnlvcode( ) ώζηε μ R[255] κα έπεη ηεκ ζςζηή δ/ζε movi R[r], M[R[255]] R[r]=M[R[255]]
Η Σοκάνηεζε loadvr(v,r) ακ v ηοπηθή πανάμεηνμξ πμο πενκάεη με ακαθμνά θαη βάζμξ θςιηάζμαημξ μηθνόηενμ από ημ ηνέπμκ: gnlvcode( ) ώζηε μ R[255] κα έπεη ηεκ ζςζηή δ/κζε movi R[255], M[R[255]] movi R[r], M[R[255]] R[255]=M[R[255]] R[r]=M[R[255]]
Η Σοκάνηεζε storerv(r,v) ακ v είκαη global μεηαβιεηή - δειαδή ημο θονίςξ πνμγνάμμαημξ movi M[600+offset], R[r] M[600+offset] = R[r] ακ v ημπηθή μεηαβιεηή ή ηοπηθή πανάμεηνμξ πμο πενκάεη με ηημή θαη βάζμξ θςιηάζμαημξ ίζμ με ημ ηνέπμκ ή πνμζςνηκή μεηαβιεηή : : movi M[offset+R[0]], R[r] M[offset+R[0]] = R[r]
Η Σοκάνηεζε storerv(r,v) ακ v ηοπηθή πανάμεηνμξ πμο πενκάεη με ακαθμνά θαη βάζμξ θςιηάζμαημξ ίζμ με ημ ηνέπμκ: movi R[255], M[offset+R[0]] movi M[R[255]], R[r] R[255]=M[offset+R[0]] M[R[255]] = R[r] ακ v ημπηθή μεηαβιεηή ή ηοπηθή πανάμεηνμξ πμο πενκάεη με ηημή θαη βάζμξ θςιηάζμαημξ μηθνόηενμ από ημ ηνέπμκ gnlvcode( ) ώζηε μ R[255] κα έπεη ηεκ ζςζηή δ/ζε movi M[R[255]], R[r] M[R[255]] = R[r]
Η Σοκάνηεζε storerv(r,v) ακ v ηοπηθή πανάμεηνμξ πμο πενκάεη με ακαθμνά θαη βάζμξ θςιηάζμαημξ μηθνόηενμ από ημ ηνέπμκ: gnlvcode( ) ώζηε μ R[255] κα έπεη ηεκ ζςζηή δ/κζε movi R[255], M[R[255]] movi M[R[255]],R[r] R[255]=M[R[255]] M[R[255]]=R[r]
Εκημιέξ Αιμάηςκ jump,_,_,w jmp Lw relop,x,y,w loadvr(x,1) loadvr(y,2) cmpi R[1], R[2] condjmp Lw relop={=,<>,>,>=,<,<=} R[1]=x R[2]=y comdjmp={je,jne,jb,jbe,ja,jae} H cmp επενεάδεη ημκ θαηαπςνεηή SR θαη μη je,jne,jb,jbe,ja,jae ημκ ειέγπμοκ θαη θάκμοκ ή όπη ημ άιμα οπό ζοκζήθε
Εθπώνεζε :=,x,_,z loadvr(x,1) storerv(1,z) R[1]=x z=r[1]
Εκημιέξ Ανηζμεηηθώκ Πνάλεςκ op,x,y,z loadvr(x,1) loadvr(y,2) op={+,-,*,/} op R[3], R[1], R[2] storerv(3,z) R[1]=x R[2]=y z=r[3] op={addi,subi,muli,divi} μπμνεί γηα ημ απμηέιεζμα ηεξ op va πνεζημμπμηεζεί θαη έκαξ από ημοξ R[1] θαη R[2]
Εκημιέξ Εηζόδμο-Ελόδμο out,x,_,_ loadvr(x,1) outi R[1] in,x,_,_ ini R[1] storerv(1,x) R[1]=x x =R[1]
Επηζηνμθή Τημήξ Σοκάνηεζεξ :=,x,_,return_value loadvr(x,1) movi R[255],M[8+R[0]] movi M[R[255]],R[1] R[1]=x απμζεθεύεηαη μ x ζηεκ δηεύζοκζε πμο είκαη απμζεθεομέκε ζηεκ 3ε ζέζε ημο εγγναθήμαημξ δναζηενημπμίεζεξ.
Πανάμεηνμη Σοκάνηεζεξ par,x,cv,_ (πανάμεηνμξ με ηημή) loadvr(x,255) R[255]=x movi M[d+R[0]], R[255] d=framelength+12+4*i i=αύλoκηαξ ανηζμόξ παναμέηνμο
Πανάμεηνμη Σοκάνηεζεξ par,x,ref,_ (πανάμεηνμξ με ακαθμνά) Ακ ε θαιμύζα θαη ε μεηαβιεηή x έπμοκ ημ ίδημ βάζμξ θςιηάζμαημξ: Ακ ε πανάμεηνμξ x είκαη ζηεκ θαιμύζα ζοκάνηεζε ημπηθή μεηαβιεηή ή πανάμεηνμξ πμο έπεη πεναζηεί με ηημή: movi R[255],R[0] movi R[254],offset addi R[255], R[254],R[255] movi M[d+R[0]], R[255]
Πανάμεηνμη Σοκάνηεζεξ par,x,ref,_ (πανάμεηνμξ με ακαθμνά) Ακ ε θαιμύζα θαη ε μεηαβιεηή x έπμοκ ημ ίδημ βάζμξ θςιηάζμαημξ: Ακ ε πανάμεηνμξ x έπεη πεναζηεί ζηεκ θαιμύζα ζοκάνηεζε με ακαθμνά: movi R[255],R[0] movi R[254],offset addi R[255], R[254],R[255] movi R[1], Μ[R[255]] movi M[d+R[0]], R[1]
Πανάμεηνμη Σοκάνηεζεξ par,x,ref,_ (πανάμεηνμξ με ακαθμνά) Ακ ε θαιμύζα θαη ε μεηαβιεηή x έπμοκ δηαθμνεηηθό βάζμξ θςιηάζμαημξ: Ακ ε πανάμεηνμξ x είκαη ζηεκ θαιμύζα ζοκάνηεζε ημπηθή μεηαβιεηή ή πανάμεηνμξ πμο έπεη πεναζηεί με ηημή: gnlvcode( ) movi M[d+R[0]], R[255] Ακ ε πανάμεηνμξ x έπεη πεναζηεί ζηεκ θαιμύζα ζοκάνηεζε με ακαθμνά: gnlvcode( ) movi R[1], Μ[R[255]] movi M[d+R[0]], R[1]
Πανάμεηνμη Σοκάνηεζεξ par,x,ret,_ γεμίδμομε ημ 3μ πεδίμ ηεξ θιεζείζαξ ζοκάνηεζεξ με ηεκ δ/κζε ηεξ πνμζςνηκήξ μεηαβιεηήξ όπμο ζα επηζηναθεί ε ηημή movi R[255], R[0] movi R[254], offset ηεξ πνμζςνηκήξ μεηαβιεηήξ addi R[255],R[254], R[255] movi M[framelength+8+R[0]], R[255]
Κιήζε Σοκάνηεζεξ Ανπηθά γεμίδμομε ημ 2μ πεδίμ ηεξ ζημίβαξ ηεξ θαιμύμεκεξ ζοκάνηεζεξ με ηεκ δ/κζε ηεξ ανπήξ ηεξ παηνηθήξ ζοκάνηεζεξ ηεξ θιεζείζαξ, ώζηε ε θαιμύμεκε κα λένεη πμο κα θμηηάλεη γηα ηηξ μεηαβιεηέξ ζηηξ μπμίεξ έπεη πνόζβαζε. Ακ ε θαιμύζα θαη ε θιεζείζα έπμοκ ημ ίδημ βάζμξ θςιηάζμαημξ (θαιμύζα θαη θιεζείζα έπμοκ ημκ ίδημ παηένα): movi R[255], M[4+R[0]] movi M[framelenth+4+R[0]], R[255] Ακ θαιείηαη ζοκάνηεζε με μεγαιύηενμ βάζμξ θςιηάζμαημξ από ηεκ θαιμύζα (ε θαιμύζα είκαη μ παηέναξ ηεξ θιεζείζαξ): movi M[framelength+4+R[0]],R[0]
Κιήζε Σοκάνηεζεξ Ο έιεγπμξ πενκάεη ζηεκ θιεζείζα ζοκάνηεζε θαη γίκεηαη ημ γέμηζμα ημο 1μο πεδίμο ηεξ ζημίβαξ ώζηε κα λένμομε πμο ζα επηζηνέρμομε όηακ μιμθιενςζεί ε εθηέιεζε ηεξ ζοκάνηεζεξ movi R[255], framelength addi R[0], R[255], R[0] (Ο SP ζηεκ ανπή ηεξ κέαξ ζημίβαξ) movi R[255], $ movi R[254], 15 addi R[255], R[255], R[254] movi M[R[0]], R[255] (1μ πεδίμ) jmp Lstart_quad (πέναζμα ειέγπμο) 4 bytes 4 bytes 4 bytes 3 bytes --------- 15 bytes ζύκμιμ
Κιήζε Σοκάνηεζεξ επηζηνμθή ζηεκ θαιμύζα: movi R[255],framelength subi R[0], R[0], R[255] (δείθηεξ ζημίβαξ) end_block,x,_,_ jmp M[R[0]]
Ανπή θαη Τενμαηηζμόξ Πνμγνάμμαημξ Ανπή πνμγνάμμαημξ Άιμα ζηεκ πνώηε εθηειέζημε εκημιή Τενμαηηζμόξ πνμγνάμμαημξ halt,_,_,_ halt