Ãëþóóá ôåôñüäùí ÌïñöÞ ôåôñüäáò: n: op, x, y, z üðïõ: n: åôéêýôá ôåôñüäáò (öõóéêüò áñéèìüò) op: ôåëåóôþò x, y, z: ôåëïýìåíá ÁíÜëïãá ìå ôï åßäïò ôïõ ôåëåóôþ, êüðïéá ôåëïýìåíá åíäå ïìýíùò ðáñáëåßðïíôáé Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 132 / 216
Ôåëïýìåíá (i) ÓôáèåñÜ ¼íïìá áêýñáéá, ðñáãìáôéêþ, ëïãéêþ áñáêôþñáò, óõìâïëïóåéñü, nil ìåôáâëçôþ, ðáñáìýôñïò, õðïðñüãñáììá ÐñïóùñéíÞ ìåôáâëçôþ: $n ÁðïôÝëåóìá óõíüñôçóçò: $$ Áðïäåéêôïäüôçóç: [x] x áðëü ôåëïýìåíï Äéåýèõíóç: {x} x áðëü ôåëïýìåíï Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 133 / 216
Ôåëïýìåíá (ii) ÅôéêÝôá åíôïëþò óôï áñ éêü ðñüãñáììá ôåôñüäáò Ôñüðïò ðåñüóìáôïò V : êáô' áîßá R : êáô' áíáöïñü RET : èýóç áðïôåëýóìáôïò óõíüñôçóçò Êåíü : ÐñïóùñéíÜ êåíü : * (ãéá backpatching) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 134 / 216
ÔåëåóôÝò (i) unit, I,, endu, I,, áñ Þ êáé ôýëïò äïìéêþò ìïíüäáò op, x, y, z op {+, -, *, /, %} z := x op y :=, x,, z z := x array, x, y, z z := ç äéåýèõíóç ôïõ óôïé åßïõ x[y] Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 135 / 216
ÔåëåóôÝò (ii) op, x, y, z op {=, <>, >, <, >=, <=} áí x op y ôüôå ðþãáéíå óôçí ôåôñüäá z ifb, x,, z áí ç ëïãéêþ ôéìþ x åßíáé áëçèþò ôüôå ðþãáéíå óôçí ôåôñüäá z jump,,, z ðþãáéíå óôçí ôåôñüäá z label, I,, jumpl,,, I ïñéóìüò åôéêýôáò êáé Üëìá ðñïò áõôþí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 136 / 216
ÔåëåóôÝò (iii) call,,, I êüëåóå ôç äïìéêþ ìïíüäá I par, x, m, ðýñáóå ôçí ðñáãìáôéêþ ðáñüìåôñï x ìå ôñüðï ðåñüóìáôïò m ret,,, åðéóôñïöþ áðü ôçí ôñý ïõóá äïìéêþ ìïíüäá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 137 / 216
ÌåôáâëçôÝò éäéïôþôùí PLACE: èýóç üðïõ âñßóêåôáé áðïèçêåõìýíç ç ôéìþ ìéáò l-value Þ ìéáò r-value TYPE: ôýðïò ìéáò l-value Þ ìéáò r-value NEXT : ëßóôá áðü åôéêýôåò ôåôñüäùí ðïõ ðåñéý ïõí Üëìáôá óôçí åðüìåíç åíôïëþ TRUE, FALSE: ëßóôåò áðü åôéêýôåò ôåôñüäùí ðïõ ðåñéý ïõí Üëìáôá óôïí êþäéêá ðïõ ðñýðåé íá åêôåëåóôåß áí ìéá óõíèþêç åßíáé áëçèþò Þ øåõäþò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 138 / 216
ÂïçèçôéêÝò õðïñïõôßíåò (i) NEXTQUAD() ÅðéóôñÝöåé ôïí áñéèìü ôçò åðüìåíçò ôåôñüäáò GENQUAD(op, x, y, z) ÃåííÜ ôçí åðüìåíç ôåôñüäá op, x, y, z NEWTEMP(t) Äçìéïõñãåß ìéá íýá ðñïóùñéíþ ìåôáâëçôþ ôýðïõ t EMPTYLIST() Äçìéïõñãåß ìéá êåíþ ëßóôá åôéêåôþí ôåôñüäùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 139 / 216
ÂïçèçôéêÝò õðïñïõôßíåò (ii) MAKELIST(x) Äçìéïõñãåß ìéá ëßóôá åôéêåôþí ôåôñüäùí ðïõ ðåñéý åé ìüíï ôï óôïé åßï x MERGE(l 1,..., l n ) ÓõíÝíùóç ôùí ëéóôþí åôéêåôþí ôåôñüäùí l 1... l n BACKPATCH(l, z) ÁíôéêáèéóôÜ óå üëåò ôéò ôåôñüäåò ðïõ ðåñéý ïíôáé óôçí l ôçí Üãíùóôç åôéêýôá ôåôñüäáò ìå ôç z (backpatching) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 140 / 216
ÁñéèìçôéêÝò åêöñüóåéò ÁêÝñáéåò óôáèåñýò r-value ::= integer-const { P 1 } P 1 : { r-value.place = integer-const ; } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 141 / 216
ÁñéèìçôéêÝò åêöñüóåéò ÁêÝñáéåò óôáèåñýò r-value ::= integer-const { P 1 } P 1 : { r-value.place = integer-const ; } ÔåëåóôÝò ìå äýï ôåëïýìåíá r-value ::= expr binop expr { P 14 } P 14 : { W = NEWTEMP( r-value.type); GENQUAD( binop.name, expr 1.PLACE, expr 2.PLACE, W ); r-value.place = W ; } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 141 / 216
ËïãéêÝò åêöñüóåéò (i) <cond>... jump,,, 31... jump,,, 42... jump,,, 31... jump,,, 31... jump,,, 42... <cond>.false <cond>.true Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 142 / 216
ËïãéêÝò åêöñüóåéò (ii) ËïãéêÝò åêöñüóåéò óå óõìâïëéóìü 0/1 cond ::= expr <cond> <expr> ifb, <expr>.place,, * jump,,, * FALSE TRUE Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 143 / 216
ËïãéêÝò åêöñüóåéò (iii) ËïãéêÝò åêöñüóåéò óå óõìâïëéóìü 0/1 cond ::= expr { P 21 } P 21 : { cond.true = MAKELIST(NEXTQUAD()); GENQUAD(ifb, expr.place,, ); cond.false = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 144 / 216
ËïãéêÝò åêöñüóåéò (iv) ÔåëåóôÝò óýãêñéóçò cond ::= expr 1 relop expr 2 <cond> <expr> 1 <expr> 2 relop, <expr> 1.PLACE, <expr> 2.PLACE, * jump,,, * FALSE TRUE Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 145 / 216
ËïãéêÝò åêöñüóåéò (v) ÔåëåóôÝò óýãêñéóçò cond ::= expr 1 relop expr 2 { P 23 } P 23 : { cond.true = MAKELIST(NEXTQUAD()); GENQUAD( relop.name, expr 1.PLACE, expr 2.PLACE, ); cond.false = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 146 / 216
ËïãéêÝò åêöñüóåéò (vi) ñíçóç cond ::= \not" cond <cond> TRUE <cond> FALSE FALSE TRUE Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 147 / 216
ËïãéêÝò åêöñüóåéò (vii) Óýæåõîç cond ::= cond 1 \and" cond 2 <cond> FALSE <cond> 1 TRUE FALSE <cond> 2 TRUE FALSE TRUE Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 148 / 216
ËïãéêÝò åêöñüóåéò (viii) Óýæåõîç cond ::= cond 1 \and" { P 25 } cond 2 { P 26 } P 25 : { BACKPATCH( cond 1.TRUE, NEXTQUAD()); } P 26 : { cond.false = MERGE( cond 1.FALSE, cond 2.FALSE); cond.true = cond 2.TRUE; } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 149 / 216
ÁðëÝò åíôïëýò ÊåíÞ åíôïëþ stmt ::= ɛ { P 29 } P 29 : { stmt.next = EMPTYLIST(); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 150 / 216
ÁðëÝò åíôïëýò ÊåíÞ åíôïëþ stmt ::= ɛ { P 29 } P 29 : { stmt.next = EMPTYLIST(); } ÅíôïëÞ áíüèåóçò stmt ::= l-value \:=" expr { P 30 } P 30 : { GENQUAD(\:=", expr.place,, l-value.place); stmt.next = EMPTYLIST(); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 150 / 216
Óýíèåôç åíôïëþ (i) stmt ::= block block ::= \begin" stmt ( \;" stmt ) \end" <block> <stmt> 1 NEXT <stmt> 2 NEXT NEXT Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 151 / 216
Óýíèåôç åíôïëþ (ii) stmt ::= block { P 34 } P 34 : { stmt.next = block.next ; } block ::= \begin" stmt 1 { P 35 } ( \;" { P 36 } stmt 2 { P 37 } ) \end" { P 38 } P 35 : { L = stmt 1.NEXT ; } P 36 : { BACKPATCH(L, NEXTQUAD()); } P 37 : { L = stmt 2.NEXT ; } P 38 : { block.next = L; } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 152 / 216
ÅíôïëÞ if (i) stmt ::= \if " cond \then" stmt [ \else" stmt ] <stmt> FALSE <cond> TRUE <stmt> TRUE <cond> FALSE <stmt> 1 jump,,, * NEXT <stmt> 1 NEXT <stmt> 2 NEXT NEXT NEXT Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 153 / 216
ÅíôïëÞ if (ii) stmt ::= \if " cond { P 39 } \then" stmt 1 [ \else" { P 40 } stmt 2 { P 41 } ] { P 42 } P 39 : { BACKPATCH( cond.true, NEXTQUAD()); L 1 = cond.false; L 2 = EMPTYLIST(); } P 40 : { L 1 = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); BACKPATCH( cond.false, NEXTQUAD()); } P 41 : { L 2 = stmt 2.NEXT ; } P 42 : { stmt.next = MERGE(L 1, stmt 1.NEXT, L 2 ); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 154 / 216
ÅíôïëÞ while (i) stmt ::= \while" cond \do" stmt <stmt> FALSE <cond> TRUE <stmt> 1 jump,,, * NEXT NEXT Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 155 / 216
ÅíôïëÞ while (ii) stmt ::= \while" { P 43 } cond \do" { P 44 } stmt 1 { P 45 } P 43 : { Q = NEXTQUAD(); } P 44 : { BACKPATCH( cond.true, NEXTQUAD()); } P 45 : { BACKPATCH( stmt 1.NEXT, Q); GENQUAD(jump,,, Q); stmt.next = cond.false; } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 156 / 216
ÊëÞóç õðïðñïãñáììüôùí (i) call ::= id \(" [ expr ( \," expr ) ] \)" r-value ::= call stmt ::= call ÐÝñáóìá ðáñáìýôñùí ìå ôåôñüäåò par ÐÝñáóìá èýóçò áðïôåëýóìáôïò ìå ôåôñüäá par áí ðñüêåéôáé ãéá óõíüñôçóç ÊëÞóç ìå ôåôñüäá call Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 157 / 216
ÊëÞóç õðïðñïãñáììüôùí (ii) call ::= id \(" { P 46 } [ expr 1 { P 47 } ( \," expr 2 { P 48 } ) ] \)" { P 49 } P 46 : { N = 1; } P 47 : { GENQUAD(\par", expr 1.PLACE, PARAMMODE( id, N ), ); N = N + 1; } P 48 : { GENQUAD(\par", expr 2.PLACE, PARAMMODE( id, N ), ); N = N + 1; } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 158 / 216
ÊëÞóç õðïðñïãñáììüôùí (iii) call ::= id \(" { P 46 } [ expr 1 { P 47 } ( \," expr 2 { P 48 } ) ] \)" { P 49 } (óõíý åéá) P 49 : { if (ISFUNCTION( id )) { W = NEWTEMP(FUNCRESULT( id )); GENQUAD(par, RET, W, ); call.place = W ; } GENQUAD(call,,, id ); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 159 / 216
ÊëÞóç õðïðñïãñáììüôùí (iv) ÊëÞóç óõíüñôçóçò r-value ::= call { P 50 } P 50 : { r-value.place = call.place; } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 160 / 216
ÊëÞóç õðïðñïãñáììüôùí (iv) ÊëÞóç óõíüñôçóçò r-value ::= call { P 50 } P 50 : { r-value.place = call.place; } ÊëÞóç äéáäéêáóßáò stmt ::= call { P 51 } P 51 : { stmt.next = EMPTYLIST(); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 160 / 216
ÊëÞóç õðïðñïãñáììüôùí (v) ÅðéóôñïöÞ áðü õðïðñüãñáììá stmt ::= \return" [ expr { P 52 } ] { P 53 } P 52 : { GENQUAD(retv, expr.place,, ); } P 53 : { GENQUAD(ret,,, ); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 161 / 216
ÊëÞóç õðïðñïãñáììüôùí (v) ÅðéóôñïöÞ áðü õðïðñüãñáììá stmt ::= \return" [ expr { P 52 } ] { P 53 } P 52 : { GENQUAD(retv, expr.place,, ); } P 53 : { GENQUAD(ret,,, ); } ÄÞëùóç õðïðñïãñüììáôïò body ::= ( local ) { P 56 } block \;" { P 57 } P 56 : { GENQUAD(unit, I,, ); } P 57 : { BACKPATCH( block.next, NEXTQUAD()); GENQUAD(endu, I,, ); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 161 / 216
(i) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; quicksort(a, m, j); quicksort(a, i, n) end; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 162 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 3: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 3: jump,,, 4: ret,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 4: ret,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 5 4: ret,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 5 4: ret,,, 5: :=, m,, i Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 5 4: ret,,, 5: :=, m,, i 6: :=, n,, j Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 163 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 8: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 14: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 15: +, i, 1, $5 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 15: +, i, 1, $5 16: :=, $5,, i Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 23: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 24:, j, 1, $10 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 24:, j, 1, $10 25: :=, $10,, j Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 24:, j, 1, $10 25: :=, $10,, j 26: jump,,, 18 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 27 24:, j, 1, $10 25: :=, $10,, j 26: jump,,, 18 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 164 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 28: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 37: :=, $15,, i Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 37: :=, $15,, i 38:, j, 1, $16 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 37: :=, $15,, i 38:, j, 1, $16 39: :=, $16,, j Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 165 / 216
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 166 / 216
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin end end; temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 7: <=, i, j, 9 8: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 166 / 216
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin end end; temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 7: <=, i, j, 9 8: jump,,,... 27: <=, i, j, 29 28: jump,,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 166 / 216
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin end end; temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 7: <=, i, j, 9 8: jump,,,... 27: <=, i, j, 29 28: jump,,,... 40: jump,,, 7 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 166 / 216
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin end end; temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 7: <=, i, j, 9 8: jump,,,... 27: <=, i, j, 29 28: jump,,, 7... 40: jump,,, 7 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 166 / 216
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin end end; temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 7: <=, i, j, 9 8: jump,,, 41... 27: <=, i, j, 29 28: jump,,, 7... 40: jump,,, 7 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 166 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, 42: par, m, V, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, 42: par, m, V, 43: par, j, V, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, 47: par, n, V, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, 47: par, n, V, 48: call,,, quicksort Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
(vi) end; quicksort(a, m, j); quicksort(a, i, n) 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, 47: par, n, V, 48: call,,, quicksort 49: endu, quicksort,, Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 167 / 216
Ôåëéêüò õðïëïãéóôþò (i) áñáêôçñéóôéêü: ÅðåîåñãáóôÞò: Intel 8086 Ëåéôïõñãéêü óýóôçìá: MS-DOS ÌïíôÝëï ìíþìçò: COM / tiny ÓõíïëéêÞ ìíþìç 64 K ÏñãÜíùóç óå Ýíá segment Áñ éêþ äéåýèõíóç ôïõ ðñïãñüììáôïò ç 100h ÓõìâïëéêÞ ãëþóóá: óõìâáôþ ìå ôï óõìâïëïìåôáöñáóôþ MASM (Microsoft macro assembler) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 171 / 216
Ôåëéêüò õðïëïãéóôþò (ii) Êáôá ùñçôýò, ìåãýèïõò 16 bit ÃåíéêÞò öýóçò: ax, bx, cx, dx óå æåýãç ôùí 8 bit: ah, al, ê.ëð. Êáôá ùñçôýò äåßêôåò: sp (äåßêôçò óôïßâáò) êáé bp (äåßêôçò âüóçò) Êáôá ùñçôýò áíáöïñüò: si êáé di Êáôá ùñçôýò ôìçìüôùí: cs (code), ds (data), ss (stack) êáé es (extra) Åéäéêïß êáôá ùñçôýò: ip (instruction pointer) êáé êáôá ùñçôþò óçìáéþí (ags) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 172 / 216
Ôåëéêüò õðïëïãéóôþò (iii) Äéåõèýíóåéò: address = segment 16 + offset ÌïñöÞ åíôïëþò: [ label ] opname [ operand 1 [, operand 2 ] ] Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 173 / 216
Ôåëéêüò õðïëïãéóôþò (iv) ÅíôïëÝò: ÌåôáöïñÜò: mov, lea Áñéèìçôéêþí ðñüîåùí: add, sub, neg, imul, idiv, cmp, cwd Ëïãéêþí ðñüîåùí: and, or, xor, not, test ëìáôïò: jmp, jz, jnz, jl, jle, jg, jge Äéá åßñéóçò óôïßâáò: push, pop ÕðïðñïãñáììÜôùí: call, ret ÐñÜîåùí êéíçôþò õðïäéáóôïëþò (x87 FPU) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 174 / 216
ÅíôïëÝò ìåôáöïñüò mov destination, source mov ax, 42 mov ax, bx mov ax, [1000h] mov ax, [si] mov ax, [si + 6] mov ax, [bp + 6] mov ax, [si + bp + 6] lea destination, source Êáèïñéóìüò ìåãýèïõò äåäïìýíùí mov ax, word ptr [bp + 6] mov al, byte ptr [bp + 6] (move) (load eective address) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 175 / 216
ÁñéèìçôéêÝò ðñüîåéò add op 1, op 2 op 1 := op 1 + op 2 sub op 1, op 2 op 1 := op 1 op 2 neg op imul op idiv op cwd op := op (dx, ax) := ax op ax := (dx, ax) div op dx := (dx, ax) mod op åðýêôáóç ðñïóþìïõ ôïõ ax óôïí dx cmp op 1, op 2 óýãêñéíå ôá op 1 êáé op 2 åíçìýñùóå ôéò óçìáßåò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 176 / 216
ËïãéêÝò ðñüîåéò and op 1, op 2 op 1 := op 1 and op 2 or op 1, op 2 op 1 := op 1 or op 2 not op op := not op xor op 1, op 2 op 1 := op 1 xor op 2 test op 1, op 2 op 1 and op 2 åíçìýñùóå ôéò óçìáßåò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 177 / 216
ÅíôïëÝò Üëìáôïò jmp address jz address Þ je address jnz address Þ jne address jl address jle address jg address jge address ùñßò óõíèþêç ìçäýí / ßóï ü é ìçäýí / äéüöïñï ìéêñüôåñï ìéêñüôåñï Þ ßóï ìåãáëýôåñï ìåãáëýôåñï Þ ßóï Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 178 / 216
ÅíôïëÝò óôïßâáò push op pop op ðñüóèåóç óôç óôïßâá sp := sp 2, [sp] := op áöáßñåóç áðü ôç óôïßâá op := [sp], sp := sp + 2 Ç óôïßâá áõîüíåé ðñïò ôá êüôù, äçëáäþ ðñïò ìéêñüôåñåò äéåõèýíóåéò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 179 / 216
ÅíôïëÝò õðïðñïãñáììüôùí call address ret êëþóç sp := sp 2, [sp] := ip, ip := address åðéóôñïöþ ip := [sp], sp := sp + 2 Ç ôéìþ ôïõ ip ðïõ ôïðïèåôåßôáé óôç óôïßâá áðü ôçí call åßíáé ç äéåýèõíóç ôçò åíôïëþò ðïõ áêïëïõèåß ôçí call Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 180 / 216
ÅíôïëÝò x87 FPU (i) ÅéäéêÞ óôïßâá 8 êáôá ùñçôþí: ST(0),... ST(7) fld source fld tbyte ptr @real1 fild source fild word ptr [bp 2] fstp destination fld tbyte ptr [bp 10] fistp destination fild word ptr [bp 2] (load real & push) (load integer & push) (pop & store real) (pop & store integer) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 181 / 216
ÅíôïëÝò x87 FPU (ii) faddp ST(1), ST(0) fsubp ST(1), ST(0) fmulp ST(1), ST(0) fdivp ST(1), ST(0) fchs fcompp fstsw destination fstsw ax fstsw word ptr [bp 2] ST(1) := ST(1) + ST(0) & pop ST(1) := ST(1) ST(0) & pop ST(1) := ST(1) ST(0) & pop ST(1) := ST(1)/ST(0) & pop ST(0) := ST(0) ST(1) ST(0) & pop both (store x87 FPU ags) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 182 / 216
Äéá åßñéóç ìíþìçò (i) ÄïìÞ åíïôþôùí (block structure) Ìç ôïðéêü äåäïìýíá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 183 / 216
Äéá åßñéóç ìíþìçò (i) ÄïìÞ åíïôþôùí (block structure) Ìç ôïðéêü äåäïìýíá ÅããñÜöçìá äñáóôçñéïðïßçóçò (activation record / frame) ÐáñÜìåôñïé ÁðïôÝëåóìá Ðëçñïöïñßåò êáôüóôáóçò ìç áíþò ÔïðéêÝò ìåôáâëçôýò ÐñïóùñéíÝò ìåôáâëçôýò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 183 / 216
Äéá åßñéóç ìíþìçò (ii)... bp+8 Παράµετρος 1 Παράµετρος 2... Παράµετρος n Παράµετρος 1 Παράµετρος 2... Παράµετρος n Παράµετροι αρχή bp+6 ιεύθυνση αποτελέσµατος ιεύθυνση αποτελέσµατος bp+4 bp+2 bp bp-2 bp-4... Σύνδεσµος προσπέλασης ιεύθυνση επιστροφής Προηγούµενο bp Τοπική µεταβλητή 1 Τοπική µεταβλητή 2... Τοπική µεταβλητή m ιεύθυνση επιστροφής Προηγούµενο display Προηγούµενο bp Τοπική µεταβλητή 1 Τοπική µεταβλητή 2... Τοπική µεταβλητή m Σταθερό Τµήµα Τοπικές µεταβλητές βάση Προσωρινή µεταβλητή 1 Προσωρινή µεταβλητή 2... Προσωρινή µεταβλητή k Προσωρινή µεταβλητή 1 Προσωρινή µεταβλητή 2... Προσωρινή µεταβλητή k Προσωρινές µεταβλητές τέλος α) Σύνδεσµοι προσπέλασης β) Πίνακας δεικτών Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 184 / 216
Äéá åßñéóç ìíþìçò (iii) Ε κύριου προγράµµατος Ε υποπρογράµµατος 1... Ε υποπρογράµµατος m στοίβα εκτέλεσης ελεύθερη µνήµη µνήµη για αποθήκευση δεδοµένων 64Κ δυναµικό δεδοµένο k... σωρός δυναµικό δεδοµένο 1 µεταφρασµένος κώδικας µνήµη για αποθήκευση του κώδικα του προγράµµατος συνολική διαθέσιµη µνήµη 0Κ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 185 / 216
ÐñïóðÝëáóç ïíïìüôùí ÔïðéêÜ: [bp + offset] Ìç ôïðéêü: [si + offset] ï si ðñýðåé íá äåß íåé óôç âüóç ôïõ åããñáöþìáôïò äñáóôçñéïðïßçóçò üðïõ ôá äåäïìýíá åßíáé ôïðéêü Ôï ðñüâëçìá áíüãåôáé óôïí åíôïðéóìü ôïõ áíôßóôïé ïõ åããñáöþìáôïò äñáóôçñéïðïßçóçò Ëýóåéò ðïõ âáóßæïíôáé óôï âüèïò öùëéüóìáôïò: Óýíäåóìïé ðñïóðýëáóçò (access links) Ðßíáêåò äåéêôþí (link tables / displays) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 186 / 216
Óýíäåóìïé ðñïóðýëáóçò (i) Áñ Þ ëåéôïõñãßáò óôù üôé ç äïìéêþ ìïíüäá p âñßóêåôáé öùëéáóìýíç ìýóá óôç äïìéêþ ìïíüäá q Óôï ÅÄ ôçò p ôïðïèåôåßôáé Ýíá óýíäåóìïò ðñïò ôç âüóç ôïõ ÅÄ ôçò ðéï ðñüóöáôçò êëþóçò ôçò q ÊáôÜ ôçí êëþóç õðïðñïãñáììüôùí, áðáéôåßôáé ôåëéêüò êþäéêáò ãéá ôçí åíçìýñùóç ôùí óõíäýóìùí ðñïóðýëáóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 187 / 216
Óýíäåóìïé ðñïóðýëáóçò (ii) Ôñüðïò ñþóçò óôù üôé æçôåßôáé ôï äåäïìýío a ðïõ åßíáé ôïðéêü óå ìéá äïìéêþ ìïíüäá ìå âüèïò öùëéüóìáôïò n a óôù üôé âñéóêüìáóôå óå ìéá äïìéêþ ìïíüäá p ìå âüèïò öùëéüóìáôïò n p n a Áêïëïõèïýìå n p n a óõíäýóìïõò ðñïóðýëáóçò ÊáôÜ ôçí ðñïóðýëáóç ïíïìüôùí, áðáéôåßôáé ôåëéêüò êþäéêáò ãéá ôçí õëïðïßçóç ôùí ðáñáðüíù Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 188 / 216