Οργάνωση Η/Υ Παραδείγματα Προγραμματισμού σε Assembly του TRN Τμήμα Εφαρμοσμένης Πληροφορικής Πανεπιστήμιο Μακεδονίας Α. Χατζηγεωργίου-Η. Σακελλαρίου
Παραδείγματα Προγραμματισμού Αναζήτηση του μεγίστου σε ένα πίνακα αριθμών χωρίς πρόσημο που βρίσκεται τοποθετημένος στη μνήμη από τη θέση TAB και μετά, και το πλήθος των στοιχείων είναι το περιεχόμενο της θέσης μνήμης SIZE NAME MAXELM ORG 100 TAB: RES 10 ORG 0 SIZE: CON 10 MAX: RES 1
Παραδείγματα Προγραμματισμού LDI SIZE JIG START (Έλεγχος αν SIZE = 0 ) JMP EXIT START: DCI (Ο κατ. Ι δείχνει στο τελευταίο στοιχείο) LDA,I TAB STA MAX (Αρχικά, max = TABLE[size-1] ) LOOP: DCI LDA,I TAB SUB MAX JPN SAME (Το max παραμένει το ίδιο αν Α[i] < max ) LDA,I TAB STA MAX (αν Α[i] >= max, τότε max = A[i] ) SAME: JIG LOOP (Έλεγχος αν τελείωσε ο βρόχος) EXIT: HLT
Πολλαπλασιασμός Πολλαπλασιασμός μεταξύ θετικών αριθμών, από τις εισόδους 0 και 1. Απλή προσέγγιση: Πρόσθεσε στον πολλαπλασιαστέο τον εαυτό του, τόσες φορές όσες είναι ο πολλαπλασιαστής. MULT: STOP: NAM MUL ORG 0 INP 0 STA NUM1 INP 1 STA NUM2 ENA 0 LDI NUM2 JIG MULT JMP STOP DCI ADA NUM1 NUM1: RES 1 NUM2: RES 1 RESULT: RES 1 JIG MULT STA RESULT HLT
Πολλαπλασιασμός ΙΙ Πολλαπλασιασμός μεταξύ δύο μη αρνητικών δυαδικών αριθμών. Παράδειγμα: Shift-Add Αποτέλεσμα = 0. Αν το τελευταίο bit του πολλαπλασιαστή είναι 1 τότε πρόσθεσε τον πολλαπλασιαστέο στο αποτέλεσμα. Αν είναι 0, τότε μην κάνεις τίποτε. Ολίσθηση αριστερά πολλαπλασιαστέος. Ολίσθηση δεξιά πολλαπλασιαστής (για να πάρω το επόμενο τελευταίο bit). 00101 * 01010 00000 001010 0000000 00101000 000000000 000110010
Πολλαπλασιασμός NAM MULTI ORG 0 ENA 0 STA RESULT INP 0 STA NUM1 INP 1 STA NUM2 MUL: LDA NUM2 AND MASK JPZ BIT0 BIT1: LDA RESULT ADA NUM1 STA RESULT BIT0: STOP: LDA NUM2 SHA -1 ORA MASK0 JPZ STOP STA NUM2 LDA NUM1 SHA 1 STA NUM1 JMP MUL MASK0: CON 0 MASK: CON 1 NUM1: RES 1 NUM2: RES 1 RESULT: RES 1 BIT: RES 1 LDA RESULT OUT 9 HLT
Διαίρεση-Κλασσική Μέθοδος Διαδοχικές αφαιρέσεις DIV: NAM DIV ORG 0 LDX ZERO INP 1 STA NUM2 ORA ZERO JPZ STOP INP 0 STA NUM1 SUB NUM2 JPN DIV INX JMP DIV DIV: ADA NUM2 STA YPOL STX PHL STOP: HLT ZERO: CON 0 NUM1: RES 1 NUM2: RES 1 YPOL: RES 1 PHL: RES 1
Υλοποίηση Στοίβας Λειτουργίες Στοίβας: PUSH SP: Βάλε το περιεχόμενο του συσσωρευτή Α στην στοίβα SP, POP SP: Πάρε το πρώτο στοιχείο της στοίβας SP, και τοποθέτησε το στο συσσωρευτή Α. Προϋπόθεση:Να μην αλλάξει τίποτε στους υπόλοιπους καταχω-ρητές. NAM TESTST EXT PUSH,POP ORG 0 ENA 10 JSR PUSH ENA 20 JSR PUSH ENA 30 JSR PUSH JSR POP HLT
Υλοποίηση Στοίβας NAM STACK ENT SP,PUSH,POP ORG 100 PUSH: RES 1 STX STR LDX SP INX STX SP LDX STR STA (SP) JMP (PUSH) POP: RES 1 LDA (SP) STI STR LDI SP DCI STI SP LDI STR JMP (POP) STR: RES 1 SP: CON 119 ORG 120 RES 40
Πέρασμα Παραμέτρων (1/2) Να γραφεί πρόγραμμα το οποίο υλοποιεί την πράξη RESULT = (INP 0) * (INP 1) καλώντας μια συνάρτηση με δύο ορίσματα. Τα 0 και 1 είναι οι θύρες εισόδου. Το αποτέλεσμα θα επιστρέφεται στον συσσωρευτή, και θα δίνεται σαν έξοδος στη θύρα 8 (OUT 8). Τα δύο ορίσματα περνούν στην συνάρτηση κατά αξία.
Συνάρτηση με Πέρασμα Παραμέτρων NAM CALL EXT MULFUN,NUM1,NUM2 ORG 0 INP 0 STA NUM1 INP 1 STA NUM2 JSR MULFUN OUT 8 HLT NAM MULL ENT MULFUN,NUM1,NUM2 ORG 40 MULFUN: RES 1 ENA 0 LDI NUM2 JIG MULT JMP STOP MULT: DCI ADA NUM1 JIG MULT STOP: JMP (MULFUN) NUM1: RES 1 NUM2: RES 1
Πέρασμα Παραμέτρων 2/2 Να γραφεί πρόγραμμα το οποίο υλοποιεί την πράξη RESULT = (INP 0) * (INP 1) καλώντας μια συνάρτηση με δύο ορίσματα. Τα 0 και 1 είναι οι θύρες εισόδου. Το αποτέλεσμα θα επιστρέφεται στη θέση μνήμης RESULT. Τα δύο ορίσματα περνούν στην συνάρτηση κατά αξία. Η θέση RESULT πρέπει να περάσει κατά αναφορά.
Συνάρτηση με Πέρασμα Παραμέτρων NAM CALL EXT MULFUN,NUM1,NUM2,MRES ORG 0 INP 0 STA NUM1 INP 1 STA NUM2 ENA 30 STA MRES JSR MULFUN LDA RESULT OUT 8 HLT ORG 30 RESULT: RES 1 NAM MULL ENT MULFUN,NUM1,NUM2,MRES ORG 100 MULFUN: RES 1 ENA 0 LDI NUM2 JIG MULT JMP STOP MULT: DCI ADA NUM1 STOP: NUM1: RES 1 NUM2: RES 1 MRES: RES 1 JIG MULT STA (MRES) JMP (MULFUN)
Πέρασμα μέσω Σωρού Αν έχουμε πολλές συναρτήσεις τότε θα υπάρχουν πολλές εξωτερικές αναφορές στις διευθύνσεις των συναρτήσεων. Χρήση σωρού για πέρασμα παραμέτρων? Χρησιμοποιούμε την υλοποίηση του σωρού που περιγράφηκε παραπάνω. Τα ορίσματα αποθηκεύονται στο σωρό που είναι ο δίαυλος επικοινωνίας μεταξύ των τμημάτων του προγράμματος.
Κυρίως Πρόγραμμα ; Passing Parameters through the stack. NAM CALL EXT MULFUN,SP,POP,PUSH ORG 0 INP 0 Αποθήκευση 1ου ορίσματος στο σωρό. JSR PUSH INP 1 Αποθήκευση 2ου ορίσματος στο σωρό. JSR PUSH ENA 30 JSR PUSH JSR MULFUN LDA RESULT OUT 8 HLT ORG 30 RESULT: RES 1 ; PASS THE ADDRESS OF RESULT Αποθήκευση διεύθυνσης επιστροφής αποτελέσματος.
Συνάρτηση Multiply NAM MULL ENT MULFUN EXT SP,POP,PUSH ORG 100 MULFUN: RES 1 JSR POP STA MRES JSR POP STA NUM2 JSR POP STA NUM1 ENA 0 LDI NUM2 JIG MULT JMP STOP MULT: DCI ADA NUM1 JIG MULT STOP: STA (MRES) ; JMP (MULFUN) NUM1: RES 1 NUM2: RES 1 MRES: RES 1 Ανάκτηση ορισμάτων από το σωρό.
Μεταβλητός Αριθμός Ορισμάτων Έστω ότι θέλουμε να κατασκευάσουμε μια συνάρτηση η οποία να δέχεται μεταβλητό αριθμό ορισμάτων. πχ. μια συνάρτηση πρόσθεσης αριθμών, ενός οποιουδήποτε πίνακα. Σαν παράμετρο περνάμε το μέγεθος του πίνακα και τα στοιχεία. Το αποτέλεσμα αποθηκεύεται στον καταχωρητή συσσωρευτή.
Κυρίως Πρόγραμμα LOOP: NAM ADDING EXT SP,PUSH,POP,ADD ORG 0 LDI SIZE DCI LDA,I TAB JSR PUSH JIG LOOP LDA SIZE JSR PUSH JSR ADD OUT 8 HLT Αποθήκευση ορισμάτων στο σωρό. SIZE: CON 10 TAB: CON 10,20,30,40,50,60,70,80,90,100 Αποθήκευση μεγέθους πίνακα στο σωρό.
Συνάρτηση πρόσθεσης NAM ADDFUN ENT ADD EXT SP,PUSH,POP ORG 100 ADD: RES 1 JSR POP STA TEMP LDI TEMP ENA 0 STA TEMP ALOOP: JSR POP ADA TEMP STA TEMP DCI JIG ALOOP JMP (ADD) TEMP: RES 1 Ανάκτηση μεγέθους πίνακα από το σωρό. Ανάκτηση ορισμάτων από το σωρό και πρόσθεση.
Παραδείγματα Προγραμματισμού Ταξινόμηση bubblesort (H πρώτη διεύθυνση του πίνακα είναι η ΤΑΒ, το μέγεθος του στη θέση SIZE) i=n-1; while(i>0) { j=0; while(j<i) { if (A[i] < A[j]) swap (A[i], A[j] ); j = j+1; } i = i-1; }
Παραδείγματα Προγραμματισμού NAM BUBBLE ORG 100 TAB: RES 5 ORG 0 SIZE: CON 5 (Μέγεθος του πίνακα) INDXI: RES 1 INDXJ: RES 1 AI: RES 1 AJ: RES 1
Παραδείγματα Προγραμματισμού LOOPI: LOOPJ: LDA SIZE DCA STA INDXI ( i = n-1; ) JPZ P ENA 0 STA INDXJ ( j = 0; ) LDA INDXI SUB INDXJ ( A = i j ) JPN LOO ( i-j < 0 => i < j ) JPZ LOO ( i-j = 0 => i = j ) LDI INDXI LDA,I TAB ( A <- A[i] STA AI
Παραδείγματα Προγραμματισμού SWAP: NOSWAP: LDI INDXJ LDA,I TAB ( A <- A[j] ) STA AJ SUB AI ( A <- A[j] A[i] ) JPN NOSWAP ( if A<0 => A[i] > A[j] ) LDA AI STA,I TAB (A[j] <- A[i]) LDI INDXI LDA AJ STA,I TAB (A[i] <- A[j] ) LDA INDXJ INA ( j = j + 1) STA INDXJ JMP LOOPJ
Παραδείγματα Προγραμματισμού LOO: P: LDA INDXI DCA ( i = i 1; ) STA INDXI JMP LOOPI HLT
Χρήση Έμμεσης Προσπέλασης Εκτέλεση μιας διαδικασίας σε ένα σύνολο στοιχείων τα οποία είναι αποθηκευμένα σε διαδοχικές θέσεις μνήμης PTR: δείκτης του πίνακα με αρχική τιμή τη διεύθυνση του πρώτου στοιχείου του πίνακα CTR: αριθμός στοιχείων του πίνακα SUM: άθροισμα των στοιχείων του πίνακα ΝΑΜ ΤΕST ORG 0 LOOP: LDX PTR INX CTR: CON 5 STX PTR PTR: CON 20 ADA (PTR) SUM: RES 1 DCI LDI CTR DCI LDA (PTR) JIG LOOP STA SUM HLT
Χρήση Δεικτοδοτημένης Έμμεσης Χρησιμοποιείται κατά την επεξεργασία πινάκων οι οποίοι περιέχουν διευθύνσεις αντί για δεδομένα Ένα σύστημα ανάκτησης μετρήσεων συλλέγει δεδομένα από Ν διαφορετικά κανάλια (κάθε κανάλι έχει 10 θέσεις), τα προσθέτει και βάζει το αποτέλεσμα σε ένα πίνακα. 300 310 F 300 310 320 320 330 390 Κανάλι 0 Κανάλι 1 Κανάλι 2
Χρήση Δεικτοδοτημένης Έμμεσης LDX COUNT BACK:... LOOP: ADA,I (F)... I -- if(i>0) goto LOOP STA,I (F) LDA B INA STA B LDA B+1 INA STA B+1... COUNT++ if(count<10) goto BACK
Χρήση Δεικτοδοτημένης Έμμεσης Β 300 310 300 310 320 320 330 390 Κανάλι 0 Κανάλι 1 Κανάλι 2
Χρήση Δεικτοδοτημένης Έμμεσης Β 301 300 310 320 311 321 331 391 Κανάλι 0 Κανάλι 1 Κανάλι 2
Το πρόγραμμα (1/2) NAM ADDTABLES ORG 0 LDX ZERO STR: ENA 0 LDI TABS DCI ADL: ADA,I (F) DCI JIG ADL STA,I (F) Πρόσθεση όλων των στοιχείων και αποθήκευση στον πρώτο πίνακα LDI TABS ADD1: DCI LDA,I F INA STA,I F JIG ADD1 INX STX COUNT LDA SIZE SUB COUNT JAG STR HLT Αύξηση των διευθύνσεων κατά 1. Αύξηση του counter και έλεγχος
Το πρόγραμμα (1/2) COUNT: CON 0 ZERO: CON 0 TABS: CON 4 SIZE: CON 6 F: CON 300, 310, 320, 330 ORG 300 RES 10 ORG 310 CON 2,3,1,2,1,3 ORG 320 CON 3,5,4,3,2,3 ORG 330 CON 2,3,4,5,3,2
Παραδείγματα σε Assembly Απλά προγράμματα Πέρασμα Παραμέτρων Δεικτοδοτούμενη και Έμμεση Αναφορά.