Σύνοψη των εντολών του LC3

Σχετικά έγγραφα
Επίλυση προβλημάτων μέσω Η/Υ

Οργάνωση επεξεργαστή (1 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Οργάνωση Η/Υ. Ο Επεξεργαστής TRN. Τμήμα Εφαρμοσμένης Πληροφορικής Πανεπιστήμιο Μακεδονίας Α. Χατζηγεωργίου-Η. Σακελλαρίου

Συμβολική Γλώσσα στον ΑΒΑΚΑ

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Φροντιστήριο: MIPS assembly

ΑΡΧΙΤΕΚΤΟΝΙΚΗ HARDWARE ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ

Κεφάλαιο 3 Αρχιτεκτονική Ηλεκτρονικού Τμήματος (hardware) των Υπολογιστικών Συστημάτων ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ

ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Διάλεξη 3 Εντολές του MIPS (2)

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Μεταγλώτιση, σύνδεση

Εντολές του MIPS (2)

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Οργάνωση και Σχεδίαση Υπολογιστών Η Διασύνδεση Υλικού και Λογισμικού, 4 η έκδοση. Σύντομη Εισαγωγή στη χρήση του προσομοιωτή και συμβολομεταφραστή

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Δομημένος Προγραμματισμός

Αρχιτεκτονική Υπολογιστών

Τέτοιες λειτουργίες γίνονται διαμέσου του

Στόχοι και αντικείμενο ενότητας. Προτάσεις επανάληψης. Έλεγχος ροής προγράμματος. #5.. Εντολές Επανάληψης

Αρχιτεκτονική Υπολογιστών

Προγραμματισμός Ι (HY120)

Σύγχρονες Αρχιτεκτονικές Υπολογιστών

Διαδικασίες Ι. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 4

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Εργαστήριο Δομής και Λειτουργίας Μικροϋπολογιστών. Βοήθημα εκτέλεσης εργαστηριακής άσκησης 3: Εντολές λογικών πράξεων και εντολές κλήσης ρουτινών

Στοιχεία αρχιτεκτονικής μικροεπεξεργαστή

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΛΑΜΙΑΣ. A. Μετατροπή αριθμών 1. Μετατροπή αριθμών από δεκαδικό σε δυαδικό σύστημα αρίθμησης

Εισαγωγή στην πληροφορική -4

Συμβολική γλώσσα Εκπαιδευτικού Υπολογιστή - Λογισμικό Υπολογιστών

Οργάνωση Υπολογιστών

1 η Ενδιάμεση Εξέταση Απαντήσεις/Λύσεις

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 2 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Μηχανοτρονική. Τμήμα Μηχανικών Παραγωγής και Διοίκησης 7 ο Εξάμηνο,

Εγχειρίδιο χρήσης του Άβακα

Γενική οργάνωση υπολογιστή «ΑΒΑΚΑ»

Υπολογισμός - Εντολές Επανάληψης

Δομή Επανάληψης. Κεφάλαιο 7 Mike Trimos

Αρχιτεκτονική Υπολογιστών

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. Τρίτη (3 η ) δίωρη διάλεξη. Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών Ι

ΗΜΥ 213. Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών. Διδάσκων: Δρ. Γιώργος Ζάγγουλος

Αρχιτεκτονικη υπολογιστων

Ερωτήσεις θεωρίας MY. Μέρος Α. Υλικό.

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΔΕΥΤΕΡΗ ΠΡΟΟΔΟΣ ΣΤΗΝ ΟΡΓΑΝΩΣΗ ΣΤΟΥΣ Η/Y (ΗΥ232)

Προγραμματισμός Η/Υ. Ενότητα 5: Εντολές Επανάληψης

Οργάνωση Υπολογιστών ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Ασκήσεις 5: Εντολές Συγκρίσεων και Μεταφοράς Ελέγχου. Μανόλης Γ.Η.

Εργαστήριο 3 ΟΡΓΑΝΩΣΗ ΤΗΣ ΚΜΕ. Εισαγωγή

Οργάνωση Η/Υ. Γλώσσα Assembly. Τμήμα Εφαρμσμένης Πληροφορικής Πανεπιστήμιο Μακεδονίας Α. Χατζηγεωργίου-Η. Σακελλαρίου

Ο πιο κάτω πίνακας περιγράφει σε ποιες περιπτώσεις χρησιμοποιούμε τους τρεις πιο πάνω τρόπους:

Αρχιτεκτονική υπολογιστών

Παραδείγματα Προγραμματισμού σε Assembly του TRN

Κεντρική Μονάδα Επεξεργασίας

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

ΕΠΛ605 Εργασία 1 Ημερομηνία Παράδοσης 12/9/2018 στην αρχή του μαθήματος

Αρχιτεκτονική Υπολογιστών

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών H/Y Department of Electrical and Computer Engineering. Εργαστήριο 1. Χειμερινό Εξάμηνο

Αρχιτεκτονική Υπολογιστών

Σημειώσεις για τον 80x86

Εργαστήριο 2. Εαρινό Εξάμηνο Εντολές για είσοδο ακεραίων αριθμών από την κονσόλα:

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Διαδικασιακός Προγραμματισμός

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Συναρτήσεις-Διαδικασίες

Αρχιτεκτονική Υπολογιστών

και η µονάδα ελέγχου (control) O επεξεργαστής: Η δίοδος δεδοµένων (datapath) Εντολές διακλάδωσης (branch beq, bne) I Type Σχεδίαση datapath

Στοιχεία από Assembly Γιώργος Μανής

Αρχιτεκτονικές Συνόλου Εντολών

(Ιούνιος 2001 ΤΕΕ Ηµερήσιο) Σε κάθε µία από τις παρακάτω περιπτώσεις, να

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών ARM και x86

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

HY340, 2009 Α. Σαββίδης Slide 2 / 143. HY340, 2009 Α. Σαββίδης Slide 3 / 143. HY340, 2009 Α. Σαββίδης Slide 4 / 143

Διαδικαστικός Προγραμματισμός

Εισαγωγή στον Προγραμματισμό

O επεξεργαστής: Η δίοδος δεδομένων (datapath) και η μονάδα ελέγχου (control)

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών

Απλός επεξεργαστής (Επανάληψη)

Τελική Εξέταση, Απαντήσεις/Λύσεις

Υπολογιστικά Συστήματα Λογική Σχεδίαση Αρχιτεκτονική Η/Υ Διδάσκοντες: Δρ. Ευγενία Αδαμοπούλου, Δρ. Κώστας Δεμέστιχας

Ολοκληρωμένα Κυκλώματα - Φθινόπωρο 2014 Γ. Δημητρακόπουλος. Εργαστηριακή άσκηση 2

Αρχιτεκτονική υπολογιστών

Chapter 5. Ο επεξεργαστής: διαδρομή δεδομένων και μονάδα ελέγχου. Ενδέκατη (11 η ) δίωρη διάλεξη.

Δομημένος Προγραμματισμός (ΤΛ1006)

Άσκηση 1 (α) Άσκηση 1 (γ) Άσκηση 1 (β) Παραδείγματα Assembly. Άρα με έλεγχο στον $t1 αποφασίζω αν είναι 0 ή 1.

Μικροαρχιτεκτονική του LC3

Επεξεργαστής Υλοποίηση ενός κύκλου μηχανής

ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Intel x86 ISA. Νίκος Μπέλλας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών ΗΥ

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

i Όλες οι σύγχρονες ΚΜΕ είναι πολυπλοκότερες!

2. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΤΩΝ ΘΥΡΩΝ ΕΙΣΟ ΟΥ/ΕΞΟ ΟΥ ΤΟΥ PIC16F877-ΑΡΙΘΜΗΤΙΚΕΣ ΕΝΤΟΛΕΣ

Data-Level Parallelism Linking & Loading

MIPS Interactive Learning Environment. MILE Simulator. Version 1.0. User's Manual

Οργάνωση Υπολογιστών (Ι)

LANGUAGE OF THE MACHINE. TEI Κρήτης, Τμ. ΕΠΠ, Αρχιτεκτονική Υπολογιστών. Οργάνωση Υπολογιστή. Τυπική οργάνωση υπολογιστή

Πληρουορική Γ Γσμμασίοσ

Εισαγωγή στην πληροφορική

Transcript:

Σύνοψη των εντολών του LC3 ADD Dst, Src1, Src2 ADD Dst, Src1, imm5 AND Dst, Src1, Src2 AND Dst, Src1, imm5 NOT Dst, Src LD Dst, LABEL ST Src, LABEL LDR Dst, BaseR, offset6 STR Src, BaseR, offset6 LDI Dst, LABEL STI Src, LABEL LEA Dst, LABEL JMP BaseR BR[nzp] LABEL JSR LABEL JSRR BaseR RET TRAP trapvector8 RTI 2

Assembly του LC-3 Η assembly του LC-3 είναι μια γλώσσα χαμηλού επιπέδου για την αρχιτεκτονική συνόλου εντολών (ISA) του LC-3 Η LC-3 assembly είναι συμβολική γλώσσα Ο προγραμματιστής δε χρειάζεται να θυμάται το opcode κάθε εντολής, ούτε μια διεύθυνση στη μνήμη σε δυαδικό Assembly του LC3 Συμβολο-μεταφραστής (assembler) Γλώσσα Μηχανής του LC3 Εκτέλεση 3

Assembly του LC-3 Η assembly του LC-3 είναι μια γλώσσα χαμηλού επιπέδου για την αρχιτεκτονική συνόλου εντολών (ISA) του LC-3 Η LC-3 assembly είναι συμβολική γλώσσα Ο προγραμματιστής δε χρειάζεται να θυμάται το opcode κάθε εντολής, ούτε μια διεύθυνση στη μνήμη σε δυαδικό Πρόγραμμα σε C Μεταγλωττιστής Assembly του LC3 Συμβολομεταφραστής Γλώσσα Μηχανής του LC3 Εκτέλεση 4

LC-3 Simulator Ο LC-3 είναι ένα σχέδιο για έναν υπολογιστή δεν υπάρχει σε πραγματική υλοποίηση (hardware) Έχει σχεδιαστεί η αρχιτεκτονική συνόλου εντολών και μια μικροαρχιτεκτονική που την υλοποιεί Ο LC-3 simulator μας επιτρέπει να δούμε τι θα συνέβαινε κατά την εκτέλεση ενός προγράμματος: Στη μνήμη Στους καταχωρητές 5

LC-3 Simulator Με την εκκίνηση του simulator, εμφανίζονται δύο παράθυρα: το LC-3 console και το LC-3 interface To LC-3 console χρησιμεύει για είσοδο από το πληκτρολόγιο και έξοδο στην οθόνη 6

LC-3 Simulator Στο LC-3 interface μπορούμε να δούμε: τους καταχωρητές γενικού σκοπού (R0-R7) τους καταχωρητές ειδικού σκοπού (PC, IR, PSR,CC) τη μνήμη (65536 θέσεις) 7

Download LC-3 Simulator http://highered.mheducation.com/sites/00724675 09/student_view0/lc-3_simulator.html Windows και Unix version 8

Χρήση του LC-3 simulator (σε Linux/MacOS) Βήμα 1: Γράφουμε τον assembly κώδικα σε κάποιον editor (vim, emacs, gedit κλπ) και το αποθηκεύουμε με κατάληξη.asm π.χ. myfirstlc3program.asm Βήμα 2: Κάνουμε τη συμβολομετάφραση του κώδικα assembly: lc3as myfirstlc3program.asm και παράγεται το αρχείο myfirstlc3program.obj, που περιέχει εκτελέσιμο κώδικα (και το αρχείο myfirstlc3program.sym...) Βήμα 3: Ξεκινάμε τον simulator: lc3sim-tk & Βήμα 4: Φορτώνουμε το αρχείο.obj και εκτελούμε! 9

Χρήση του LC-3 simulator (σε Windows) Βήμα 1: Γράφουμε τον assembly κώδικα στον editor που παρέχεται μαζί με τον simulator και τον αποθηκεύουμε με κατάληξη.asm π.χ. myfirstlc3program.asm Βήμα 2: Κάνουμε τη συμβολομετάφραση του κώδικα assembly πατώντας το κουμπί asm του editor και παράγεται το αρχείο myfirstlc3program.obj, που περιέχει εκτελέσιμο κώδικα (και το αρχείο myfirstlc3program.sym) Βήμα 3: Ξεκινάμε τον simulator από το εκτελέσιμο Βήμα 4: Φορτώνουμε το αρχείο.obj και εκτελούμε. 10

Πρόγραμμα σε LC-3 Assembly Με τι μοιάζει ένα πρόγραμμα σε LC-3 assembly; Μορφή εντολών: [LABEL] <OP> <OPERANDS>; Σχόλια Παράδειγμα:.ORIG x3000 AND R1,R1,x0 ; clear R1, to be used for the running sum AND R4,R4,x0 ; clear R4, to be used as a counter ADD R4,R4,xA ; load R4 with #10, the number of times to add LEA R2,x0FC ; load the starting address of the data LOOP LDR R3,R2,x0 ; load the next number to be added ADD R2,R2,x1 ; increment the pointer ADD R1,R1,R3 ; add the next number to the running sum ADD R4,R4,#-1 ; decrement the counter BRp LOOP ; do it again if the counter is not yet zero HALT ; abbreviation of TRAP HALT.END 11

Ψευδοεντολές Τι είναι τα.orig,.end της προηγούμενης διαφάνειας; Στον LC-3 assembler ορίζονται ορισμένες ψευδοεντολές Λέγονται και οδηγίες προς το συμβολομεταφραστή (assembler directives) Δεν μεταφράζονται σε λειτουργίες του προγράμματος Βοηθούν τον assembler στη διαδικασία της συμβολομετάφρασης Ψευδοεντολές του LC-3.ORIG,.FILL,.BLKW,.STRINGZ,.END 12

Ψευδοεντολή.ORIG.ORIG MEMORY_LOCATION Δηλώνει στον assembler σε ποια θέση μνήμης θα τοποθετηθεί το πρόγραμμα Αν ένα πρόγραμμα αρχίζει με την εντολή.orig x3000 : Εικόνα μνήμης πριν τη φόρτωση του προγράμματος Εικόνα μνήμης μετά τη φόρτωση του προγράμματος Η διεύθυνση x3000 είναι «καλή» διεύθυνση για την εκχώρηση του προγράμματος, γιατί βρίσκεται αρκετές θέσεις μνήμης μακριά από τον κώδικα του λειτουργικού συστήματος 13

Υπενθύμιση: Η μνήμη στον LC3 14

Ψευδοεντολή.END.END Δηλώνει στον assembler πού τελειώνει το πρόγραμμα Οτιδήποτε ακολουθεί την ψευδοεντολή.end δε θα μεταφραστεί από τον assembler Προσοχή στη λεπτομέρεια: Ως ψευδοεντολή, το.end δε μεταφράζεται σε κάποια λειτουργία Δε σηματοδοτεί το τέλος/την παύση του προγράμματος Δεν υπάρχει πουθενά στον δυαδικό κώδικα που εκτελείται 15

Ψευδοεντολή.FILL [LABEL: optional].fill VALUE Δίνει στον assembler την οδηγία να αφήσει κενή την επόμενη θέση μνήμης στο πρόγραμμα (τη θέση μνήμης της εντολής) και να την αρχικοποιήσει με την τιμή VALUE Σε αναλογία με τη C: C Assembly LC-3 int a = 1024; a.fill #1024 16

Ψευδοεντολή.BLKW [LABEL: optional].blkw N Δίνει στον assembler την οδηγία να αφήσει κενές τις επόμενες N συνεχόμενες θέσεις μνήμης BLocK of Words Σε αναλογία με τη C: C Assembly LC-3 int a; a.blkw 1 int a[10]; a.blkw 10 17

Ψευδοεντολή.STRINGZ [LABEL: optional].stringz STRING_VALUE Δίνει στον assembler την οδηγία να αρχικοποιήσει τις επόμενες N+1 θέσεις μνήμης στο πρόγραμμα με μια συμβολοσειρά. Το όρισμα STRING_VALUE είναι η συμβολοσειρά: μια ακολουθία Ν χαρακτήρων σε εισαγωγικά. Οι πρώτες Ν θέσεις μνήμης αρχικοποιούνται με τους κωδικούς ASCII των χαρακτήρων. Η θέση N+1 αρχικοποιείται με το χαρακτήρα x0000, για να διευκολύνει την επεξεργασία της συμβολοσειράς. Σε αναλογία με τη C: C char greeting[6] = { H, e, l, l, o, \0 }; ή char greeting[] = Hello ; Assembly LC-3 greeting.stringz Hello 18

Παράδειγμα μνήμης με ψευδοεντολές Κώδικας σε LC-3 assembly.orig x3000 a.fill x0001 b.blkw 4 c.stringz Hello d.fill x0002 HALT.END a.fill x0001 (1 θέση μνήμης) b.blkw 4 (4 θέσεις μνήμης) c.stringz Hello (6 θέσεις μνήμης) d.fill x0001 (1 θέση μνήμης) 19

Συμβολομετάφραση σε 2 περάσματα Η συμβολομετάφραση γίνεται σε 2 περάσματα Εκτός από το αρχείο.obj, παράγεται και ένα αρχείο.sym Το αρχείο.sym περιλαμβάνει τον Πίνακα Συμβόλων (Symbol Table), με τις μεταφράσεις των ετικετών στις αντίστοιχες διευθύνσεις μνήμης 1 ο πέρασμα: Οι ετικέτες μεταφράζονται στις αντίστοιχες διευθύνσεις μνήμης Η μετάφραση ξεκινάει από τη θέση που υποδεικνύει η εντολή.orig Αν παρεμβάλλονται ψευδοεντολές.fill,.blkw,.stringz, οι θέσεις μνήμης που «δεσμεύουν» υπολογίζονται κατάλληλα στη μετάφραση των ετικετών σε διευθύνσεις 2 ο πέρασμα: Οι εντολές μεταφράζονται σε γλώσσα μηχανής στο δεύτερο πέρασμα, με τη βοήθεια του πίνακα συμβόλων Πρόγραμμα σε assembly (.asm) 1 ο πέρασμα 2 ο πέρασμα Εκτελέσιμο (.obj) Πίνακας Συμβόλων (.sym) 20

Αριθμητικές/Λογικές Εντολές του LC3 H ISA του LC-3 παρέχει τρεις μόνο αριθμητικές εντολές ADD DST, SRC1, SRC2; DST SRC1+SRC2 ADD DST, SRC1, IMM5; DST SRC1+IMM5 AND DST, SRC1, SRC2; DST SRC1 and SRC2 AND DST, SRC1, IMM5; DST SRC1 and IMM5 NOT DST, SRC; DST NOT(SRC) Imm5: Προσημασμένος αριθμός 5 bits (4 bits +1 bit προσήμου) Τι μπορούμε να κάνουμε με αυτές τις εντολές; Μπορούμε να κάνουμε τις πράξεις που λείπουν; 21

Αντιγραφή Καταχωρητών Αντιγραφή Καταχωρητών Μπορούμε με ΜΙΑ εντολή να αντιγράψουμε το περιεχόμενο του καταχωρητή R2 στον καταχωρητή R3; R2 x0003 R3 x0000 22

Αντιγραφή Καταχωρητών Αντιγραφή Καταχωρητών Μπορούμε με ΜΙΑ εντολή να αντιγράψουμε το περιεχόμενο του καταχωρητή R2 στον καταχωρητή R3; R2 x0003 R3 x0000 Λύση ADD R3, R2, #0 R2 x0003 R3 x0003 23

Μηδενισμός Καταχωρητή Μηδενισμός Καταχωρητή Μπορούμε με ΜΙΑ εντολή να μηδενίσουμε το περιεχόμενο του καταχωρητή R2; R2 xb4d8 24

Μηδενισμός Καταχωρητή Μηδενισμός Καταχωρητή Μπορούμε με ΜΙΑ εντολή να μηδενίσουμε το περιεχόμενο του καταχωρητή R2; R2 xb4d8 Λύση AND R2, R2, #0 R2 x0000 25

Αφαίρεση Σταθεράς Αφαίρεση σταθεράς Μπορούμε με ΜΙΑ μόνο εντολή να αφαιρέσουμε το 20 από τον καταχωρητή R1 και να αποθηκεύσουμε το αποτέλεσμα στον καταχωρητή R2; Πράξη: R2 R1-20 R1 x001α R2 x0000 26

Αφαίρεση Σταθεράς Αφαίρεση σταθεράς Μπορούμε με ΜΙΑ μόνο εντολή να αφαιρέσουμε το 20 από τον καταχωρητή R1 και να αποθηκεύσουμε το αποτέλεσμα στον καταχωρητή R2; Πράξη: R2 R1-20 Μπορούμε να γράψουμε: ADD R2, R1, #-20 ; ΟΧΙ! Το όρισμα IMM5 της πρόσθεσης μπορεί να πάρει τιμές από -16 ως 16! Μπορούμε όμως να το επιτύχουμε με ΔΥΟ εντολές: ADD R2,R1,#-16 R1 x001α R2 x000a 27

Αφαίρεση Σταθεράς Αφαίρεση σταθεράς Μπορούμε με ΜΙΑ μόνο εντολή να αφαιρέσουμε το 20 από τον καταχωρητή R1 και να αποθηκεύσουμε το αποτέλεσμα στον καταχωρητή R2; Πράξη: R2 R1-20 Μπορούμε να γράψουμε: ADD R2, R1, #-20 ; ΟΧΙ! Το όρισμα IMM5 της πρόσθεσης μπορεί να πάρει τιμές από -16 ως 16! Μπορούμε όμως να το επιτύχουμε με ΔΥΟ εντολές: ADD R2,R1,#-16 R1 x001α R2 x000a ADD R2,R2,#-4 R1 x001α R2 x0006 28

Αφαίρεση Αφαίρεση Πώς μπορούμε να κάνουμε αφαίρεση με τις δοσμένες εντολές; Πόσες εντολές χρειαζόμαστε; Πράξη: R3 R1 - R2 R1 x0f02 R2 X008A R3 x0000 29

Αφαίρεση Αφαίρεση Πώς μπορούμε να κάνουμε αφαίρεση με τις δοσμένες εντολές; Πόσες εντολές χρειαζόμαστε; Πράξη: R3 R1 - R2 R1 x0f02 R2 x008a R3 x0000 Λύση NOT R2,R2 Συμπλήρωμα ως προς 1 του αφαιρετέου R1 x0f02 R2 xff75 R3 x0000 30

Αφαίρεση Αφαίρεση Πώς μπορούμε να κάνουμε αφαίρεση με τις δοσμένες εντολές; Πόσες εντολές χρειαζόμαστε; Πράξη: R3 R1 - R2 R1 x0f02 R2 X008A R3 x0000 Λύση NOT R2,R2 ADD R2,R2,#1 Συμπλήρωμα ως προς 2 του αφαιρετέου R1 x0f02 R2 xff76 R3 x0000 31

Αφαίρεση Αφαίρεση Πώς μπορούμε να κάνουμε αφαίρεση με τις δοσμένες εντολές; Πόσες εντολές χρειαζόμαστε; Πράξη: R3 R1-R2 R1 x0f02 R2 X008A R3 x0000 Λύση NOT R2,R2 ADD R2,R2,#1 ADD R3,R1,R2 Πρόσθεση του μειωτέου και του συμπληρώματος ως προς 2 του αφαιρετέου R1 x0f02 R2 xff76 R3 x0ε78 32

Καταχωρητές Συνθήκης Ο LC3 παρέχει 3 καταχωρητές συνθήκης (1-bit) N, Negative Z, Zero P, Positive Κάθε φορά που μια εντολή γράφει σε έναν καταχωρητή (εντολές ADD, AND, NOT αλλά και LD, LDR, LDI, LEA), ανάλογα με το αποτέλεσμα, MONO ένας από τους τρεις καταχωρητές παίρνει την τιμή 1 Στο simulator τα δεδομένα αυτών των καταχωρητών εμφανίζονται στον καταχωρητή CC (conditional code) CC CC CC POSITIVE ZERO NEGATIVE N=0, Z=0, P=1 N=0, Z=1, P=0 N=1, Z=0, P=0 33

Καταχωρητές Συνθήκης Μπορούμε με ΜΙΑ μόνο εντολή να θέσουμε τον καταχωρητή συνθήκης ανάλογα με την τιμή του καταχωρητή R1; 34

Καταχωρητές Συνθήκης Μπορούμε με ΜΙΑ μόνο εντολή να θέσουμε τον καταχωρητή συνθήκης ανάλογα με την τιμή του καταχωρητή R1; Λύση Ο καταχωρητής συνθήκης τίθεται με βάση την τελευταία εντολή που έγραψε σε καταχωρητή Πρέπει να εκτελέσουμε μία εντολή, που να γράφει στον καταχωρητή R1, χωρίς να μεταβάλει το περιεχόμενό του! ADD R1,R1,#0 35

Εντολές Ελέγχου Ροής του LC-3 Το ISA του LC-3 παρέχει δύο εντολές αλμάτων JMP BaseR BR{n z p} LABEL H εντολή JMP εκτελεί άλμα χωρίς συνθήκη Θα συμβεί οπωσδήποτε άλμα στο σημείο όπου PC=BaseR H εντολή BR εκτελεί άλμα υπό συνθήκη Συνδυάζεται με τους καταχωρητές συνθήκης Αν κάποιος από τους επιλεγμένους καταχωρητές είναι 1 (ικανοποιεί τη συνθήκη) θα συμβεί άλμα στη διεύθυνση με ετικέτα LABEL Με την εντολή BR μπορούμε να γράψουμε συνθήκες τύπου if-thenelse 36

Εντολή BR και καταχωρητές συνθήκης Η εντολή BR συνδυάζεται με τους καταχωρητές συνθήκης Σε αναλογία με τη C: Λογική έκφραση στη C Αριθμητική Έκφραση Εντολή BRanch σε LC3 if (a < b) if ((a - b) < 0) BRn if (a <= b) if ((a - b) <= 0) BRnz if (a == b) if ((a - b) == 0) BRz if (a >= b) if ((a - b) >= 0) BRzp if (a > b) if ((a - b) > 0) BRp if (a!= b) if ((a - b)!= 0) BRnp if (a) if (a!= 0) BRnp if (! a) if (a == 0) BRz 37

Δομή if-then Δομή if-then Κώδικας σε C: if (a < b) { //do something } Κώδικας σε LC-3 assembly LD R0, a LD R1, b NOT R1, R1 ADD R1, R1, #1 ADD R0, R0, R1 BRzp SKIP ; Έλεγχος συνθήκης ; do something SKIP 38

Παράδειγμα if-then (Περίπτωση 1) Περίπτωση 1: a=4, b=5, a<b R0 x0000 R1 x0000 CC ZERO LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 R0 x0004 R1 x0000 CC POSITIVE 39

Παράδειγμα if-then (Περίπτωση 1) Περίπτωση 1: a=4, b=5, a<b R0 x0004 R1 x0000 CC POSITIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 R0 x0004 R1 x0005 CC POSITIVE 40

Παράδειγμα if-then (Περίπτωση 1) Περίπτωση 1: a=4, b=5, a<b R0 x0004 R1 x0005 CC POSITIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 Αφαίρεση: Συμπλήρωμα ως προς 1 του R1 R0 x0004 R1 xfffa CC NEGATIVE 41

Παράδειγμα if-then (Περίπτωση 1) Περίπτωση 1: a=4, b=5, a<b R0 x0004 R1 xfffa CC NEGATIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 Αφαίρεση: Συμπλήρωμα ως προς 1 του R1 Αφαίρεση: Συμπλήρωμα ως προς 2 του R1 R0 x0004 R1 xfffb CC NEGATIVE 42

Παράδειγμα if-then (Περίπτωση 1) Περίπτωση 1: a=4, b=5, a<b R0 x0004 R1 xfffb CC NEGATIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 Αφαίρεση: Συμπλήρωμα ως προς 1 του R1 Αφαίρεση: Συμπλήρωμα ως προς 2 του R1 Αφαίρεση: R0=R0+Συμπλήρωμα2(R1) R0 xffff R1 xfffb CC NEGATIVE 43

Παράδειγμα if-then (Περίπτωση 1) Περίπτωση 1: a=4, b=5, a<b R0 xffff R1 xfffb CC NEGATIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 Αφαίρεση: Συμπλήρωμα ως προς 1 του R1 Αφαίρεση: Συμπλήρωμα ως προς 2 του R1 Αφαίρεση: R0=R0+(-R1) Έλεγχος: Αν CC=Z P πήγαινε στο SKIP BRzp: Ελέγχει αν Ζ=1 ή P=1 Αν Ζ=1 ή P=1 θα γίνει άλμα στη θέση με ετικέτα SKIP Αν όχι, δε θα γίνει άλμα Δε θα γίνει άλμα! 44

Παράδειγμα if-then (Περίπτωση 1) Περίπτωση 1: a=4, b=5, a<b R0 xffff R1 xfffb CC NEGATIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 Αφαίρεση: Συμπλήρωμα ως προς 1 του R1 Αφαίρεση: Συμπλήρωμα ως προς 2 του R1 Αφαίρεση: R0=R0+Συμπλήρωμα2(R1) Έλεγχος: Αν CC=Z P πήγαινε στο SKIP Συνθήκη αληθής (a<b): συνέχεια εκτέλεσης από την επόμενη θέση 45

Παράδειγμα if-then (Περίπτωση 2) Περίπτωση 2: a=5, b=4, a>b R0 x0005 R1 xfffc CC NEGATIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 Αφαίρεση: Συμπλήρωμα ως προς 1 του R1 Αφαίρεση: Συμπλήρωμα ως προς 2 του R1 Αφαίρεση: R0=R0+Συμπλήρωμα2(R1) R0 x0001 R1 xfffb CC POSITIVE 46

Παράδειγμα if-then (Περίπτωση 2) Περίπτωση 2: a=5, b=4, a>b R0 X0001 R1 xfffc CC POSITIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 Αφαίρεση: Συμπλήρωμα ως προς 1 του R1 Αφαίρεση: Συμπλήρωμα ως προς 2 του R1 Αφαίρεση: R0=R0+Συμπλήρωμα2(R1) Έλεγχος: Αν CC=Z P πήγαινε στο SKIP BRzp: Ελέγχει αν Ζ=1 ή P=1 Αν Ζ=1 ή P=1 θα γίνει άλμα στη θέση με ετικέτα SKIP Αν όχι, δε θα γίνει άλμα Θα γίνει άλμα! 47

Παράδειγμα if-then (Περίπτωση 2) Περίπτωση 2: a=5, b=4, a>b R0 xffff R1 xfffb CC NEGATIVE LD R0, a; LD R1, b; NOT R1, R1; ADD R1, R1, #1; ADD R0, R0, R1; BRzp SKIP; SKIP Φόρτωσε τον a στον καταχωρητή R0 Φόρτωσε τον b στον καταχωρητή R1 Αφαίρεση: Συμπλήρωμα ως προς 1 του R1 Αφαίρεση: Συμπλήρωμα ως προς 2 του R1 Αφαίρεση: R0=R0+(-R1) Έλεγχος: Αν CC=Z P πήγαινε στο SKIP Συνθήκη ψευδής (a>b): συνέχεια εκτέλεσης από τη θέση με ετικέτα SKIP 48

Δομή if-then-else Δομή if-then-else Κώδικας σε C: if (a<b) { //do something } else { //do something else } Κώδικας σε LC-3 assembly LD R0, a LD R1, b NOT R1, R1 ADD R1, R1, #1 ADD R0, R0, R1 BRzp ELSE ; Έλεγχος συνθήκης ; do something BR END_ELSE ; Άλμα στο END_ELSE ELSE ; do something else END ELSE 49

For loop Η παραδοσιακή μορφή της δομής loop απαιτεί 4 τμήματα Initialization: Ορισμός και αρχικοποίηση των απαιτούμενων μεταβλητών Condition: Όσο είναι αληθής θα επαναλαμβάνεται το σώμα του FOR Afterthought: Εκτελείται μετά το τέλος του σώματος του FOR Body: Ο κώδικας που θα εκτελείται σε κάθε επανάληψη for (initialization; condition; afterthought) {body} 50

For loop Initialization No Condition Body Yes Afterthought END 51

While loop No Condition Body Yes END 52

Παράδειγμα For loop 1 Πολλαπλασιασμός 1/3 for (i = 8, a = 0; 0 < i; i--, a += 10) {} a = 0; for ( i = 8; 0 < i; i = i - 1){ a = a +10 } Initialization: i = 8, a = 0 Condition: 0 < i Body: a = a + 10 Afterthought: i = i - 1 53

Παράδειγμα For loop 1 Πολλαπλασιασμός 2/3 ; initialization AND R1, R1, x0 ; Εκκαθάριση καταχωρητή R1 ( a = 0) AND R0, R0, x0 ; Εκκαθάριση καταχωρητή R0 ( i = 0) ADD R0, R0, x08 ; Προσθήκη στον καταχωρητή ( i = 8) LOOP ; condition BRnz LOOPEND ; Έλεγχος αν i είναι θετικός ; body ADD R1, R1, #10 ; Προσθήκη στον καταχωρητή R1 (a +=10) ; afterthought ADD R0, R0, #-1 ; Αφαίρεση από καταχωρητή R1 (i --) BR LOOP LOOPEND 54

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Αρχικές συνθήκες (τυχαίες) R0: x0f38 R1: x00ff PC: x2fff CC: NEGATIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 55

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0f38 R1: x00ff LOOP: - PC: x3001 CC: ZERO x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 56

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0000 R1: x0000 LOOP: - PC: x3002 CC: ZERO x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 57

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0008 R1: x0000 LOOP: - PC: x3003 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 58

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0008 R1: x0000 LOOP: 1 PC: x3004 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 59

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0008 R1: x000α LOOP: 1 PC: x3005 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 60

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0007 R1: x000α LOOP: 1 PC: x3006 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 ΒR LOOP LOOPEND 61

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0007 R1: x000a LOOP: 1 PC: x3003 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 62

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0007 R1: x000a LOOP: 2 PC: x3004 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 63

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0007 R1: x0014 LOOP: 2 PC: x3005 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 64

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0006 R1: x0014 LOOP: 2 PC: x3006 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 65

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0006 R1: x0014 LOOP: 2 PC: x3003 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 66

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0001 R1: x0046 LOOP: 8 PC: x3004 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 67

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0001 R1: x0050 LOOP: 8 PC: x3005 CC: POSITIVE x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 68

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0000 R1: x0050 LOOP: 8 PC: x3006 CC: ZERO x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 69

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0000 R1: x0050 LOOP: 8 PC: x3003 CC: ZERO x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 70

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0000 R1: x0050 LOOP: 8 PC: x3007 CC: ZERO x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 71

Παράδειγμα For loop 1 Πολλαπλασιασμός 3/3 Τρέχουσες τιμές R0: x0000 R1: x0050 LOOP: 8 PC: x3007 CC: ZERO x3000 AND R1, R1, x0 x3001 AND R0, R0, x0 x3002 ADD R0, R0, x08 LOOP x3003 BRnz LOOPEND x3004 ADD R1, R1, #10 x3005 ADD R0, R0, #-1 x3006 BR LOOP LOOPEND 72

Σύνοψη των εντολών του LC3 ADD Dst, Src1, Src2 ADD Dst, Src1, imm5 AND Dst, Src1, Src2 AND Dst, Src1, imm5 NOT Dst, Src LD Dst, LABEL ST Src, LABEL LDR Dst, BaseR, offset6 STR Src, BaseR, offset6 LDI Dst, LABEL STI Src, LABEL LEA Dst, LABEL JMP BaseR BR[nzp] LABEL JSR LABEL JSRR BaseR RET TRAP trapvector8 RTI 73

Μνήμη Πίνακες Γενικά Η μνήμη (mem) αποτελείται από συνεχόμενες θέσεις Το πρώτο στοιχείο της μνήμης είναι το 0 Το πρόγραμμα βρίσκεται και αυτό στην μνήμη Παράδειγμα Τα δεδομένα του πρώτου στοιχείου είναι mem[0] = 12 Ποια είναι η τιμή mem[mem[6]]? Θέση Δεδομένα 0x0000 12 0x0001 34 0x0002 65 0x0003 125 0x0004 3 0x0005 5 0x0006 0 0x0007 21 0x0008 9 0x0009 18 0x000A 11 74

Μνήμη Πίνακες Εντολές LC3 Εντολές ανάγνωσης μνήμης LD Ανάγνωση με Offset στον PC (±256 θέσεις) LDI Ανάγνωση με έμμεση πρόσβαση LDR Ανάγνωση με Offset σε Καταχωρητή (± 16 θέσεις) LEA Ανάγνωση διεύθυνσης σε Καταχωρητή Εντολές εγγραφής μνήμης ST Εγγραφή μνήμης με Offset στον PC (±256 θέσεις) STI Εγγραφή με έμμεση πρόσβαση STR Εγγραφή με Offset σε Καταχωρητή (± 16 θέσεις) 75

Μνήμη Πίνακες Εντολές LC3 Rules of thumb Εντολές ανάγνωσης μνήμης LD Ανάγνωση δεδομένων κοντά στον PC LDI Ανάγνωση δεδομένων μακρυά από τον PC με χρήση δείκτη LDR Ανάγνωση δεδομένων μακρυά από τον PC με χρήση δείκτη και αξιοποίηση του offset LEA Ανάγνωση διεύθυνσης σε Καταχωρητή Εντολές εγγραφής μνήμης ST Aνάλογα με LD STI Ανάλογα με STI STR Ανάλογα με LDR 76

Μνήμη Πίνακες Εντολές LC3 Δέντρο απόφασης για χρήση εντολών μνήμης (ανάγνωση ανάλογα για εγγραφή) LDR NAI Χρειάζομαι αριθμητική pointers? π.χ. πίνακες, structs OXI LD NAI Η θέση μνήμης είναι κοντά; OXI LDI 77

Μνήμη Πίνακες LD, ST - Παράδειγμα.ORIG 0x3000 LD R0, FIRST LD R1, SCND ADD R0, R0, R1 ST R0, RES FIRST.FILL #10 SCND.FILL #10 RES.BLKW 1.END 0x3000 LD R0, PC + 3 0x3001 LD R1, PC + 3 0x3002 ADD R0, R0, R1 0x3003 ST R1, PC + 2 0x3004 0x000A 0x3005 0x000A 0x3006 0 78

Μνήμη Πίνακες LD, ST - Παράδειγμα.ORIG 0x3000 LD R0, FIRST LD R1, SCND ADD R0, R0, R1 ST R0, RES FIRST.FILL #10 SCND.FILL #10 RES.BLKW 1.END 0x3000 LD R0, PC + 3 0x3001 LD R1, PC + 3 0x3002 ADD R0, R0, R1 0x3003 ST R1, PC + 2 0x3004 0x000A 0x3005 0x000A 0x3006 0 C code first = 10; second = 10; result = first + second; 79

Παράδειγμα χρήσης LD.ORIG x3000 LD R0, X HALT ; ARRAY.BLKW 128 X.FILL x0007 ;.END 80

Παράδειγμα χρήσης LD.ORIG x3000 LD R0, X HALT ; ARRAY.BLKW 128 X.FILL x0007 ;.END OK 81

Παράδειγμα χρήσης LD.ORIG x3000 LD R0, X HALT ; ARRAY.BLKW 255 X.FILL x0007 ;.END 82

Παράδειγμα χρήσης LD.ORIG x3000 LD R0, X HALT ; ARRAY.BLKW 255 X.FILL x0007 ;.END STARTING PASS 1 0 errors found in first pass. STARTING PASS 2 2: label "X" at distance 256 (allowed range is -256 to 255) 1 errors found in second pass. 83

Μνήμη Πίνακες LDI, STI - Παράδειγμα.ORIG 0x3000 LDI R0, F_P LDI R1, S_P ADD R0, R0, R1 STI R0, R_P F_P.FILL FIRST S_P.FILL SCND R_P.FILL RES HALT ARRAY.BLKW #300 FIRST.FILL #10 SCND.FILL #10 RES.BLKW 1.END 0x3000 LDI R0, PC + 3 0x3001 LD R1, PC + 3 0x3002 ADD R0, R0, R1 0x3003 STI R1, PC + 2 0x3004 0x3134 0x3005 0x3135 0x3006 0x3136 0x3007 HALT 0x3008 0x3134 0x000A 0x3135 0x000A 0x3136 0x0000 84

Μνήμη Πίνακες LDR, STR, LEA Παράδειγμα: Άθροισμα μιγαδικών.orig x3000 LEA R5, COMPLEX1 ; R5 = &COMPLEX1 LEA R6, COMPLEX2 ; R6 = &COMPLEX2 LEA R7, SUM ; R7 = &SUM TRAP x23 ; initialize from input real STR R0, R5, #0 ; part of complex1 TRAP x23 ; initialize from input STR R0, R5, #1 ; imaginary part of complex1 TRAP x23 ; initialize from input real STR R0, R6, #0 ; part of complex2 TRAP x23 ; initialize from input STR R0, R6, #1 ; imaginary part of complex2 LDR R0, R5, #0 ; addition of real parts LDR R1, R6, #0 ADD R0, R0, R1 STR R0, R7, #0 LDR R0, R5, #1 ; addition of imaginary parts LDR R1, R6, #1 ADD R0, R0, R1 STR R0, R7, #1 HALT COMPLEX1.BLKW 2 COMPLEX2.BLKW 2 SUM.BLKW 2.END 85

Μνήμη Πίνακες LDR, STR, LEA Παράδειγμα: Άθροισμα μιγαδικών.orig x3000 LEA R5, COMPLEX1 ; R5 = &COMPLEX1 LEA R6, COMPLEX2 ; R6 = &COMPLEX2 LEA R7, SUM ; R7 = &SUM TRAP x23 ; initialize from input real STR R0, R5, #0 ; part of complex1 TRAP x23 ; initialize from input STR R0, R5, #1 ; imaginary part of complex1 TRAP x23 ; initialize from input real STR R0, R6, #0 ; part of complex2 TRAP x23 ; initialize from input STR R0, R6, #1 ; imaginary part of complex2 LDR R0, R5, #0 ; addition of real parts LDR R1, R6, #0 ADD R0, R0, R1 STR R0, R7, #0 LDR R0, R5, #1 ; addition of imaginary parts LDR R1, R6, #1 ADD R0, R0, R1 STR R0, R7, #1 HALT COMPLEX1.BLKW 2 COMPLEX2.BLKW 2 SUM.BLKW 2.END 86

Μνήμη Πίνακες LDR, STR, LEA Παράδειγμα: Άθροισμα μιγαδικών.orig x3000 LEA R5, COMPLEX1 ; R5 = &COMPLEX1 LEA R6, COMPLEX2 ; R6 = &COMPLEX2 LEA R7, SUM ; R7 = &SUM TRAP x23 ; initialize from input real STR R0, R5, #0 ; part of complex1 TRAP x23 ; initialize from input STR R0, R5, #1 ; imaginary part of complex1 TRAP x23 ; initialize from input real STR R0, R6, #0 ; part of complex2 TRAP x23 ; initialize from input STR R0, R6, #1 ; imaginary part of complex2 LDR R0, R5, #0 ; addition of real parts LDR R1, R6, #0 ADD R0, R0, R1 STR R0, R7, #0 LDR R0, R5, #1 ; addition of imaginary parts LDR R1, R6, #1 ADD R0, R0, R1 STR R0, R7, #1 HALT COMPLEX1.BLKW 2 COMPLEX2.BLKW 2 SUM.BLKW 2.END 87

Μνήμη Πίνακες LDR, STR, LEA Παράδειγμα: Άθροισμα μιγαδικών.orig x3000 LEA R5, COMPLEX1 ; R5 = &COMPLEX1 LEA R6, COMPLEX2 ; R6 = &COMPLEX2 LEA R7, SUM ; R7 = &SUM TRAP x23 ; initialize from input real STR R0, R5, #0 ; part of complex1 TRAP x23 ; initialize from input STR R0, R5, #1 ; imaginary part of complex1 TRAP x23 ; initialize from input real STR R0, R6, #0 ; part of complex2 TRAP x23 ; initialize from input STR R0, R6, #1 ; imaginary part of complex2 LDR R0, R5, #0 ; addition of real parts LDR R1, R6, #0 ADD R0, R0, R1 STR R0, R7, #0 LDR R0, R5, #1 ; addition of imaginary parts LDR R1, R6, #1 ADD R0, R0, R1 STR R0, R7, #1 HALT COMPLEX1.BLKW 2 COMPLEX2.BLKW 2 SUM.BLKW 2.END 88

Μνήμη Πίνακες LDR, STR, LEA Παράδειγμα: Άθροισμα μιγαδικών.orig x3000 LEA R5, COMPLEX1 ; R5 = &COMPLEX1 LEA R6, COMPLEX2 ; R6 = &COMPLEX2 LEA R7, SUM ; R7 = &SUM TRAP x23 ; initialize from input real STR R0, R5, #0 ; part of complex1 TRAP x23 ; initialize from input STR R0, R5, #1 ; imaginary part of complex1 TRAP x23 ; initialize from input real STR R0, R6, #0 ; part of complex2 TRAP x23 ; initialize from input STR R0, R6, #1 ; imaginary part of complex2 LDR R0, R5, #0 ; addition of real parts LDR R1, R6, #0 ADD R0, R0, R1 STR R0, R7, #0 LDR R0, R5, #1 ; addition of imaginary parts LDR R1, R6, #1 ADD R0, R0, R1 STR R0, R7, #1 HALT COMPLEX1.BLKW 2 COMPLEX2.BLKW 2 SUM.BLKW 2.END 89

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LEA R0, A ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP END HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) A.BLKW #10 90

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LEA R0, A ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP END HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) A.BLKW #10 91

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LEA R0, A ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP END HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) A.BLKW #10 92

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LEA R0, A ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP END HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) A.BLKW #10 93

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LEA R0, A ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP END HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) A.BLKW #10 94

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LEA R0, A ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP END HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) A.BLKW #10 95

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LEA R0, A ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP END HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) A.BLKW #10 96

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LEA R0, A ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; label "A" at distance 309 (allowed range is -256 to 255) END ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) B.BLKW #300 A.BLKW #10 97

Μνήμη Πίνακες Προσπέλαση πίνακα int i, a[10]; for (i = 0; i < 10; i++){ a[i] = i; } AND R0, R0, x0 ST R0, I ; i = 0 LOOP LD R0, I ; R0 = i LD R1, LIM ; R1 = LIM (= 10) NOT R1, R1 ; ADD R1, R1, #1 ; R1 = -10 ADD R0, R0, R1 ; i - 10 < 0? BRzp END LD R0, A_P ; R0 = address of A LD R1, I ; R1 = i ADD R0, R0, R1 ; R0 = address of A[i]; STR R1, R0, #0 ; A[i] = i; ADD R1, R1, x1 ; i++ ST R1, I ; BR LOOP END HALT I.BLKW #1 ; loop variable i LIM.FILL 10 ; loop limit (10) A_P.FILL A B.BLKW #300 A.BLKW #10 98

Υπορουτίνες Ομάδες εντολών που εκτελούν μια συγκεκριμένη εργασία ή που επαναλαμβάνονται συχνά Βρίσκονται έξω από το σώμα του κυρίως προγράμματος και καλούνται από αυτό Ο κώδικας γίνεται πιο ευανάγνωστος Αποφεύγονται λάθη λόγω αντιγραφής Ο κώδικας διορθώνεται ή τροποποιείται με ευκολία 99

Υπορουτίνες Η κλήση μιας υπορουτίνας γίνεται με τις εντολές JSR PCOffset11 Πηγαίνει σε σχετική με τον PC διεύθυνση Η τιμή που είχε ο PC πριν την κλήση μπαίνει στον R7 JSRR BaseR Πηγαίνει στην διεύθυνση που έχει ο Register Η τιμή που είχε ο PC πριν την κλήση μπαίνει στον R7 Η επιστροφή από μια υπορουτίνα στην κανονική ροή γίνεται με την εντολή RET ή εναλλακτικά με την JMP R7 γιατί? 100

Υπορουτίνες Παράδειγμα 1.ORIG 0x3002 ADDITION ADD R2, R0, R1 RET LD R0, FIRST LD R1, SECOND JSR ADDITION FIRST.FILL, #10 SECOND.FILL, #32 101

Υπορουτίνες Παράδειγμα 1 0x3000 ADD R2, R0, R1 0x3001 RET 0x3002 LD R0, PC + 4 0x3003 LD R1, PC + 4 0x3004 JSR PC - 5 0x3005.FILL, #10 0x3006.FILL, #32 Register Value R0 10 R1 0 R2 0 R7 0 PC 0x3003 102

Υπορουτίνες Παράδειγμα 1 0x3000 ADD R2, R0, R1 0x3001 RET 0x3002 LD R0, PC + 4 0x3003 LD R1, PC + 4 0x3004 JSR PC - 5 0x3005.FILL, #10 0x3006.FILL, #32 Register Value R0 10 R1 32 R2 0 R7 0 PC 0x3004 103

Υπορουτίνες Παράδειγμα 1 0x3000 ADD R2, R0, R1 0x3001 RET 0x3002 LD R0, PC + 4 0x3003 LD R1, PC + 4 0x3004 JSR PC 5 0x3005.FILL, #10 0x3006.FILL, #32 Register Value R0 10 R1 32 R2 0 R7 0x3005 PC 0x3000 104

Υπορουτίνες Παράδειγμα 1 0x3000 ADD R2, R0, R1 0x3001 RET 0x3002 LD R0, PC + 4 0x3003 LD R1, PC + 4 0x3004 JSR PC - 5 0x3005.FILL, #10 0x3006.FILL, #32 Register Value R0 10 R1 32 R2 42 R7 0x3005 PC 0x3001 105

Υπορουτίνες Παράδειγμα 1 0x3000 ADD R2, R0, R1 0x3001 RET 0x3002 LD R0, PC + 4 0x3003 LD R1, PC + 4 0x3004 JSR PC - 5 0x3005.FILL, #10 0x3006.FILL, #32 Register Value R0 10 R1 32 R2 42 R7 0x3005 PC 0x3005 106

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 JSR MULT ADD R0, R2, #0 TRAP X21 HALT ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 ADD R1, R1, #0 ; refresh CC status for loop counter R1 LOOP BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP LEND RET.END 107

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 JSR MULT ADD R0, R2, #0 TRAP X21 HALT ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 ADD R1, R1, #0 ; refresh CC status for loop counter R1 LOOP BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP LEND RET.END 108

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 JSR MULT ADD R0, R2, #0 TRAP X21 HALT ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 ADD R1, R1, #0 ; refresh CC status for loop counter R1 LOOP BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP LEND RET.END 109

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 JSR MULT ADD R0, R2, #0 TRAP X21 HALT ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 ADD R1, R1, #0 ; refresh CC status for loop counter R1 LOOP BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP LEND RET.END 110

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 JSR MULT ADD R0, R2, #0 TRAP X21 HALT ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 ADD R1, R1, #0 ; refresh CC status for loop counter R1 LOOP BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP LEND RET.END 111

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 JSR MULT ADD R0, R2, #0 TRAP X21 HALT ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 ADD R1, R1, #0 ; refresh CC status for loop counter R1 LOOP BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP LEND RET.END 112

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 JSR MULT ADD R0, R2, #0 TRAP X21 HALT ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 ADD R1, R1, #0 ; refresh CC status for loop counter R1 LOOP BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP LEND RET.END 113

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 JSR MULT ADD R0, R2, #0 TRAP X21 HALT A.BLKW 2000 ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 LOOP LEND.END ADD R1, R1, #0 BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP RET ; refresh CC status for loop counter R1 5: label "MULT" at distance 2003 (allowed range is -1024 to 1023) 114

Υπορουτίνες Παράδειγμα 2 - Πολλαπλασιασμός.ORIG x3000 TRAP X23 ADD R1, R0, #0 TRAP X23 LD R5, M_P JSRR R5 ADD R0, R2, #0 TRAP X21 HALT M_P.FILL MULT A.BLKW 2000 ; receives input from keyboard ; copies to register R1 ; receives input from keyboard ; jump to subroutine ; output to console ; subroutine MULT: receives in R0, R1 the two numbers to be multiplied ; returns the product in R2 MULT AND R2, R2, #0 ; initialization: R2 (partial product, sum) = 0 LOOP LEND.END ADD R1, R1, #0 BRnz LEND ADD R2, R2, R0 ; R2 (sum += R0) ADD R1, R1, #-1 ; BR LOOP RET ; refresh CC status for loop counter R1 115

Υπορουτίνες Παράδειγμα 3 Υπολογισμός δύναμης (κλήση ρουτίνας από ρουτίνα).orig x3000 LD LD JSR HALT R0, BASE R1, EXP POWER ; Είσοδος R0, R1 Έξοδος R2 MULT AND R2, R2, #0 ADD R1, R1, #0 ; LOOP BRnz LEND ADD R2, R2, R0 ; ADD R1, R1, #-1 ; BR LOOP LEND RET ; Είσοδος R0, R1 Έξοδος R5 POWER ADD R6, R7, 0 ADD R3, R0, 0 ADD R4, R1, -1 ADD R5, R0, 0 PLOOP ADD R0, R3, 0 ADD R1, R5, 0 JSR MULT ADD R5, R2, 0 ADD R4, R4, -1 BRp PLOOP ADD R7, R6, 0 RET BASE.FILL #3 EXP.FILL #3.END 116

Υπορουτίνες Παράδειγμα 3 Υπολογισμός δύναμης (κλήση ρουτίνας από ρουτίνα).orig x3000 LD LD JSR HALT R0, BASE R1, EXP POWER ; Είσοδος R0, R1 Έξοδος R2 MULT AND R2, R2, #0 ADD R1, R1, #0 ; LOOP BRnz LEND ADD R2, R2, R0 ; ADD R1, R1, #-1 ; BR LOOP LEND RET ; Είσοδος R0, R1 Έξοδος R5 POWER ADD R6, R7, 0 ADD R3, R0, 0 ADD R4, R1, -1 ADD R5, R0, 0 PLOOP ADD R0, R3, 0 ADD R1, R5, 0 JSR MULT ADD R5, R2, 0 ADD R4, R4, -1 BRp PLOOP ADD R7, R6, 0 RET BASE.FILL #3 EXP.FILL #3.END 117

Υπορουτίνες Παράδειγμα 3 Υπολογισμός δύναμης (κλήση ρουτίνας από ρουτίνα).orig x3000 LD LD JSR HALT R0, BASE R1, EXP POWER ; Είσοδος R0, R1 Έξοδος R2 MULT AND R2, R2, #0 ADD R1, R1, #0 ; LOOP BRnz LEND ADD R2, R2, R0 ; ADD R1, R1, #-1 ; BR LOOP LEND RET Πρέπει να αντιγραφεί η τιμή του R7 για να είναι δυνατή η επιστροφή ; Είσοδος R0, R1 Έξοδος R5 POWER ADD R6, R7, 0 ADD R3, R0, 0 ADD R4, R1, -1 ADD R5, R0, 0 PLOOP ADD R0, R3, 0 ADD R1, R5, 0 JSR MULT ADD R5, R2, 0 ADD R4, R4, -1 BRp PLOOP ADD R7, R6, 0 RET BASE.FILL #3 EXP.FILL #3.END 118

Επιπλέον διάβασμα: LC-3 Simulator Lab Manual: http://highered.mheducation.com/sites/0072467509/student_view0/l c-3_simulator_lab_manual.html C to LC3 Assembly language: http://www.cs.colostate.edu/~fsieker/misc/ctolc3.html Manual and examples: http://people.cs.georgetown.edu/~squier/teaching/hardwarefunda mentals/lc3-trunk/docs/lc3-assemblymanualandexamples.pdf 119