ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ Συστήματα Μικροϋπολογιστών 3η Oμάδα Ασκήσεων Δημητρίου Ανδριάνα 03110684 Σκούρα Ελένη 03110721
1 η 4 η Άσκηση i) Στο πρόβλημα αυτό μας ζητείται να υλοποιήσουμε ένα πρόγραμμα, σε assembly 8085, το οποίο να διαβάζει την πόρτα εισόδου των dip-switches και με βάση το πρώτο δεξιότερο ΟΝ να ανάβει το αντίστοιχης τάξης LED καθώς και όλα τα υψηλότερης τάξης. Το πρόγραμμα να είναι συνεχούς λειτουργίας. Παρακάτω φαίνεται ο κώδικάς μας: IN 10H START: LDA 2000H ;diavasma twn dip-switches MOV D,A ;save A MVI E,08H ;metrhths bits IF_ZERO: CPI 00H ;an den exei ginei kanena ON JZ LEDS_OFF CHECK0: RRC ;olhs8hsh mia 8esh de3ia JC LEDS_ON ;an to Carry ginei 1, dhladh LSB dip-switch ON DCR E ;meiwsh tou metrith JZ LEDS_ON ;mexri na ginei 0 JMP CHECK0 LEDS_ON: MOV A,D ;o A pairnei thn arxikh timh twn dip-switches MOV H,A ;ston H apo8hkeuetai h arxikh timh tou A MVI A,80H ; (A) <- 1000 0000 SUNEXEIA: MOV L,A ; save A ORA H ; gia na paroume tous assous MOV H,A ; save A MOV A,L DCR E ;meiwsh metrhth JZ EMFANISH ;an eftase sto 0 shmainei oti exoume valei assous ;se ola ta bits upshloterhs ta3hs RRC ; alliws de3ia olis8hsh kata 1 bit JMP SUNEXEIA EMFANISH: MOV A,H ;teliko apotelesma CMA ;adistrofh STA 3000H ;emfanish sthn porta e3odou JMP START LEDS_OFF: MVI A,00H CMA STA 3000H JMP START END
ii) Στο ζήτημα αυτό καλλούμαστε να υλοποιήσουμε ένα πρόγραμμα σε assembly 8085 το οποίο να αναμένει το πάτημα από το 16δικό πληκτρολόγο των αριθμών 1-8 και κάθε φορά να ανάβει το LED της αντίστοιχης θέσης (1 LSB, 8 MSB ). Να γίνει χρήση της ρουτίνας ΚΙND. Το πρόγραμμα να είναι συνεχούς λειτουργίας. Παρακάτω φαίνεται ο κώδικάς μας: IN 10H START: CALL KIND CPI 01H ;1 JZ LED1 CPI 02H ;2 JZ LED2 ;3 JZ LED3 CPI 04H ;4 JZ LED4 ;5 JZ LED5 ;6 JZ LED6 CPI 07H ;7 JZ LED7 CPI 08H ;8 JZ LED8 ALLIWS_OFF: MVI A,00H JMP LEDS_ON ;an den path8ei tipota LED1: ;0000 0001 JMP LEDS_ON LED2: ;0000 0010 JMP LEDS_ON LED3: MVI A,04H ;0000 0100 JMP LEDS_ON LED4: MVI A,08H ;0000 1000 JMP LEDS_ON LED5: MVI A,10H ;0001 0000 JMP LEDS_ON LED6: MVI A,20H ;0010 0000 JMP LEDS_ON LED7: MVI A,40H ;0100 0000 JMP LEDS_ON LED8: MVI A,80H ;1000 0000 LEDS_ON: CMA STA 3000H JMP START ;adistrofh ;emfanish sthn porta e3odou ;gia sunexh leitourgia
END iii) Στο πρόβλημα αυτό καλλούμαστε να υλοποιήσουμε ένα πρόγραμμα, σε assembly 8085, το οποίο να κάνει απευθείας ανάγνωση του πληκτρολογίου, χωρίς την χρήση της ρουτίνας KIND. To αποτέλεσμα του κωδικού να εμφανίζεται στα δύο αριστερότερα 7- segment της οθόνης με βάση τις ρουτίνες DCD και STDM. IN 10H START: MVI A,10H ;vazoume to keno stis 4 de3ioteres 8eseis STA 0B00H STA 0B01H STA 0B02H STA 0B03H LOOPA: LXI D,0B00H ;Anagnwsh grammhs kai sthlhs apo plhktrologio READ_1ST_LINE: MVI A,FBH ;1111 1011 READ_1ST_COLUMN: JZ ZERO ;0 JZ STORE_INCR JZ DECR ;DECR READ_2ND_LINE: MVI A,F7H ;1111 0111 READ_2ND_COLUMN: JZ ONE ;1 JZ TWO ;2 JZ THREE ;3 READ_3RD_LINE: MVI A,EFH ;1110 1111 READ_3RD_COLUMN: ;STORE/INCR
JZ FOUR ;4 JZ FIVE ;5 JZ SIX ;6 READ_4TH_LINE: MVI A,DFH ;1101 1111 READ_4TH_COLUMN: JZ SEVEN ;7 JZ EIGHT ;8 JZ NINE ;9 READ_5TH_LINE: MVI A,BFH ;1011 1111 READ_5TH_COLUMN: JZ L_A ;A JZ L_B ;B JZ L_C ;C READ_6TH_LINE: MVI A,7FH ;0111 1111 READ_6TH_COLUMN: JZ L_D ;D JZ L_E ;E JZ L_F ;F READ_7TH_LINE: MVI A,FEH ;1111 1110 READ_7TH_COLUMN: JZ INSTR_STEP ;INSTR_STEP
JZ FETCH_PC ;FETCH_PC READ_8TH_LINE: MVI A,FDH ;1111 1101 READ_8TH_COLUMN: JZ RUN_ ;RUN JZ FETCH_REG JZ FETCH_ADRS ;FETCH_REG ;FETCH_ADRS JMP START STORE_INCR: MVI A,83H DECR: MVI A,81H ZERO: MVI A,00H ONE: TWO: THREE: MVI A,03H FOUR: MVI A,04H FIVE: MVI A,05H SIX: MVI A,06H SEVEN: MVI A,07H EIGHT: MVI A,08H NINE: MVI A,09H L_A: MVI A,0AH
L_B: L_C: L_D: MVI A,0BH MVI A,0CH MVI A,0DH L_E: MVI A,0EH L_F: MVI A,0FH INSTR_STEP: MVI A,86H FETCH_PC: MVI A,85H RUN_: MVI A,84H FETCH_REG: MVI A,80H FETCH_ADRS: MVI A,82H DISPLAY: MOV B,A ;save A (xxxxyyyy) RRC ;4 olis8hseis wste na paroume ta MSB RRC RRC RRC ;(yyyyxxxx) ANI 0FH ; 0F=00001111 apomonwsh STA 0B05H ;emfanish 1ou pshfiou MOV A,B ANI 0FH STA 0B04H ;emfanish 2ou pshfiou CALL STDM ;emfanish xarakthrwn sthn o8onh CALL DCD ;diavasma pshfiwn apo th mnhmh ;metatroph dedomenwn ston kwdiko gia ap eu8eias e3odo apo o8onh ;freskarisma o8onhs JMP LOOPA END
iv) Στο πρόβλημα αυτό μας ζητείται απ' ευθείας ανάγνωση του πληκτρολογίου και εμφάνιση των ψηφίων στην 7-segment display (δηλαδή χωρίς χρήση των ρουτινών ΚΙΝD, DCD και STDM). IN 10H START: READ_1ST_LINE: MVI A,FBH ;1111 1011 READ_1ST_COLUMN: JZ ZERO ;0 JZ STORE_INCR JZ DECR ;DECR ;STORE/INCR READ_2ND_LINE: MVI A,F7H ;1111 0111 READ_2ND_COLUMN: JZ ONE ;1 JZ TWO ;2 JZ THREE ;3 READ_3RD_LINE: MVI A,EFH ;1110 1111 READ_3RD_COLUMN: JZ FOUR ;4 JZ FIVE ;5 JZ SIX ;6 READ_4TH_LINE: MVI A,DFH ;1101 1111 READ_4TH_COLUMN: JZ SEVEN ;7 JZ EIGHT ;8
JZ NINE ;9 READ_5TH_LINE: MVI A,BFH ;1011 1111 READ_5TH_COLUMN: JZ L_A ;A JZ L_B ;B JZ L_C ;C READ_6TH_LINE: MVI A,7FH ;1111 1111 READ_6TH_COLUMN: JZ L_D ;D JZ L_E ;E JZ L_F ;F READ_7TH_LINE: MVI A,FEH ;1111 1110 READ_7TH_COLUMN: JZ INSTR_STEP ;INSTR_STEP JZ FETCH_PC ;FETCH_PC READ_8TH_LINE: MVI A,FDH ;1111 1101 READ_8TH_COLUMN: JZ RUN_ ;RUN JZ FETCH_REG JZ FETCH_ADRS ;FETCH_REG ;FETCH_ADRS JMP START STORE_INCR: MVI A,80H
MVI A,B0H DECR: MVI A,80H MVI A,F9H ZERO: ONE: TWO: MVI A,F9H MVI A,A4H THREE: MVI A,B0H FOUR: MVI A,99H
FIVE: MVI A,92H SIX: MVI A,82H SEVEN: MVI A,F8H EIGHT: MVI A,80H NINE: MVI A,98H L_A: L_B: MVI A,88H
MVI A,83H L_C: L_D: MVI A,C6H MVI A,A1H L_E: MVI A,86H L_F: MVI A,8EH INSTR_STEP: MVI A,80H MVI A,82H FETCH_PC: MVI A,80H MVI A,92H
HRDWR_STEP: MVI A,8EH MVI A,F8H RUN_: FETCH_REG: MVI A,80H MVI A,99H MVI A,80H FETCH_ADRS: MVI A,80H MVI A,A4H KATHARISMOS_OTHONHS: MVI A,FFH JMP START END
5 η Άσκηση Α) πρόγραμμα 8085 που στέλνει δεδομένα START: MVI A,0H SIM ;ΑΡΧΙΚΟΠΟΙΗΣΗ ΣΥΣΣΩΡΕΥΤΗ, ΔΕΝ ΣΤΕΛΝΩ ΜΕΣΩ SOD MVI C,0FFH ;ΑΡΧΙΚΟΠΟΙΗΣΗ ΜΕΤΡΗΤΗ ΔΕΔΟΜΕΝΩΝ LOOP: MOV A,C ;ΜΕΤΑΦΕΡΩ ΤΟΝ ΜΕΤΡΗΤΗ ΔΕΔΟΜΕΝΩΝ ΣΤΟΝ Α CPI 0H ; JM END ;ΟΤΑΝ Η ΔΙΑΦΟΡΑ Α-0 ΓΙΝΕΙ ΑΡΝΗΤΙΚΗ ΤΟΤΕ ΣΗΜΑΙΝΕΙ ΟΤΙ ΔΕΝ ΕΧΩ ΑΛΛΑ ΔΕΔΟΜΕΝΑ ΓΙΑ ΑΠΟΣΤΟΛΗ ΚΑΙ ΕΤΣΙ ΤΕΡΜΑΤΙΖΕΙ ΤΟ ΠΡΟΓΡΑΜΜΑ. JMP TRANSFER ; ΔΙΑΦΟΡΕΤΙΚΑ ΣΥΝΕΧΙΖΟΥΜΕ TRANSFER: MVI A,0C0H ; A=1100 0000 SIM ; ΣΤΕΛΝΟΥΜΕ ΘΕΤΙΚΗ ΑΚΜΗ ΣΤΟ μυ-σ2 ΜΕΣΩ ΤΟΥ SOD1 CHECK: RIM ;ΔΙΑΒΑΖΟΥΜΕ ΑΠΟ ΤΗΝ ΕΙΣΟΔΟ SID1 TO MSB TOY A ANI 08H ; ΑΠΟΜΟΝΩΝΟΥΜΕ ΤΟ MSB TOY A CPI 08H ; ΣΥΓΚΡΙΝΟΥΜΕ ΤΟ Α ΜΕ ΤΟ 08Η. ΑΝ ΕΙΝΑΙ ΙΣΑ ΣΗΜΑΙΝΕΙ ΟΤΙ ΤΟ ΔΕΔΟΜΕΝΟ ΑΝΑΓΝΩΡΙΣΤΗΚΕ ΑΠΟ ΤΟ μυ-σ2 JNZ CHECK ; ΑΛΛΙΩΣ ΞΑΝΑΜΠΑΙΝΟΥΜΕ ΣΤΟ CHECK MOV A,M ; ΜΕΤΑΦΕΡΟΥΜΕ ΣΤΟΝ Α ΤΑ ΔΕΔΟΜΕΝΑ ΤΗΣ ΘΕΣΗΣ ΜΝΗΜΗΣ ΠΟΥ ΔΕΙΧΝΟΥΝ ΟΙ H-L OUT DATA1; ΚΑΙ ΤΑ ΟΔΗΓΟΥΜΕ ΣΤΗΝ ΠΟΡΤΑ ΕΞΟΔΟΥ DATA1 INX H ; ΠΡΟΧΩΡΑΜΕ ΣΤΗΝ ΕΠΟΜΕΝΗ ΘΕΣΗ ΜΝΗΜΗΣ DCR C; ΜΕΙΩΝΟΥΜΕ ΚΑΤΑ 1 ΤΟ ΜΕΤΡΗΤΗ ΠΡΟΓΡΑΜΜΑΤΟΣ JMP LOOP END:HALT
B) Πρόγραμμα 8085 που λαμβάνει δεδομένα START: MVI C, 0FFH; ΑΡΧΙΚΟΠΟΙΗΣΗ ΤΟΥ ΜΕΤΡΗΤΗ ΔΕΔΟΜΕΝΩΝ LOOP: MOV A, C; ΜΕΤΑΦΕΡΩ ΣΤΟΝ Α ΤΟ ΜΕΤΡΗΤΗ ΔΕΔΟΜΕΝΩΝ CPI OH ; ΕΛΕΓΧΕΙ ΑΝ ΕΧΟΥΜΕ ΛΑΒΕΙ ΟΛΑ ΤΑ ΔΕΔΟΜΕΝΑ JM END JMP RECEIVE; ΔΙΑΦΟΡΕΤΙΚΑ ΣΥΝΕΧΙΖΟΥΜΕ RECEIVE: MVI A,OH ; ΑΡΧΙΚΟΠΟΙΟΥΜΕ ΤΟ ΣΥΣΣΩΡΕΥΤΗ CHECK: RIM; ΔΙΑΒΑΖΕΙ ΑΠΟ ΤΟ SID2 TO MSB TOY A ANI 08H ;ΕΛΕΓΧΕΙ ΑΝ ΤΟ ΜSB TOY A ΠΟΥ ΕΛΑΒΕ ΕΙΝΑΙ 1 CPI 08H ;ΣΕ ΠΕΡΙΠΤΩΣΗ ΠΟΥ ΔΕΝ ΕΙΝΑΙ ΞΑΝΑΜΠΑΙΝΕΙ ΣΤΟ CHECK JNZ CHECK MVI A,0C0H; A=1100 00000 SIM ; ΣΤΕΛΝΩ ΜΕΣΩ ΤΟΥ SOD2 TO MSB TOY A ΓΙΑ ΤΗΝ ΕΠΙΒΕΒΑΙΩΣΗ ΤΗΣ ΑΝΑΓΝΩΡΙΣΗΣ ΤΟΥ ΔΕΔΟΜΕΝΟΥ ΙΝ DATA2; ΦΕΡΝΟΥΜΕ ΤΟ ΔΕΔΟΜΕΝΟ ΤΗΣ ΘΥΡΑΣ ΕΙΣΟΔΟΥ ΣΤΟ Α MOV M,A ; TO ΑΠΟΘΗΚΕΥΟΥΜΕ ΣΤΗ ΔΙΕΥΘΥΝΣΗ ΠΟΥ ΔΕΙΧΝΟΥΝ ΟΙ H-L ΙΝΧ Η ; ΠΡΟΧΩΡΑΜΕ ΣΤΗΝ ΕΠΟΜΕΝΗ ΘΕΣΗ ΜΝΗΜΗΣ DCR C; ΜΕΙΩΝΟΥΜΕ ΚΑΤΑ 1 ΤΟ ΜΕΤΡΗΤΗ ΔΕΔΟΜΕΝΩΝ JMP LOOP END: HLT
6 η Άσκηση 7 η Άσκηση α) Μας ζητείται να γράψουμε μια μακροεντολή SWAP Q, R που να εναλλάσει τα περιεχόμενα οποιονδήποτε καταχωρητών γενικού σκοπού Β, C, D, E, H και L. Η εκτέλεση της μακροεντολής δεν πρέπει να επηρεάζει τα περιεχόμενα των καταχωρητών που δεν μετάχουν στην εναλλαγή. Ο κώδικας της μακροεντολής αυτής δίνεται παρακάτω: SWAP MACRO Q,R PUSH Q PUSH R POP Q POP R ENDM
β) Μας ζητείται να γράψουμε μια μακροεντολή FILL ADDR L,K που να γεμίζει ένα τμήμα μνήμης με μια σταθερά. Το μέγεθος του τμήματος μπορεί να είναι μέχρι 256. Ο κώδικας της μακροεντολής αυτής δίνεται παρακάτω: FILL MACRO ADDR,L,K PUSH L PUSH H PUSH B MVI B,L LXI H,ADDR FILL_LOOP: MVI M,K INX H DCR B JNZ FILL_LOOP FILL_FINISHED: POP B POP H POP L ENDM γ) Μας ζητείται να γράψουμε μια μακροεντολή RHLL n που να περιστρέφει τα περιεχόμενα του κρατουμένου CY των καταχωρητών Η και L κατά n ψηφία αριστερά. Θεωρούμε ότι έχουμε 17- bit καταχωρητή με CY στο ΜSB. Ο κώδικας της μακροεντολής αυτής δίνεται παρακάτω: RHLL MACRO N PUSH C ROTATE_LOOP: MOV A,L RAL MOV L,A MOV A,H RAL MOV H,A DCR C JNZ ROTATE_LOOP FILL_FINISHED: POP C ENDM