Συστήματα Μικροϋπολογιστών

Σχετικά έγγραφα
Αρχιτεκτονική Υπολογιστών

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

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ ΙΙ Εργαστήριο 2 ο ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ- ΨΕΥΔΟΕΝΤΟΛΕΣ ΜΑΚΡΟΕΝΤΟΛΕΣ- ΔΙΑΔΙΚΑΣΙΕΣ (ΕΙΣΑΓΩΓΗ)

Συστήματα Μικροϋπολογιστών

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

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

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

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

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

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

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

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

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

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ

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

ΛΥΣΕΙΣ ΘΕΜΑΤΩΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ

Οδηγός Εκμάθησης στην Assembly

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Επιμέλεια: ρ. Ν. Σγούρος ρ. Ι. Κονταξάκης

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ

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

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

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

Υποπρογράμματα (Subroutines)

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

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

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Αρχιτεκτονική-Ι. Ενότητα 1: Εισαγωγή στην Αρχιτεκτονική -Ι

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

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

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

Θ. Ζαχαριάδης Αν. Καθηγητής. Λ. Σαράκης Καθ. Εφαρμογών

Αρχιτεκτονική-Ι Ενότητα 5:

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

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ

Θ. Ζαχαριάδης Αν. Καθηγητής. Λ. Σαράκης Καθ. Εφαρμογών

Εισαγωγή στην Επιστήμη των Υπολογιστών

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

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

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα

MIPS functions and procedures

ΧΡΗΣΗ ΠΛΗΚΤΡΟΛΟΓΙΟΥ, ΟΘΟΝΗΣ ΚΑΙ INTERRUPTS ΣΤΟΝ EMULATOR

ΑΡΧΙΤΕΚΤΟΝΙΚΗ & ΛΕΙΤΟΥΡΓΙΑ Η/Υ

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Υπολογιστές Ι. Άδειες Χρήσης. Εισαγωγή. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Αρχιτεκτονική-ΙΙ Μέρος 2 ο

Πληροφορική. Ενότητα 4 η : Κωδικοποίηση & Παράσταση Δεδομένων. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής

Καταχωρητές & τμήματα μνήμης του Ματθές Δημήτριος Καθηγητής Πληροφορικής

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 1 Hello World

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

Ψηφιακή Σχεδίαση. Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:01. Δρ. Μηνάς Δασυγένης. Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

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

Συστήματα Μικροϋπολογιστών

ΑΡΧΙΤΕΚΤΟΝΙΚΗ & ΛΕΙΤΟΥΡΓΙΑ Η/Υ

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

ΠΛΗΡΟΦΟΡΙΚΗ I. 4 η ΔΙΑΛΕΞΗ Αριθμητικά Συστήματα

ΜΑΘΗΜΑ: ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΕΣ ΘΕΜΑΤΑ ΙΟΥΝΙΟΥ 2014

Συστήματα Μικροϋπολογιστών

Αριθμητικά Συστήματα

Περιεχόµενα. I Βασικές Γνώσεις 1

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

ΘΕΜΑΤΑ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ-ΙΙ

ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Η/Υ

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

Ο 8086 µπορεί να θεωρηθεί ότι αποτελείται από δύο τµήµατα επεξεργαστές, όπως φαίνεται και στο σχήµα 1, οι οποίοι είναι:

0100: MAR ADR; wait;mdr DB; SCR L DH+MDR+CY

Εργαστήριο Δομής και Λειτουργίας Μικροϋπολογιστών. Βοήθημα εκτέλεσης εργαστηριακής άσκησης 4: Ρουτίνες καθυστέρησης. [Συγγραφή ρουτίνας καθυστέρησης]

Προηγμένοι Μικροεπεξεργαστές. Φροντιστήριο 2 Addressing

Συστήματα Μικροϋπολογιστών

ΜΑΘΗΜΑ: ΜΙΚΡΟΕΛΕΓΚΤΕΣ

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών. Ψηφιακή Σχεδίαση

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

Ο 8086 µπορεί να θεωρηθεί ότι αποτελείται από δύο τµήµατα επεξεργαστές, όπως φαίνεται και στο σχήµα 1, οι οποίοι είναι:

Ψηφιακή Σχεδίαση. Ενότητα: ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ No:07. Δρ. Μηνάς Δασυγένης. Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Συστήματα Μικροϋπολογιστών. Παραδείγματα χρήσης διαδικασιών Εισόδου Εξόδου δεδομένων στον με 8085

ΠΕΡΙΕΧΟΜΕΝΑ 1. Υπορουτίνες Μαθηµατικών Πράξεων 1.1. Προσηµασµένοι και απροσήµαστοι αριθµοί 1.2. Μετατροπές προσηµασµένων και απροσήµαστων αριθµών

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική Ι. Ενότητα 4 : Πράξεις με bits. Δρ. Γκόγκος Χρήστος

Προηγμένοι Μικροεπεξεργαστές. Έλεγχος Ροής Προγράμματος

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. 3 ο Μάθημα. Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ. url:

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

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

Αρχιτεκτονική Υπολογιστών Ασκήσεις Εργαστηρίου

Συστήματα Αρίθμησης. Συστήματα Αρίθμησης 1. PDF created with FinePrint pdffactory Pro trial version

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική Ι. Ενότητα 3 : Αναπαράσταση αριθμών στο δυαδικό σύστημα. Δρ.

Καταχωρητές γενικής χρήσης και δεδοµένων (Data Registers)

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

Εισαγωγή στην Επιστήμη των Υπολογιστών

για τις ρυθμίσεις LabView μέσα από το κανάλι και του καλωδίου USB.

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές. 5 ο Μάθημα. Λεωνίδας Αλεξόπουλος Λέκτορας ΕΜΠ. url:

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Αρχιτεκτονική-Ι. Ενότητα 4: Το Προγραμματιστικό Μοντέλο του 8086

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

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

Παραδείγματα Assembly (Μέρος

Transcript:

Συστήματα Μικροϋπολογιστών Assembly 80x86 Υπεύθυνος Μαθήματος: K. ΠΕΚΜΕΣΤΖΗ

Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναφέρεται ρητώς.

Ρουτίνες Πληκτρολογίου και Οθόνης AH=01H ή AH=08H ΙΝΤ 21Η Αποτέλεσμα: AL=ASCII πλήκτρου Περιμένει το πάτημα ενός πλήκτρου και επιστρέφει αφού τυπώσει τον αντίστοιχο χαρακτήρα στην οθόνη (AH=01H). Επίσης στον καταχωρητή AL επιστρέφει τον κωδικό ASCII του χαρακτήρα. Για AH=08H επιστρέφει χωρίς να τυπώσει στην οθόνη. DL=ASCII χαρακτήρα AH=02H ΙΝΤ 21Η Αποτέλεσμα: Τυπώνει στην οθόνη Τυπώνει στην οθόνη τον χαρακτήρα που ο κωδικός του δίνεται στον καταχωρητή DL. DX= αρχή χαρακτήρων AH=09H ΙΝΤ 21Η Αποτέλεσμα: Τυπώνει σειρά χαρακτήρων Τυπώνει σειρά από χαρακτήρες αρχίζοντας από τη διεύθυνση DS:DX. Σταματά όταν βρει $.

Οδηγίες προς τον Assembler (A) ASSUME CS: CODE Σημαίνει ότι το SEG CODE θα χρησιμοποιηθεί για κώδικα Δε φορτώνει τιμές VAR DB (DW, DD) τιμή LABEL DB string VAR OFFSET Αντιστοιχεί με LEA (δηλ. φορτώνει τη διεύθυνση) PROC NEAR ή FAR... ENDP

Οδηγίες προς τον Assembler (B) PUBLIC Μεταβλητή, label, υπορουτίνα Σημαίνει ότι τα παραπάνω είναι διαθέσιμα (φάση linking). EXTRN Μεταβλητή, label, υπορουτίνα Χρησιμοποιείται σε συνδυασμό με την public Σταθερά EQU τιμή Π.χ. CONST EQU 13 ORG διεύθυνση Π.χ. ORG 100H DB ή DW 50 DUP(?) ή DUP(0) Δέσμευση μνήμης END Τέλος μετάφρασης

Διάταξη Μνήμης Προγραμμάτων Assembly CS, DS, ES, SS IP=100H PSP 256 τιμές Πρόθεμα Τμήματος Προγράμματος Τύπου.COM 1 Τμήμα Μεγαλύτερη Ταχύτητα Μικρότερη Μνήμη SP PSP Program Data Σωρός DS, ES CS:IP DS, ES (Πρέπει να ορίζονται όταν υπάρχουν τμήματα δεδομένων) SS SP Τύπου.ΕΧΕ Περισσότερα Τμήματα Μεγαλύτερη Μνήμη Μικρότερη Ταχύτητα CS, SS ορίζονται από τον Linker

Γενική Μορφή Προγράμματος Assembly (MASM) STACK SEGMENT DW 50 DUP(?) STACK ENDS DATA SEGMENT A1 DW 2020H A2 DB 5 DATA ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK, DS: DATA, ES: DATA START: MOV AX, DATA MOV DS, AX MOV ES, AX ; ΕΝΤΟΛΕΣ ΠΡΟΓΡΑΜΜΑΤΟΣ MOV AX,4C00H INT 21H CODE ENDS END START

Εκτύπωση χαρακτήρων ASCII STACK_SEG SEGMENT DB 30 DUP(?) STACK_SEG ENDS CODE_SEG SEGMENT ASSUME CS:CODE_SEG, SS:STACK_SEG MAIN PROC FAR MOV CX,255 MOV DL,0 ; Ο DL περιέχει τον ASCII κωδικό του ADDR: MOV AH,2 ; χαρακτήρα που θα τυπωθεί INT 21H INC DL ; Αύξηση του DL ώστε να τυπωθεί LOOP ADDR ; ο επόμενος ASCII χαρακτήρας MOV AX,4C00H ; Εξοδος στο DOS INT 21H MAIN ENDP CODE_SEG END ENDS MAIN

Εκτύπωση μηνύματος Assembly 80x86 DATA_SEG SEGMENT TOP_LINE DB 218,22 DUP (196),191,0AH,0DH,'$' MESSAGE DB 179," Assembly 80x86 ",179,0AH,0DH,'$' BOTTOM_LINE DB 192,22 DUP (196),217,0AH,0DH,'$' DATA_SEG ENDS CODE_SEG SEGMENT ASSUME CS:CODE_SEG,DS:DATA_SEG MAIN PROC FAR MOV AX,DATA_SEG MOV DS,AX MOV DX,OFFSET TOP_LINE MOV AH,9 INT 21H MOV DX,OFFSET MESSAGE MOV AH,9 INT 21H MOV DX,OFFSET BOTTOM_LINE MOV AH,9 INT 21H MOV AX,4C00H INT 21H MAIN ENDP CODE_SEG ENDS END MAIN

Mακροεντολές READ MACRO ; Μακροεντολή ανάγνωσης MOV DL, CHAR ; Πληκτρολογίου. Η τιμή του ASCII MOV AH, 8 ; χαρακτήρα επιστρέφει μέσω INT 21Η ; του καταχωρητή AL ENDM PRINT MACRO CHAR ; Μακροεντολή εκτύπωσης χαρακτήρα MOV DL, CHAR ; Η παράμετρος CHAR πρέπει να έχει MOV AH, 2 ; ορισθεί πριν τη μετάφραση INT 21Η ENDM PRINT_STR MACRO STRING ; Μακροεντολή εκτύπωσης MOV DX,OFFSET STRING ; ακολουθίας χαρακτήρων MOV AH,9 INT 21H ENDM EXIT MACRO ; Μακροεντολή εξόδου MOV AX, 4C00H ; από το πρόγραμμα INT 21H ENDM

Εκτύπωση δεκαδικού δεδομένου που δίνεται από το πληκτρολόγιο σε δυαδική μορφή (Α) INCLUDE MACROS DATA_SEG SEGMENT NEW_LINE DB 0AH,0DH,'$' DATA_SEG ENDS CODE_SEG SEGMENT ASSUME CS:CODE_SEG,DS:DATA_SEG MAIN PROC FAR MOV AX, DATA_SEG MOV DS, AX START: CALL DEC_KEYB ; Μετατροπή ψηφίου σε δυαδικό CMP AL, 'Q' ; Αν πατήθηκε το πλήκτρο 'Q' JE QUIT ; τέλος προγράμματος MOV BL, AL PRINT '=

Εκτύπωση δεκαδικού δεδομένου που δίνεται από το πληκτρολόγιο σε δυαδική μορφή (Β) ADDR1: QUIT: MOV CL, 4 SHL BL, CL ; Ολίσθησε τα 4 bits στις πιο σημαντικές θέσεις MOV CX, 4 ; Μετατροπή και εκτύπωση δυαδικού SHL BL, 1 ; Το αριστερότερο bit στο κρατούμενο MOV DL, 0 ; Πάρε την ASCII τιμή του δυαδικού ψηφίου ADC DL,30H ; προσθέτοντας στο 30Η το κρατούμενο PRINT DL ; ('1'=31Η, '0'=30Η) και τύπωσέ το LOOP ADDR1 ; Επανέλαβε 4 φορές PRINT_STR NEW_LINE JMP START EXIT MAIN ENDP

Εκτύπωση δεκαδικού δεδομένου που δίνεται από το πληκτρολόγιο σε δυαδική μορφή (Γ) DEC_KEYB PROC NEAR ; Φύλαξε τους καταχωρητές που επηρεάζονται από την ρουτίνα PUSH DX ; Επηρεάζεται από τη macro PRINT IGNORE: READ ; Διάβασε τον χαρακτήρα από το πληκτρολόγιο CMP AL, 'Q' ; χωρίς να τον τυπώσεις JE ADDR2 CMP AL, 30H ; Εξέτασε αν ο χαρακτήρας είναι ψηφίο JL IGNORE ; Αν όχι αγνόησέ τον και διάβασε άλλον CMP AL, 39H JG IGNORE PUSH AX ; Φύλαξε τον AL γιατί επηρεάζεται από την PRINT PRINT AL ; Τύπωσε το χαρακτήρα POP AX SUB AL, 30H ; Μετέτρεψε το ψηφίο σε δυαδικό αριθμό ADDR2: POP DX RET DEC_KEYB ENDP CODE_SEG ENDS END MAIN

Εκτύπωση 8-bit αριθμού σε δεκαεξαδική μορφή (Α) INCLUDE MACROS CODE_SEG SEGMENT ASSUME CS:CODE_SEG NUMBER EQU 0AH ; Ορίζεται ο αριθμός που θα τυπωθεί σαν δύο Hex ORG 100H ; Ο κώδικας πρέπει να αρχίζει από τη διεύθυνση ; 100 Η αν το πρόγραμμα είναι τύπου.com MAIN PROC FAR MOV DL, NUMBER AND DL,0F0H ; Απομόνωσε τα 4 πιο σημαντικά bits του αριθμού MOV CL, 4 RCR DL, CL ; Ολίσθησέ τα στις 4 λιγότερο σημαντικές θέσεις CALL PRINT_HEX ; Τύπωσέ τα σαν ένα δεκαεξαδικό ψηφίο MOV DL, NUMBER ; Απομόνωσε και τύπωσε σαν Hex τα 4 AND DL, 0FH ; λιγότερο σημαντικά bits CALL PRINT_HEX EXIT MAIN ENDP

Εκτύπωση 8-bit αριθμού σε δεκαεξαδική μορφή (Β) PRINT_HEX PROC NEAR CMP DL, 9 ; Αν ο αριθμός είναι μεταξύ 0 και 9 προστίθεται JG ADDR1 ; Η τιμή 30H ('0'=30H). ADD DL, 30H JMP ADDR2 ADDR1: ADD DL, 37H ; Διαφορετικά προστίθεται η τιμή 37H ('A'=41H). ADDR2: RET PRINT_HEX PRINT DL ENDP ; Τύπωσε το χαρακτήρα στην οθόνη CODE_SEG ENDS END MAIN

Ανάγνωση δεκαεξαδικού ψηφίου και μετατροπή σε BCD (A) INCLUDE MACROS STACK_SEG SEGMENT STACK DB 50 DUP(?) STACK_SEG ENDS DATA_SEG SEGMENT MSG1 DB 0AH,0DH,'ΔΕΚΑΕΞΑΔΙΚΟΣ:$' MSG2 DB 0AH,0DH,'ΔΕΚΑΔΙΚΟΣ:$' BCD_TABLE DB "00010203040506070809101112131415" DATA_SEG ENDS CODE_SEG SEGMENT ASSUME CS:CODE_SEG, DS:DATA_SEG MAIN PROC FAR MOV AX, DATA_SEG MOV DS, AX START: PRINT_STR MSG1 CALL HEX_KEYB ; Διάβασε το δεκαεξαδικό ψηφίο CMP AL, 'Q' ; Αν πατήθηκε το πλήκτρο Q JE QUIT ; τέλος προγράμματος

Ανάγνωση δεκαεξαδικού ψηφίου και μετατροπή σε BCD (B) MOV BL, AL ; Προσδιόρισε τη θέση της BCD αναπαράστασης ; του αριθμού μέσα στον πίνακα TABLE. Για κάθε αριθμό αντιστοιχούν δύο X ADD BL, BL ; ψηφία BCD. Γι αυτό διπλασίασε τον BL. PRINT_STR MSG2 MOV BH, 0 PRINT BCD_TABLE[BX] ; Τύπωσε αυτά τα 2 ψηφία PRINT BCD_TABLE[BX+1] JMP START QUIT: EXIT MAIN ENDP HEX_KEYB PROC NEAR ; Η ρουτίνα διαβάζει ένα ΗΕΧ ψηφίο από το ; πληκτρολόγιο και το επιστρέφει ως δυαδικό μέσω του AL. PUSH DX ; Ο καταχ. DX επηρεάζεται από τη macro PRINT IGNORE: READ ; Διάβασε τον χαρακτήρα από το πληκτρολόγιο CMP AL, 'Q' ; Αν είναι ο χαρακτήρας 'Q' τέλος ρουτίνας JE ADDR2

Ανάγνωση δεκαεξαδικού ψηφίου και μετατροπή σε BCD (Γ) CMP AL,30H ; Εξέτασε αν ο χαρακτήρας είναι ψηφίο JL IGNORE ; Αν όχι αγνόησέ τον και διάβασε άλλον CMP AL,39H JG ADDR1 PUSH AX PRINT AL ; Τύπωσε το ψηφίο POP AX SUB AL,30H ; Εξαγωγή του καθαρού αριθμού ('0'=30) JMP ADDR2 ADDR1: CMP AL,'A' JL IGNORE CMP AL,'F' JG IGNORE PUSH AX PRINT A POP AX SUB AL,37H ; Μετατροπή του HEX ASCII σε καθαρό ADDR2: POP DX ; αριθμό('a'=41, 41H-31H=10H) RET HEX_KEYB ENDP CODE_SEG ENDS END MAIN

Μετατροπή 4ψήφιου δεκαδικού σε δεκαεξαδική μορφή (Α) INCLUDE INCLUDE MACROS LIB_EXTR DATA_SEG SEGMENT MSG1 DB 0AH,0DH,'ΔΕΚΑΔΙΚΟΣ:$' MSG2 DB 0AH,0DH,'ΔΕΚΑΕΞΑΔΙΚΟΣ:$' DATA_SEG ENDS CODE_SEG SEGMENT ASSUME CS:CODE_SEG,DS:DATA_SEG MAIN PROC FAR MOV AX,DATA_SEG MOV DS,AX START: PRINT_STR MSG1 MOV DX,0 ; Μηδένισε τον DX, όπου θα σχηματιστεί ο ; αριθμός σε δυαδική μορφή MOV CX,4 ; Αρχικοποίησε μετρητή ψηφίων

Μετατροπή 4ψήφιου δεκαδικού σε δεκαεξαδική μορφή (Β) ADDR1: ADDR2: MOV AX,10 ; Πολλαπλασίασε με 10 τον DX MUL DX MOV DX,AX CALL DEC_KEYB ; Διάβασε το επόμενο ψηφίο CMP AL,'Q' ; Αν είναι το Q τέλος προγράμματος JE QUIT MOV AH,0 ADD DX,AX ; Πρόσθεσε το νέο ψηφίο στον DX LOOP ADDR1 ; Επανέλαβε μέχρι να διαβαστούν και MOV BX,DX ; τα 4 ψηφία PRINT_STR MSG2 ; Ακολουθεί η εκτύπωση του αριθμού MOV CX,4 ROL BX,1 ; Ολίσθησε δεξιά τον αριθμό ώστε τα 4 ROL BX,1 ; επόμενα bit να έρθουν στις 4 ROL BX,1 ; δεξιότερες θέσεις ROL BX,1 MOV DX,BX

Μετατροπή 4ψήφιου δεκαδικού σε δεκαεξαδική μορφή (Γ) AND DX,000FH ; Απομόνωσε τα 4 λιγότερο σημαντικά bits CALL PRINT_HEX ; και τύπωσέ τα σαν ένα δεκαεξαδικό LOOP ADDR2 ; ψηφίο JMP START ; Η διαδικασία επαναλαμβάνεται μέχρι να QUIT: EXIT ; πατηθεί το πλήκτρο 'Q' MAIN ENDP PRINT_HEX PROC NEAR CMP DL,9 ; Αν ο αριθμός είναι μικρότερος του 9 για να JLE ADDR3 ; γίνει ASCII πρόσθεσέ του το 30Η ('0'=30Η) ADD DL,37H ; Διαφορετικά αν είναι μεγαλύτερος από 9, JMP ADDR4 ; δηλαδή μεταξύ Α και F, πρόσθεσέ του το ADDR3: ADD DL, ; 30H37('Α'=41Η) ADDR4: PRINT DL ; Τύπωσε το δεκαεξαδικό ψηφίο RET PRINT_HEX ENDP CODE_SEG END ENDS MAIN

Μετατροπή 4-ψήφιου HEX σε BCD μορφή (A) INCLUDE INCLUDE MACROS LIB_EXTR DATA_SEG SEGMENT MSG1 DB 0AH,0DH,'ΔΕΚΑΕΞΑΔΙΚΟΣ:$' MSG2 DB 0AH,0DH,'ΔΕΚΑΔΙΚΟΣ:$' DATA_SEG ENDS CODE_SEG SEGMENT ASSUME CS:CODE_SEG,DS:DATA_SEG MAIN PROC FAR MOV AX,DATA_SEG MOV DS,AX START: PRINT_STR MSG1 MOV DX,0 MOV CX,4 ADDR1: CALL HEX_KEYB CMP AL,'Q' JE QUIT

Μετατροπή 4-ψήφιου HEX σε BCD μορφή (B) SHL DX, 1 SHL DX, 1 SHL DX, 1 SHL DX, 1 ADD DL, AL ; συνθέτω στον καταχωρητή DX τον αριθμό LOOP ADDR1 ; που αποτελείται από 4 δεκαεξαδικά ψηφία ; Ακολουθεί η εκτύπωση του αριθμού σε δεκαδική μορφή MOV BX,DX PRINT_STR MSG2 MOV DX, BX ; Υπολόγισε τα BCD ψηφία του αριθμού και αποθήκευσέ τα στη στοίβα MOV CX, 0 ; Μηδένισε το μετρητή ψηφίων MOV AX, DX ADDR2: MOV DX, 0 MOV BX,10 DIV BX ; Διαίρεσε τον αριθμό με το 10 PUSH DX ; Αποθήκευσε το υπόλοιπο στη στοίβα INC CX ; Αύξησε το μετρητή ψηφίων CMP AX, 0 ; Όταν το πηλίκο είναι 0 δεν υπάρχει άλλο ψηφίο JNE ADDR2

Μετατροπή 4-ψήφιου HEX σε BCD μορφή (Γ) ; Πάρε ένα προς ένα τα ψηφία από τη στοίβα. Βρες, ASCII κωδικούς για ; τους αντίστοιχους χαρακτήρες και στη συνέχεια τύπωσέ τους στην οθόνη. ADDR3: QUIT: MAIN POP DX ; Διάβασε από τη στοίβα ένα ψηφίο ADD DX,30H ; Υπολόγισε τον κωδικό ASCII και τύπωσε PRINT DL ; τον αντίστοιχο χαρακτήρα στην οθόνη LOOP ADDR3 JMP START EXIT ENDP CODE_SEG END ENDS MAIN

ΛΗΨΗ ΚΑΙ ΕΚΤΥΠΩΣΗ ΘΕΡΜΟΚΡΑΣΙΑΣ Αισθητήρας A/D 12 bit Θύρα Εισόδου 25AEH 2000 o C T 2000 A/ D T ( o C) A/D 2047 2047

Πρόγραμμα Λήψης & Απεικόνισης Θερμοκρασίας (Α) DATA SEGMENT MSG1 DB 0A, 0D, Έναρξη Μετατροπής C$ MSG2 DB 0A, 0D, Τερματισμός Q$ MSG3 DB 0A, 0D, Η ΘΕΡΜΟΚΡΑΣΙΑ ΕΙΝΑΙ: Τ = $ DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA MAIN PROC FAR MOV AX, DATA MOV DS, AX APXH: PRINT_STR MSG1 PRINT_STR MSG2 WAIT: READ CMP AL, Q JE SENDS ; Τερματισμός προγράμματος CMP AL, C ; Έναρξη Μετατροπής JNE WAIT PRINT_STR MSG3 INPUT: MOV DX, 25AEH IN AX, DX ; Είσοδος θερμοκρασίας MOV DX, 20000D

Πρόγραμμα Λήψης & Απεικόνισης Θερμοκρασίας (Β) MUL DX ; Κανονικοποίηση και MOV CX, 2047D ; και μετατροπή DIV CX CONV: MOV CX, 0 DIGIT: MOV DX, 0 MOV BX, 10D DIV BX ; Τα υπόλοιπα στον DX είναι PUSH DX ; τα ψηφία με πρώτο το LSD INC CX CMP AX, 0 JNE DIGIT DEC CX TIGID: POP DX ; Εκτυπώνονται τα ψηφία με PRINT_DEC ; Αντίστροφη σειρά πρώτο το MSD LOOP TIGID PRINT. PRINT_DEC MACRO POP DX ; και το δεκαδικό ψηφίο ADD DL, 30H PRINT_DEC MOV AH,2 JMP APXH INT 21H SENDS: EXIT ENDM CODE ENDS END MAIN

Υπολογισμός γινομένου μονοψήφιων δεκαδικών αριθμών. Αποτέλεσμα σε δεκαδική μορφή 2 ψηφίων. EXTRN DEC_KEYB EXTRN BIN_DEC CODE_SEG SEGMENT ASSUME CS: CODE_SEG MULTP PROC FAR CALL DEC_KEYB MOV BH, AL MOV DL, * PRINT DL CALL DEC_KEYB MUL BH ; Το γινόμενο στον AX CALL 8BIN_2DEC EXIT MULTP ENDP CODE_SEG ENDS END MULTP Link MULTP + DEC_KEYB + BIN_DEC 8BIN_2DEC PROC NEAR MOV BL,10D ; DIV BL ; AL πηλίκο, ; AH υπόλοιπο PRINT AL ; Τύπωσε δεκάδες PRINT AH ; Τύπωσε μονάδες RET BIN_DEC ENDP 8BIN_2DEC PROC NEAR AAM ; Adjust after multiplication ; AH AL/10D, AL υπόλοιπο PRINT AH ; Τύπωσε δεκάδες PRINT AL ; Τύπωσε μονάδες RET BIN_DEC ENDP

Υπολογισμός 2 n (n=0, 1, 2, 9) EXTRN DEC_KEYB EXTRN BIN_DEC CODE_SEG SEGMENT ASSUME CS: CODE_SEG EXP-TWO PROC FAR PRINT_CHAR 2 PRINT_CHAR ^ CALL DEC_KEYB PRINT_CODE = MOV CL, AL MOV AX, 1 ROL AX, CL CALL 16BIN_DEC EXIT EXP-TWO ENDP CODE_SEG ENDS END EXP-TWO Link EXP-TWO + DEC_KEYB +16BIN_DEC PRINT_CHAR MACRO CHAR MOV DL, CHAR MOV AH,2 INT 21H ENDM PRINT_CODE MACRO CODE MOV DL, CODE MOV AH,2 INT 21H ENDM PRINT_NUM MACRO CHAR MOV DL, CHAR ADD DL, 30H MOV AH,2 INT 21H ENDM

Ρουτίνα 16BIN_DEC (δυαδικός σε δεκαδικό) 16BIN_DEC PROC NEAR ; Ο δυαδικός βρίσκεται στον καταχωρητή AX MOV CX,0 ; Μηδένισε το μετρητή ψηφίων ADDR1: MOV DX,0 MOV BX,10 DIV BX ; Διαίρεσε τον αριθμό με το 10 PUSH DX ; Αποθήκευσε το υπόλοιπο στη στοίβα INC CX ; Αύξησε το μετρητή ψηφίων CMP AX,0 ; Όταν το πηλίκο είναι 0 δεν υπάρχει άλλο ψηφίο JNE ADDR1 ADDR2: ; Τύπωσε τα ψηφία από τη στοίβα (αντίστροφη σειρά) POP DX ; Διάβασε από τη στοίβα ένα ψηφίο PRINT_NUM DL ; Τύπωσε τον αντίστοιχο χαρακτήρα στην οθόνη LOOP ADDR2 RET BIN_DEC ENDP

Υπολογισμός 2 n (n=0, 1, 2, 9)- Β Τρόπος CODE SEGMENT ASSUME CS :CODE, DS:DATA POWER PROC FAR MOV AX, DATA MOV DS, AX START: PRINT_CHAR 2 PRINT_CHAR ^ CALL DEC-KEYB CMP AL, Q JE QUIT MOV CL, AL ADD CL, CL ADD CL, AL MOV AL, CL MOV BX, OFFSET TABLE XLAT PRINT_CODE AL DATA SEGMENT TABLE DB 001002004008016 DB 032064128256512 DATA ENDS PRINT_CHAR MACRO CHAR MOV DL, CHAR MOV AH, 2 INT 21H ENDM PRINT_CODE MACRO CODE MOV DL, CODE MOV AH,2 INT 21H ENDM

Β τρόπος - συνέχεια INC CL MOV AL,CL XLAT PRINT_CODE AL INC CL MOV AL,CL XLAT PRINT_CODE AL NEW_LINE JMP START QUIT: EXIT POWER ENDP CODE ENDS END POWER MACRO NEW-LINE MOV DL, OAH MOV AH, 2 INT 2IH MOV DL, ODH MOV AH, 2 INT 2IH END M

Έλεγχος Ορθής Λειτουργίας IC 7400 (4 πύλες NAND) DATA_SEG SEGMENT TRUTH_TABLE DW 0F00H, 0FAAH, 0F55H, 00FFH MSG1 DB 0AH, 0DH, Το ολοκληρωμένο λειτουργεί κανονικά$ MSG2 DB 0AH, 0DH, Το ολοκληρωμένο παρουσιάζει προβλήματα$ DATA_SEG ENDS CODE_SEG SEGMENT ASSUME CS: CODE_SEG, DS: DATA_SEG, ES: DATA_SEG MAIN PROC FAR MOV DX, DATA_SEG MOV DS, DX MOV ES, DX MOV CX, 4 ΕΞΟΔΟΣ ΕΙΣΟΔΟΣ 0000 1111 0000 0000 0000 1111 1010 1010 0000 1111 0101 0101 0000 0000 1111 1111 ΠΟΡΤΑ ΕΞΟΔΟΥ 10H 7400 MSB ΠΟΡΤΑ ΕΙΣΟΔΟΥ 20H LSB

Έλεγχος Ορθής Λειτουργίας IC 7400 MOV SI, OFFSET TRUTH_TABLE CHECK: LODSW ; Φορτώνεται π.χ. AH = 0Fh και AL = 00h OUT 10H, AL ; AH = 0Fh AL = AAh IN AL, 20H ; AH = 0Fh AL = 55h AND AL, 0FH ; Κρατάμε όσα bit εισάγονται CMP AH, AL ; AH = 00h AL = FFh JNZ ERROR LOOP CHECK MOV DX, OFFSET MSG1 ; Μήνυμα ορθής λειτουργίας MOV AH, 9 INT 21H JMP END ERROR: MOV DX, OFFSET MSG2 ; Μήνυμα σφάλματος MOV AH, 9 INT 21H END: MOV AX, 4C00H INT 21H MAIN ENDP CODE_SEG ENDS END MAIN

Μετρητής up/down σε PC Να γραφεί το πρόγραμμα SIMUL σε ένα προσωπικό υπολογιστή και σε Assembly 8088 που να εξομοιώνει τη λειτουργία ενός δυαδικού μετρητή up-down των 8 bit με τις παρακάτω προδιαγραφές: Το πρόγραμμα να ξεκινάει με την αρχική τιμή του μετρητή που πρέπει να δίνεται στην εκκίνηση του προγράμματος και να εμφανίζει το μήνυμα: GIVE 8 BITS: και να αναμένει (αρχίζοντας από το MSB) ένα δυαδικό αριθμό των 8 bit τον οποίον να τυπώνει σε δυαδική μορφή. Ως επόμενο βήμα να αναμένει το πάτημα του πλήκτρου C και τότε να εμφανίζει στην επόμενη γραμμή της οθόνης το μήνυμα με την τιμή του μετρητή: COUNTER=bbbbbbbb Στη συνέχεια o μετρητής αυξάνει με το πάτημα του χαρακτήρα 1 και ελαττώνεται με το 0, ενώ η νέα τιμή του τυπώνεται κάθε φορά στην ίδια θέση χωρίς αλλαγή γραμμής. Στο σημείο αυτό αν πατηθεί το πλήκτρο Q να τερματίζει. Μπορείτε να κάνετε χρήση των macros READ, PRINT, PRINT_STR και EXIT. Επίσης δίνεται ότι η εκτύπωση του ASCII χαρακτήρα 08 προκαλεί κίνηση μιας θέσης πίσω του δρομέα στην οθόνη.

Κώδικας Μετρητή up/down DATA SEGMENT MS1 DB "GIVE 8 BITS:",0AH,ODH, $ MS2 DB "COUNTER=$" MS3 DB 08,08,08,08,08,08,08,08, $ DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX START: PRINT_STR MS1 MOV CX,8 MOV BL,0 X1: READ ; Ανάγνωση των 8-bit MOV BH,0 ;της αρχικής τιμής CMP AL,'0' JE X2 MOV BH,1 CMP AL,'1' JE X2 JMP X1 X2: PRINT AL ; Εκτύπωση ενός bit SHL BL,1 ; της 8-bit αρχικής τιμής ADD BL,BH ; Στον BL σχηματίζεται ο LOOP X1 ; 8-bit αριθμός X3: READ CMP AL,'C ; Έλεγχος πατήματος JNE X3 ; πλήκτρου C PRINT_STR MS2 CALL DISPLAY ; Εκτύπωση counter X4: READ CMP AL,'Q' JE QUIT CMP AL,'0 ; Έλεγχος 0 JNE X5 DEC BL ; Ελάττωση counter CALL DISPLAY X5: CMP AL,'1' ; Έλεγχος 1 JNE X4 INC BL ; Αύξηση counter CALL DISPLAY JMP X4 QUIT: EXIT MAIN ENDP DISPLAY PROC NEAR ; ρουτίνα εκτύπωσης MOV CX,8 ; 8-bit του καταχ. BL MOV BH,BL X6: SHL BH,1 MOV DL,0 ADC DL,30H PRINT DL LOOP X6 PRINT_STR MS3 ;επιστροφή δρομέα RET DISPLAY ENDP CODE ENDS END START

Μετρητής δυαδικών μονάδων Σε ένα με 80x86 να γραφεί πρόγραμμα που να μετράει: Αριθμό δυαδικών μονάδων όλων των δεδομένων που είναι οργανωμένα κατά bytes και βρίσκονται στην περιοχή της μνήμης από DS:0000 Hex έως DS:[BX]. Το αποτέλεσμα να επιστρέφεται μέσω του καταχωρητή AX. Αν έχουμε υπερχείλιση να εφαρμοστεί η τεχνική του κόρου.

Κώδικας Μετρητή δυαδικών μονάδων CODE SEGMENT ASSUME CS:CODE MOV BP,0 ; αρχικοποίηση αρχής διευθύνσεων MOV AX,0 ; αρχικοποίηση μετρητή X0: MOV DX, PTR WORD[BP] ; μεταφέρω 16-bit MOV CX,16 ; μετρώ τις μονάδες X1: ROR DX JNC X2 ; αν το bit είναι 1 INC AX ; αυξάνω το μετρητή JNOV X2 ; αν δεν έχω υπερχείλιση ΟΚ MOV AX, 0FFFFH ; αλλιώς κόρος X2: LOOP X1 ; και επαναλαμβάνω CMP BX,BP ; σάρωσε όλες τις διευθύνσεις? JE X3 ; αν ΝΑΙ τερματισμός INC BP ; ΟΧΙ JMP X0 ; συνεχίζουμε X3: EXIT ; τερματισμός CODE ENDS END

Δυαδικός σε οκταδική μορφή DATA SEGMENT MS1 DB "GIVE 16 BITS:",0AH,ODH, $ MS2 DB X=$" DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX START: PRINT_STR MS1 MOV CX,16 MOV DX,0 X1: READ ; Ανάγνωση των 16bit CMP AL, Q JE QUIT MOV BH,0 CMP AL,'0' JE X2 MOV BH,1 CMP AL,'1' JE X2 JMP X1 X2: PRINT AL ; Εκτύπωση ενός bit SHL DX,1 ADD DL,BH ;Στον DX σχηματίζεται ο LOOP X1 ;16bit αριθμός X3: READ CMP AL,'C'; Έλεγχος C JNE X3 PRINT_STR MS2 MOV CX,6 X4: SHL DX,1 SHL DX,1 SHL DX,1 MOV BX,DX AND BX,0007H PRINT_DEC BX LOOP X4 QUIT: EXIT MAIN ENDP CODE ENDS END START

Αφαίρεση και συμπίεση κενών κειμένου Δίνεται σειρά χαρακτήρων ASCII που αρχίζει από τη διεύθυνση που δείχνει ο καταχωρητής DX. Το πρώτο στοιχείο (word των 2 bytes) είναι το πλήθος των χαρακτήρων. Ζητείται: 1. Να προσδιοριστεί ο αριθμός των κενών (space 20H). 2. Να αφαιρεθούν από το κείμενο και αυτό να συμπιεστεί και να επανα-εγγραφεί στην ίδια θέση με το αρχικό.

Κώδικας αφαίρεσης & συμπίεσης κενών CODE SEGMENT ASSUME CS:CODE MOV BX, 0 ; μετρητής χαρακτήρων space 20H MOV CX, [DX] ; πλήθος ASCII χαρακτήρων INC DX INC DX ; Διεύθυνση επόμενου ASCII χαρακτήρα MOV BP, DX ; μετρητής διευθύνσεων συμπιεσμένου πίνακα X0: MOV AL, [DX] ; Διαβάζω διαδοχικά τους χαρακτήρες INC DX ; Διεύθυνση επόμενου ASCII χαρακτήρα CMP AL, 20H ; Συγκρίνω αν είναι space JNE X1 ; Έλεγχος. Αν δεν είναι space X1 INC BX ; Αλλιώς αυξάνω μετρητή χαρακτήρων space και JMP X2 ; παρακάμπτω X1: MOV [BP], AL ; επανεγγράφω στον συμπιεσμένο πίνακα INC BP ; Διεύθυνση επόμενης θέσης συμπιεσμένου πίνακα X2: LOOP X0 ; Επαναλαμβάνω μέχρι να εξαντληθούν όλοι οι χαρακτήρες MOV CX, BX ; Μηδενίζω τις υπόλοιπες θέσεις του αρχικού πίνακα X3: MOV [BP], 0 ; με βάση το μετρητή χαρακτήρων space INC BP LOOP X3 ; Επαναλαμβάνω EXIT CODE ENDS END

Να γραφεί το πρόγραμμα SIMUL σε Assembly 80x86 που να εξομοιώνει τη λειτουργία πύλης AND ή OR 8 εισόδων Από τα 8 bit της θύρας εισόδου PORT_ IN (Διευθ.:2100H) να δέχεται τα δεδομένα εισόδου των πυλών και να εξάγει το αποτέλεσμα από το ελάχιστης αξίας bit της θύρας PORT_OUT (Διεύθ.: 4100H) για την πύλη AND ή για την πύλη OR ανάλογα με την πύλη που εξομοιώνουμε. Η εξομοίωση να είναι συνεχής. Θεωρούμε πως η εξομοίωση γίνεται πάνω σε ένα προσωπικό υπολογιστή, που βασίζεται στον με 8088. Το πρόγραμμα να ξεκινάει με το μήνυμα: ΔΩΣΕ ΕΝΑ ΧΑΡΑΚΤΗΡΑ: AND(A) OR(O) QUIT(Q) Οποιαδήποτε στιγμή αν πατηθεί το πλήκτρο A να εμφανίζεται στην επόμενη γραμμή της οθόνης το μήνυμα "AND SIMULATION" και με το πλήκτρο O το μήνυμα "OR SIMULATION" και φυσικά να ξεκινάει η αντίστοιχη εξομοίωση. Ενώ "τρέχει" μια εξομοίωση να μπορεί να μετάγεται στην άλλη με το πάτημα του αντίστοιχου πλήκτρου εμφανίζοντας στη θέση του παλιού μηνύματος το νέο. Με το πλήκτρο Q να επιστρέφει στο DOS δίνοντας το μήνυμα "END OF SIMULATION". Το πάτημα οποιουδήποτε άλλου πλήκτρου να είναι αδιάφορο. Υπόδειξη: Να γίνει χρήση της διακοπής INT 21H/0BH που επιτρέπει έλεγχο του πληκτρολογίου χωρίς να διακόπτει τη συνεχή εξομοίωση σε κλειστό βρόχο. Αν πατήθηκε πλήκτρο (AL=FFH) τότε μόνο θα γίνει έλεγχος του πλήκτρου (INT 21H/08H) για να ακολουθήσει η αντίστοιχη λειτουργία.

ΠΡΟΓΡΑΜΜΑ ΕΞΟΜΟΙΩΣΗΣ ΠΥΛΩΝ ΣΕ PC DATA SEGMENT MS1 DB "ΔΩΣΕ ΕΝΑ ΧΑΡΑΚΤΗΡΑ: AND(A) OR(N) DB QUIT(Q)",0AH,ODH, $ MS2 DB "AND SIMULATION",0AH,ODH, $ MS3 DB OR SIMULATION",0AH,ODH, $ MS4 DB END OF SIMULATION", $ DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK PORT_IN EQU 2100H PORT_OUT EQU 4100H MOV AX,DATA MOV DS,AX START: PRINT_STR MS1 X1: MOV AH, 08H INT 21H CMP AL, A JE AND CMP AL, O JE OR CMP AL, Q JE QUIT JMP X1 AND: PRINT_STR MS2 ; Εξομοίωση AND AND1: MOV DX, PORT_IN IN AL, DX CMP AL, 0FFH JNE AND2 MOV AL, 01H JMP AND3 AND2: MOV AL, 00H AND3: MOV DX, PORT_OUT OUT DX, AL MOV AH, 0BH INT 21H CMP AL,0FFH JE X1 ; Πατήθηκε πλήκτρο JMP AND1 OR: PRINT_STR MS3 ; Εξομοίωση OR OR1: MOV DX, PORT_IN IN AL, DX CMP AL, 0H JE OR2 MOV AL, 01H JMP OR3 OR2: MOV AL, 00H OR3: MOV DX, PORT_OUT OUT DX, AL MOV AH, 0BH INT 21H CMP AL,0FFH JE X1 ; Πατήθηκε πλήκτρο JMP OR1 QUIT: PRINT_STR MS4 EXIT CODE ENDS END

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα» του ΕΜΠ έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.