Εργαστηριακές ασκήσεις

1. Αθροίζοντας αριθμούς

  1. Ανοίξτε παράθυρο εντολών (run - command) ή φορτώστε το λειτουργικό σύστημα MS-DOS
  2. Δώστε την εντολή debug
    C:>debug
    
  3. Δώστε την εντολή Α (assemble)
    -a
    
  4. Γράψτε τις συμβολικές εντολές (mov ax, 0) κλπ. Οι διευθύνσεις μνήμης εμφανίζονται μόνες τους. Τα σχόλια που ακολουθούν το ; δε χρειάζεται να γραφούν.
    0C20:0100 mov ax,0		; Βάλε (move) στον καταχωρητή ΑΧ την τιμή 0
    0C20:0103 mov bx,0		; Βάλε (move) στον καταχωρητή ΒΧ την τιμή 0 
    0C20:0106 add bx, ax		; Πρόσθεσε στον ΒΧ τον ΑΧ
    0C20:0108 inc ax		; Αύξησε (increment) τον ΑΧ κατά 1
    0C20:0109 cmp ax, a		; Σύγκρινε (compare) τον ΑΧ με το 10
    0C20:010C jbe 106		; 'Αλμα αν το αποτέλεσμα είναι μικρότερο ή ίσο (jump below or equal) στη διεύθυνση 106
    0C20:010E int 3			; Διακοπή της λειτουργίας
    0C20:010F			; Πατήστε ENTER εδώ
    
  5. Δείτε την κωδικοποίηση των εντολών με την εντολή U (unassemble):
    -u100
    Διεύθυνση Κωδικοποίηση  Συμβολική εντολή
    0C20:0100 B80000        MOV     AX,0000
    0C20:0103 BB0000        MOV     BX,0000
    0C20:0106 01C3          ADD     BX,AX
    0C20:0108 40            INC     AX
    0C20:0109 3D0A00        CMP     AX,000A
    0C20:010C 76F8          JBE     0106
    0C20:010E CC            INT     3
    
  6. Εκτελέστε το πρόγραμμά σας και εξετάστε το αποτέλεσμα στον καταχωρητή ΒΧ. Είναι αυτό που περιμένατε;
    -g=100
    
    AX=000B  BX=0037  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C20  ES=0C20  SS=0C20  CS=0C20  IP=010E   NV UP EI PL NZ NA PO NC
    0C20:010E CC            INT     3
    
  7. Εκτελέστε το πρόγραμμά σας βήμα βήμα με την εντολή T (trace):
    -t=100
    AX=0000  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Καταχωρητές
    
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0103   NV UP EI PL ZR NA PE NC
                                        ^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^
    				    |         Ενδείκτες διακλάδωσης
    				    Μετρητής προγράμματος
    
    0C1C:0103 BB0000        MOV     BX,0000
         ^^^^               ^^^^^^^^^^^^^^^
         Διεύθυνση μνήμης   Επόμενη εντολή που θα εκτελεστεί
    -t
    
    AX=0000  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0106   NV UP EI PL ZR NA PE NC
    0C1C:0106 01D8          ADD     AX,BX
    -t
    
    AX=0000  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0108   NV UP EI PL ZR NA PE NC
    0C1C:0108 40            INC     AX
    -t
    
    AX=0001  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0109   NV UP EI PL NZ NA PO NC
    0C1C:0109 3D0A00        CMP     AX,000A
    -t
    
    AX=0001  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=010C   NV UP EI NG NZ AC PO CY
    0C1C:010C 76F8          JBE     0106
    -t
    
    AX=0001  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=0106   NV UP EI NG NZ AC PO CY
    0C1C:0106 01D8          ADD     AX,BX
    
    ...
    
  8. Αυξήστε το όριο της άθροισης από 10 σε 100:
    -a109
    0C20:0109 cmp ax, 64		; Σύγκρινε τον καταχωρητή ΑΧ με το 100
    0C20:010C			; Πατήστε ENTER εδώ
    -g=100
    
  9. Εκτελέστε το πρόγραμμά σας και εξετάστε το αποτέλεσμα στον καταχωρητή ΒΧ. Είναι αυτό που περιμένατε;
    AX=0065  BX=13BA  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C20  ES=0C20  SS=0C20  CS=0C20  IP=010E   NV UP EI PL NZ NA PO NC
    0C20:010E CC            INT     3
    
  10. Βγήτε από το πρόγραμμα debug
    -q
    C:>
    

2. Εμφάνιση των χαρακτήρων του πίνακα ASCII

  1. Γράψτε το πρόγραμμα:
    C:\>debug
    -a
    0C1C:0100 mov dl,20		; Πρώτος χαρακτήρας ASCII (το κενό)
    0C1C:0102 mov ah,2		; Εντολή για εμφάνιση του χαρακτήρα στην οθόνη
    0C1C:0104 int 21		; Εκτέλεση της εντολής του DOS
    0C1C:0106 add dl,1		; Αύξησε το χαρακτήρα κατά 1
    0C1C:0109 cmp dl,80		; Είναι ο τελευταίος; (128)
    0C1C:010C jne 102		; Αν όχι πήγαινε στη διεύθυνση 102 (jump not equal)
    0C1C:010E int 3			; Διακοπή του προγράμματος
    0C1C:010F			; Πατήστε ENTER εδώ
    
  2. Δείτε την κωδικοποίηση των εντολών με την εντολή U (unassemble):
    -u100
    0C1C:0100 B220          MOV     DL,20
    0C1C:0102 B402          MOV     AH,02
    0C1C:0104 CD21          INT     21
    0C1C:0106 80C201        ADD     DL,01
    0C1C:0109 80FA80        CMP     DL,80
    0C1C:010C 75F4          JNZ     0102
    0C1C:010E CC            INT     3
    
  3. Εκτελέστε το πρόγραμμά σας και δείτε το αποτέλεσμα στην οθόνη σας.
    -g=100
     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
    pqrstuvwxyz{|}~¦
    AX=027F  BX=0000  CX=0000  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
    DS=0C1C  ES=0C1C  SS=0C1C  CS=0C1C  IP=010E   NV UP EI PL ZR NA PE NC
    0C1C:010E CC            INT     3
    

3. Συνεχίζοντας

Δοκιμάστε να γράψετε και να εκτελέσετε και άλλα μικρά προγράμματα ή παραλλαγές αυτών που γράψατε.