Θ. Ζαχαριάδης Αν. Καθηγητής Λ. Σαράκης Καθ. Εφαρμογών
CMP REG, memory memory, REG REG, REG memory, immediate REG, immediate Compare. operand1 - operand2 result is not stored anywhere, flags are set (OF, SF, ZF, AF, PF, CF) according to result. Example: MOV AL, 5 MOV BL, 5 CMP AL, BL ; AL = 5, ZF = 1 (so equal!)
JMP label 4-byte address or 2-byte address Unconditional Jump. Transfers control to another part of the program. 4-byte address may be entered in this form: 1234h:5678h, first value is a segment second value is an offset. If the jump refers to some address in the current segment, only the 2-byte address offset is needed (the segment number can be omitted) always jump Example: Cs:0100 mov al,0 Cs:0102 mov ah,08 Cs: 0104 inc bx Cs: 0105 jmp 0100
JA label Short Jump if first operand is Above second operand (as set by CMP instruction). Unsigned. if (CF = 0) and (ZF = 0) then jump JBE label Short Jump if first operand is Below or Equal to second operand (as set by CMP instruction). Unsigned. if CF = 1 or ZF = 1 then jump
JC (JB) label Short Jump if Carry flag is set to 1. if CF = 1 then jump JNC(JNB) label Short Jump if Carry flag is set to 0. if CF = 0 then jump
JZ (JE) label l Short Jump if Zero (equal). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. if ZF = 1 then jump JNZ (JNE) label Short Jump if Not Zero (not equal). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. if ZF = 0 then jump
Να προσδιοριστεί ο μεγαλύτερος από 2 αριθμούς οι οποίοι είναι αποθηκευμένοι στις θέσεις μνήμης 00 και 01 και να τοποθετηθεί στη θέση μνήμης 02 Start: Mov ah,[0] Mov bh, [1] Cmp ah,bh JΒΕ label1 Mov [2], bh Jmp End Label1: Mov [2],ah End: Νop ; Τέλος προγράμματος ;σύγκρινε τους 2 αριθμούς ;αν ο πρώτος είναι μεγαλύτερος αποθήκευσέ τον ;ειδάλλως αποθήκευσε τον δεύτερο ;Πήγαινε στο τέλος προγράμματος Νop Jmp Start ; Π.χ. για επανάληψη: Πήγαινε στην αρχή
Να προσδιοριστεί ο μεγαλύτερος από 2 αριθμούς οι οποίοι είναι αποθηκευμένοι στις θέσεις μνήμης 00 και 01 και να τοποθετηθεί στη θέση μνήμης 02 Start: Mov ah,[0] Mov bh, [1] Cmp ah,bh ;σύγκρινε τους 2 αριθμούς JΒΕ label1 ;αν ο πρώτος είναι <= αποθήκευσέ τον 2o Mov [2], ah ;ειδάλλως αποθήκευσε τον δεύτερο Jmp End ;Πήγαινε στο τέλος προγράμματος Label1:Mov [2],bh End: Νop ; Τέλος προγράμματος
Να προσδιοριστεί ο μεγαλύτερος από ένα σύνολο αριθμών των 8bits. Το πλήθος των αριθμών βρίσκεται στη θέση 1 και οι αριθμοί αρχίζουν από τη θέση 2. Το αποτέλεσμα να αποθηκεύεται στη θέση 0. Mov ch, [1] ; Αποθήκευσε το πλήθος των αριθμών στον ch Mov cl,0 στον cl ; Κράτα το πλήθος των μέχρι τώρα επαναλήψεων (αριθμών που έχουν ελεγχθεί) Mov bx, 2 ; Χρησιμοποίησε τον bx ως δείκτη για διάβασμα της μνήμης, αρχικοποίησε σε 2 Mov ah,0 ; Χρησιμοποίησε τον ΑΗ για να αποθηκεύεις τον μεγαλύτερο αριθμό μετά από κάθε σύγκριση Label1: inc cl ; Αύξησε τον αριθμό των επαναλήψεων κατά 1 Mov al, ds:[bx] ; Διάβασε αριθμό από θέση μνήμης. Ο ΑL κρατά πάντα τον τρέχοντα αριθμό Cmp ah,al ; Σύγκρινε με τον μέχρι στιγμής μεγαλύτερο (αποθηκευμένος στον AH) Ja Label2 επανάληψη ; Αν ο ΑΗ παραμένει μεγαλύτερος τότε πήγαινε label2 & ξεκίνα καινούργια Mov ah, al ; Ειδάλλως, αν ο τρέχον αριθμός είναι μεγαλύτερος ανανέωσε τον ΑΗ Label 2: Inc bx ; Ετοιμάσου να διαβάσεις από επόμενη διεύθυνση Cmp ch,cl ; Σύγκρινε αν έχουμε διαβάσει και ελέγξει όλους τους αριθμούς Jnz Label1 ; Αν δεν έχουν διαβαστεί όλοι οι αριθμοί επανάλαβε τον βρόγχο mov [0], ah ; Αν τελειώσαμε, αποθήκευσε το αποτέλεσμα στην θέση μνήμης 0 Άσκηση για το σπίτι: Να προσαρμοστεί το παραπάνω πρόγραμμα έτσι ώστε αντί να κρατάτε το πλήθος των αριθμών που έχουν ελεγχθεί (δηλ. πλήθος επαναλήψεων στον καταχωρητή CL), να κρατάτε το πλήθος των αριθμών που δεν έχουν ακόμα ελεγχθεί (υπόδειξη: να χρησιμοποιήσετε διαδοχικές μειώσεις κατά 1 του CH)
Να ταξινομηθούν κατά αύξουσα σειρά οι 8 αριθμοί του ενός byte που βρίσκονται στις θέσεις μνήμης 0 7. Παρακάτω η λύση με τη μέθοδο των φυσαλίδων (Bubble sort), δηλ. διαδοχικά περάσματα της ακολουθίας των αριθμών και εναλλαγή αυτών που δεν είναι σε αύξουσα σειρά. Η διαδικασία επαναλαμβάνεται έως ότου να μην υπάρχει εναλλαγή σε κάποιο πέρασμα. Mov dl,0 ;χρησιμοποίησε τον dl ως δείκτη εναλλαγής, θέσε τον σε 0 Start: Mov bx,0 ;Θέσε τον δείκτη για πρόσβαση στις θέσεις μνήμης Mov ah,[bx] ;διάβασε τον πρώτο αριθμό Mov al,7 ;θέσε τον al στον αριθμό των συγκρίσεων (7 για 8 αριθμούς) Tag1: Inc bx ;προετοίμασε τον δείκτη για πρόσβαση στην επόμενη θέση μνήμης Mov ch,[bx] ;διάβασε τον επόμενο αριθμό Cmp ah,ch ;σύγκρινέ τον με τον ah ο οποίος κρατά τον μεγαλύτερο αριθμό μέχρι και την προηγούμενη σύγκριση Jc Tag2 ;αν ο ah είναι μικρότερος πήγαινε στο Tag2 Xchg [bx-1],ch ;ειδάλλως, κάνε εναλλαγή των περιεχομένων των θέσεων μνήμης Mov [bx], ch ; [bx-1] και [bx]. Ο ch τώρα κρατάει τον μεγαλύτερο αριθμό μέχρι στιγμής Mov dl,1 ;θέσε τον δείκτη εναλλαγής σε 1 Tag2: Mov ah,ch ;μετάφερε στον ah τον μεγαλύτερο μέχρι στιγμής αριθμό Dec al ;έλεγξε αν έχουν γίνει όλες οι συγκρίσεις σε αυτό το πέρασμα Jnz Tag1 ;αν όχι πήγαινε στο Tag1 και συνέχισε τις συγκρίσεις για αυτό το πέρασμα Dec dl ;αν οι συγκρίσεις για αυτό το πέρασμα ολοκληρώθηκαν, έλεγξε τον δείκτη εναλλαγής Jz Start ;αν υπήρξε κάποια εναλλαγή στο προηγούμενο πέρασμα ξεκίνα καινούργιο πέρασμα End: Nop ;αν όχι, τέλος προγράμματος οι αριθμοί έχουν ταξινομηθεί σε αύξουσα σειρά