Εικονογραφημένο σεμινάριο για το Assembler. Οδηγίες Αριθμητικής Συναρμολόγησης

Ομάδα ADC(Προσθήκη με Μεταφορά) ανήκει στην ομάδα ακέραιες εντολέςδυάδικος)αριθμητική (Δυαδικές Αριθμητικές Οδηγίες) και εκτελεί την ακέραια προσθήκη δύο υπογεγραμμένων ή ανυπόγραφων τελεστών ( DESTΚαι SRC) Και φέρουν σημαία EFLAGS.CF . Πρώτος τελεστής ( τελεστή προορισμού, DEST) μπορεί να είναι μια μεταβλητή σε έναν καταχωρητή ή στη μνήμη ( , r16, r32 , r/m8, r/m16, r/m32). Δεύτερος τελεστής ( τελεστής πηγής, SRC) - άμεσο νόημα ( imm8, imm16, imm32), μια μεταβλητή σε έναν καταχωρητή ή στη μνήμη. Σε αυτήν την περίπτωση, και οι δύο τελεστές δεν μπορούν να είναι ταυτόχρονα μεταβλητές στη μνήμη.

Αποτέλεσμα προσθήκης με εντολή ADCτοποθετείται στη θέση του πρώτου τελεστή ( DEST). Οι σημαίες στο μητρώο EFLAGS ορίζονται σύμφωνα με το αποτέλεσμα.

Όταν προσθέτετε μια άμεση τιμή imm8ή imm16με έναν τελεστή δύο ή τεσσάρων byte, η άμεση τιμή επεκτείνεται πρώτα στο μέγεθος του πρώτου τελεστή και μόνο τότε εκτελείται η προσθήκη.

Ομάδα ADCσυνήθως χρησιμοποιείται σε multibyte ή multiword ( πολυλεκτική) εργασίες προσθήκης. Σε αυτήν την περίπτωση, ακολουθεί την εντολή ADD, η οποία επιστρέφει το άθροισμα των δυαδικών ψηφίων χαμηλής τάξης των τελεστών πολλών byte (πολλαπλών λέξεων), επιτρέποντας να λαμβάνεται υπόψη η μεταφορά κατά την προσθήκη των bit υψηλής τάξης. Για παράδειγμα:

mov edx, 0 ; EDX = 0
mov eax, 0FFFFFFFFh ; Το πρώτο πρόσθετο 32-bit τοποθετείται στο EAX
προσθήκη eax, 0FFFFFFFFh ; δεύτερη προσθήκη 32-bit - 0x FFFFFFFFh, προσθέτουμε δύο τελεστές 32-bit
adc edx, 0 ; EDX = EDX + CF, λάβετε υπόψη τη μεταφορά
; EDX:EAX = 0000000lh:FFFFFFFEh - το αποτέλεσμα 64 bit

Ομάδα ADCεπιτρέπει τον χειρισμό ακέραιων τελεστών όπως στο ανυπόγραφη μορφή, και στο υπογεγραμμένη μορφή. Κατά την προσθήκη δεδομένων με πρόσημο σημάδι σημαίαΤο EFLAGS.SF θα αντικατοπτρίζει το πρόσημο του ληφθέντος αποτελέσματος. Σημαία υπερχείλισηςΤο EFLAGS.OF θα οριστεί σε 1 εάν, κατά την προσθήκη υπογεγραμμένων ακέραιων τιμών που αντιπροσωπεύονται στο συμπλήρωμα δύο ή στο συμπλήρωμα δύο, συμβεί υπερχείλιση (που μεταφέρεται από το πιο σημαντικό bit στο οποίο αντιστοιχεί το bit που προηγείται του bit πρόσημου), δηλαδή το Το προκύπτον αποτέλεσμα υπερβαίνει το διαθέσιμο μέγεθος του τελεστή - ραντεβού ( DEST). Ουσιαστικά, αυτό είναι παρόμοιο με το πώς η σημαία EFLAGS.CF αντικατοπτρίζει την υπερχείλιση (μεταφορά) κατά την προσθήκη ανυπόγραφοι τελεστές. Για παράδειγμα, όταν προσθέτετε δύο τιμές 32-bit που αντιπροσωπεύονται σε αντίστροφο κώδικα, μπορεί να μοιάζει με αυτό:

mov eax, τελεστής1 ; EAX = τελεστής1, η πρώτη προσθήκη 32 bit τοποθετείται στο EAX
προσθέστε eax, τελεστή2 ; προσθέτουμε δύο τελεστές 32-bit σε αντίστροφο κώδικα
σε ; μεταπηδήστε για να διακόψετε τον χειριστή σε περίπτωση υπερχείλισης

adc eax, 0 ; EAX = EAX + CF, λάβετε υπόψη τη μεταφορά (απαραίτητη για προσθήκη σε αντίστροφο κωδικό)
; EAX = τελεστής1 + τελεστής2 - το αποτέλεσμα της πρόσθεσης σε αντίστροφο κώδικα
jns m1; μετάβαση εάν το αποτέλεσμα είναι θετικό
xor eax, 7FFFFFFFFh ; μετατροπή της αρνητικής τιμής σε EAX σε ευθύ κωδικό
m1: ; EAX - το αποτέλεσμα της προσθήκης σε άμεσο κωδικό

Βοηθητική σημαίαπρόσθετος)ΜΕΤΑΦΟΡΑΤο EFLAGS.AF βοηθά στον χειρισμό δεδομένων σε μορφή BCD ( συσκευασμένη μορφή BCD). Ρυθμίζεται εάν, κατά τη διάρκεια της προσθήκης, συμβεί μια μεταφορά από το χαμηλό τετράδιο στο υψηλό τετράδιο του χαμηλού byte του αποτελέσματος. Χρησιμοποιώντας την εντολή DAA αμέσως μετά την εντολή ADC, είναι δυνατή η παραγωγή του λεγόμενου δεκαδική διόρθωσητο αποτέλεσμα της πρόσθεσης και πάρτε το άθροισμα στο ίδιο συσκευασμένη μορφή BCD, καθώς και οι αρχικοί όροι.

Ομάδα ADCμε τελεστή προορισμού ( DEST), που είναι μια μεταβλητή μνήμης, μπορεί να χρησιμοποιηθεί σε συνδυασμό με το πρόθεμα κλειδώματος LOCK, το οποίο θα εξασφαλίσει την ατομική εκτέλεση της εντολής.

Εντολές προσθήκης - ADD, ADC

Οι οδηγίες ADD (add) και ADC (add with carry) μπορούν να προσθέσουν τελεστές 8 και 16 bit.

Η εντολή ADD προσθέτει τα περιεχόμενα του τελεστή προέλευσης και του τελεστή προορισμού και τοποθετεί το αποτέλεσμα στον τελεστή προορισμού.

Μορφή εντολών: ADD δέκτης, πηγή

Σε συμβολική σημειογραφία, οι ενέργειές του μπορούν να περιγραφούν ως εξής: νεροχύτης:= νεροχύτης + πηγή (το άθροισμα των περιεχομένων του νεροχύτη και της πηγής γράφεται στο νεροχύτη).

Η εντολή ADC κάνει το ίδιο με την εντολή ADD, αλλά προσθέτει όχι δύο, αλλά τρεις όρους: τον προορισμό, την πηγή και τη σημαία μεταφοράς.

Μορφή εντολών: Δέκτης ADC, πηγή + CF

Σε συμβολική σημειογραφία, οι ενέργειές του μπορούν να περιγραφούν ως:

νεροχύτης:= νεροχύτης + πηγή + περιεχόμενο σημαίας μεταφοράς.

Η μεταφορά κατά την προσθήκη δυαδικών αριθμών είναι παρόμοια με τη μεταφορά κατά την προσθήκη δεκαδικών αριθμών σε μια στήλη. Όταν ο υπολογιστής προσθέτει δυαδικούς αριθμούς και το άθροισμα δεν χωράει στον τελεστή προορισμού, δημιουργείται μια μεταφορά. Όπως γνωρίζετε, ένας καταχωρητής 8-bit μπορεί να περιέχει τιμές χωρίς υπογραφή στην περιοχή από 0 έως 255. Εάν, για παράδειγμα, εκτελέσουμε τη δυαδική πρόσθεση των αριθμών 250 και 10, θα έχουμε το ακόλουθο αποτέλεσμα:

1111 1010; δυαδική αναπαράσταση του αριθμού 250.

0000 1010 ; δυαδική αναπαράσταση του αριθμού 10.

1 0000 0100; δυαδική αναπαράσταση του αθροίσματος ίσο με 260.

Το αποτέλεσμα είναι σωστό, αλλά καταλαμβάνει 9 δυαδικά bit. Εάν χρησιμοποιήθηκαν καταχωρητές 8 bit, τότε τα κατώτερα 8 bit θα εισαχθούν στον καταχωρητή προορισμού και το ένατο bit στη σημαία μεταφοράς CF.

Τώρα καταλαβαίνουμε γιατί ο μικροεπεξεργαστής 8086 έχει δύο διαφορετικές οδηγίες προσθήκης. Ένα από αυτά (ADD) μπορεί να προσθέσει τιμές που αντιπροσωπεύονται από byte ή λέξεις, καθώς και τα χαμηλότερα μέρη τιμών υψηλής ακρίβειας. Μια άλλη οδηγία (ADC) χρησιμοποιείται για την προσθήκη τιμών υψηλής ακρίβειας.

Οι τελεστές που θα προστεθούν μπορεί να είναι στη μνήμη, σε καταχωρητή ή να έχουν άμεση τιμή. Για παράδειγμα:

ΠΡΟΣΘΗΚΗ AX,MEM_WORD; προσθέστε τα περιεχόμενα ενός κελιού μνήμης σε έναν καταχωρητή,

ΠΡΟΣΘΗΚΗ MEM_WORD,AX; ή αντίστροφα, προσθέστε τα περιεχόμενα του καταχωρητή στο κελί μνήμης.

ΠΡΟΣΘΗΚΗ AL, 10; προσθέστε μια σταθερά στα περιεχόμενα του μητρώου.

ΠΡΟΣΘΗΚΗ MEM_BYTE,8H; προσθέστε τη σταθερά και τα περιεχόμενα του κελιού μνήμης.

Οι περισσότεροι πιθανοί συνδυασμοί επιτρέπονται, αλλά ειναι ΑΠΑΓΟΡΕΥΜΕΝΟπροσθέστε τα περιεχόμενα δύο κελιών μνήμης ή χρησιμοποιήστε μια άμεση τιμή (αριθμός) ως δέκτη.

Οι εντολές ADD και ADC μπορούν να επηρεάσουν τις ακόλουθες έξι σημαίες:

φέρουν σημαίαΤο CF είναι 1 εάν το αποτέλεσμα της πρόσθεσης δεν ταιριάζει στον τελεστή προορισμού, διαφορετικά είναι 0.

σημαία ισοτιμίαςΤο PF είναι 1 εάν το αποτέλεσμα έχει ζυγό αριθμό bit με την τιμή 1, διαφορετικά είναι 0.

Το AF είναι ίσο με 1 εάν το αποτέλεσμα της πρόσθεσης δεκαδικών αριθμών απαιτεί διόρθωση.

μηδενική σημαίαΤο ZF είναι 1 αν το αποτέλεσμα είναι 0.

σημάδι σημαίαΤο SF είναι 1 εάν το αποτέλεσμα είναι αρνητικό (το πιο σημαντικό bit είναι 1), διαφορετικά είναι 0.

σημαία υπερχείλισηςΤο OF είναι ίσο με 1 εάν το άθροισμα δύο αριθμών του ίδιου πρόσημου υπερβαίνει το εύρος των αποδεκτών τιμών του δέκτη στον αντίστροφο κωδικό και ο ίδιος ο δέκτης αλλάζει πρόσημο. Διαφορετικά, η σημαία OF είναι 0.

Εντολή για αύξηση της τιμής του δέκτη κατά ένα - INC

Ομάδα INC(προσαύξηση) προσθέτει 1 στα περιεχόμενα ενός καταχωρητή ή κελιού μνήμης, αλλά σε αντίθεση με την εντολή ADD, δεν επηρεάζει τη σημαία μεταφοράς CF. Μορφή εντολών: Δέκτης INC.

Η εντολή INC είναι χρήσιμη για την αύξηση μετρητών σε βρόχους εντολών. Μπορεί επίσης να χρησιμοποιηθεί για την αύξηση της τιμής του καταχωρητή ευρετηρίου κατά την πρόσβαση σε διαδοχικά κελιά μνήμης. Ο τελεστής ερμηνεύεται ως ανυπόγραφος αριθμός.

Για παράδειγμα:

INC CX; αυξήστε την τιμή των 16-bit

INC AL; ή καταχωρητή 8-bit ανά μονάδα.

INC MEM_BYTE; αύξηση της τιμής του byte

INC MEM_WORD; ή λέξεις μνήμης ανά μονάδα.

Δεν επιτρέπεται η χρήση άμεσης τιμής ως τελεστή.

Εντολές αφαίρεσης - SUB, και αφαίρεση με δανεισμό SBB

Της ομάδας ΥΠΟ(αφαίρεση – αφαίρεση) και SBB(αφαίρεση με δανεισμό) είναι παρόμοιες με τις εντολές πρόσθεσης ADD και ADC, αντίστοιχα, μόνο κατά την αφαίρεση, η σημαία μεταφοράς CF λειτουργεί ως σημάδι δανείου. Μορφή εντολών: SUB δέκτης, πηγή;

Η εντολή SUB αφαιρεί τον τελεστή προέλευσης από τον τελεστή προορισμού και τοποθετεί το αποτέλεσμα στον προορισμό, με συμβολικό συμβολισμό:

νεροχύτης:= καταβόθρα – πηγή.

Ομάδα SBBκάνει το ίδιο πράγμα, αλλά επιπλέον αφαιρεί την τιμή της σημαίας μεταφοράς CF από τον δέκτη:

SUB δέκτης, πηγή – CF;

Προορισμός:= νεροχύτης - πηγή - περιεχόμενο της σημαίας μεταφοράς.

Όπως και με την προσθήκη, οι οδηγίες SUB και SBB εκτελούν δύο ξεχωριστές λειτουργίες. Η πρώτη εντολή αφαιρεί αριθμούς μεγέθους byte ή λέξης, καθώς και τα bit χαμηλής τάξης των αριθμών υψηλής ακρίβειας (το τμήμα χαμηλής τάξης του αριθμού βρίσκεται στον καταχωρητή AX και το τμήμα υψηλής τάξης βρίσκεται στο μητρώο DX). Η δεύτερη εντολή αφαιρεί τα πιο σημαντικά bits αριθμών υψηλής ακρίβειας. Για παράδειγμα, η εντολή SUB AX,CX; Αφαιρεί τα περιεχόμενα του καταχωρητή CX από τα περιεχόμενα του καταχωρητή AX και επιστρέφει το αποτέλεσμα στον καταχωρητή AX.

Εάν τα μεγέθη τελεστών υπερβαίνουν τα 16 bit, τότε πρέπει να χρησιμοποιηθεί η ακόλουθη σειρά εντολών:

SUB AX,CX; Αφαιρέστε χαμηλά 16 bit.

SBB BX,DX; και μετά τα πιο σημαντικά 16 bit.

Εδώ αφαιρούμε από τον αριθμό 32 bit που τοποθετείται στους καταχωρητές AX και BX τον αριθμό 32 bit που βρίσκεται στους καταχωρητές CX και DX. Κατά την αφαίρεση των περιεχομένων του καταχωρητή DX από τα περιεχόμενα του καταχωρητή BX, η εντολή SBB λαμβάνει υπόψη τη δυνατότητα δανεισμού κατά την εκτέλεση της πρώτης αφαίρεσης.

SUB AX, MEM; Αφαιρέστε τα περιεχόμενα ενός κελιού μνήμης από έναν καταχωρητή.

SUB MEM, AX; Αφαιρέστε έναν καταχωρητή από ένα κελί μνήμης.

ΥΠΟ AL,1O; Αφαιρέστε μια σταθερά από έναν καταχωρητή.

SUB MEM_BYTE,OFh; Αφαιρέστε μια σταθερά από ένα κελί μνήμης.

Δεν είναι δυνατή η απευθείας αφαίρεσητα περιεχόμενα ενός κελιού μνήμης από ένα άλλο ή χρησιμοποιήστε την άμεση τιμή ως προορισμό.

Οι εντολές SUB και SBB μπορούν να επηρεάσουν έξι σημαίες ως εξής:

· εγκατάσταση φέρουν σημαίαΤο CF είναι 1 εάν απαιτείται δάνειο, διαφορετικά είναι 0.

· εγκατάσταση σημαία ισοτιμίαςΤο PF είναι 1 εάν το αποτέλεσμα της αφαίρεσης έχει ζυγό αριθμό bit με την τιμή 1, διαφορετικά είναι 0.

· εγκατάσταση βοηθητική σημαία μεταφοράςΤο AF είναι 1 εάν το αποτέλεσμα της δεκαδικής αφαίρεσης απαιτεί διόρθωση, διαφορετικά είναι 0.

· εγκατάσταση μηδενική σημαία ZF σε 1 αν το αποτέλεσμα είναι 0, διαφορετικά είναι 0.

· εγκατάσταση σημάδι σημαίαΤο SF είναι 1 εάν το αποτέλεσμα είναι αρνητικό (το πιο σημαντικό bit είναι 1), διαφορετικά η σημαία είναι 0.

· εγκατάσταση σημαία υπερχείλισηςΤο OF είναι 1 εάν το αποτέλεσμα της αφαίρεσης υπερβαίνει το εύρος των τιμών του δέκτη στον αντίστροφο κωδικό και ο ίδιος ο δέκτης αλλάζει πρόσημο.

Οι σημαίες SF και OF έχουν νόημα μόνο κατά την αφαίρεση υπογεγραμμένων αριθμών και η σημαία AF έχει νόημα μόνο όταν αφαιρούνται δεκαδικοί αριθμοί.

Εντολή μείωσης περιεχομένων προορισμού - DEC

Ομάδα Δέκτης DEC(μείωση) αφαιρεί 1 από τα περιεχόμενα ενός καταχωρητή ή θέσης μνήμης, αλλά (σε αντίθεση με την εντολή SUB) δεν επηρεάζει τη σημαία μεταφοράς CF.

Η εντολή DEC χρησιμοποιείται συχνά σε βρόχους για να μειώσει μια τιμή μετρητή έως ότου γίνει μηδενική ή αρνητική. Μπορεί επίσης να χρησιμοποιηθεί για τη μείωση της τιμής ενός καταχωρητή ευρετηρίου ή δείκτη κατά την πρόσβαση σε διαδοχικές θέσεις μνήμης. Για παράδειγμα:

DEC CX; Μείωση τιμής 16-bit,

DEC AL; ή καταχωρητή 8-bit.

DEC MEM_BYTE; Μείωση τιμής byte,

DEC MEM_WORD; ή κελί μνήμης λέξης.

Εντολές διαίρεσης - DIV, IDIV

Ομάδα DIV(διαίρεση - διαίρεση) εκτελεί ανυπόγραφη διαίρεση αριθμών, και την εντολή IDIV(ακέραιος διαίρεση - διαίρεση ακεραίων) εκτελεί υπογεγραμμένη διαίρεση αριθμών. Αυτές οι εντολές έχουν τη μορφή:

Πηγή DIV; Οπου πηγή- διαιρέτης μεγέθους byte ή λέξης,

Πηγή IDIV;βρίσκεται σε έναν καταχωρητή γενικού σκοπού ή θέση μνήμης.

Σημειώστε τα ακόλουθα:

1. Το μέρισμα πρέπει να έχει διπλάσιο μέγεθος σε σχέση με τον διαιρέτη.

2. Το μέρισμα πρέπει πάντα να βρίσκεται στον καταχωρητή AX (όταν διαιρείται με έναν αριθμό 8 bit) ή στους καταχωρητές DX και AX (όταν διαιρείται με έναν αριθμό 16 bit).

3. Τα αποτελέσματα της εντολής επιστρέφονται ως εξής:

· Εάν ο τελεστής πηγής είναι ένα byte, τότε το πηλίκο επιστρέφεται στον καταχωρητή AL και το υπόλοιπο στον καταχωρητή AN.

· Εάν ο τελεστής πηγής είναι λέξη, τότε το πηλίκο επιστρέφεται στον καταχωρητή AX και το υπόλοιπο στον καταχωρητή DX.

Και οι δύο εντολές αφήνουν την κατάσταση των σημαιών απροσδιόριστη, αλλά εάν το πηλίκο δεν ταιριάζει στον καταχωρητή προορισμού (AL ή AX), τότε ο μικροεπεξεργαστής δημιουργεί μια διακοπή τύπου 0 (διαίρεση με 0).

4. Η υπερχείλιση του αποτελέσματος διαίρεσης συμβαίνει υπό τις ακόλουθες συνθήκες:

· ο διαιρέτης είναι 0.

· κατά τη διαίρεση των byte χωρίς πρόσημο, το μέρισμα είναι τουλάχιστον 256 φορές το διαιρέτη.

· κατά τη διαίρεση λέξεων χωρίς πρόσημο, το μέρισμα είναι τουλάχιστον 65.536 φορές το διαιρέτη.

· κατά τη διαίρεση των bytes με ένα πρόσημο, το πηλίκο βρίσκεται εκτός του εύρους -128 έως +127.

· κατά τη διαίρεση λέξεων με πρόσημο, το πηλίκο βρίσκεται εκτός του εύρους από

32768 έως 32767.

Ακολουθούν μερικά χαρακτηριστικά παραδείγματα λειτουργιών διαίρεσης:

DIV BX; Διαιρέστε το DX:AX με το BX, ανυπόγραφο.

DIV MEM_BYTE; Διαχωρίστε το AX σε ένα byte μνήμης, χωρίς υπογραφή.

IDIV DL; Διαιρέστε το AX με το DL με ένα σημάδι.

IDIV MEM WORD; Διαχωρίστε το DX:AX σε μια υπογεγραμμένη λέξη μνήμης.

Οι οδηγίες DIV και IDIV δεν διαιρούνται απευθείας με την άμεση τιμή επειδή ο επεξεργαστής δεν μπορεί να προσδιορίσει τον τύπο δεδομένων του διαιρέτη.

Οδηγίες πολλαπλασιασμού - MUL, IMUL

Ομάδα MUL(πολλαπλασιάζω) πολλαπλασιάζει τους ανυπόγραφους αριθμούς, α IMUL(ακέραιος πολλαπλασιασμός) πολλαπλασιάζει υπογεγραμμένους ακέραιους αριθμούς. Ο πολλαπλασιαστής και ο πολλαπλασιαστής και των δύο εντολών πρέπει να είναι ο ίδιος τύπος δεδομένων, δηλαδή byte, λέξεις, διπλές λέξεις κ.λπ.

Αυτές οι εντολές έχουν την εξής μορφή:

Πηγή MUL; Οπου πηγή- μητρώο γενικού σκοπού,

Πηγή IMUL; ή ένα κελί μνήμης μεγέθους byte ή λέξης.

Ως πρώτος τελεστής (πολλαπλασιασμός), οι εντολές MUL και IMUL χρησιμοποιούν τα περιεχόμενα του καταχωρητή AL (για πράξεις σε byte) ή του καταχωρητή AX (για πράξεις σε λέξεις). Το προϊόν έχει διπλό μέγεθος και επιστρέφεται ως εξής:

· πολλαπλασιασμός byte-επιστρέφει το προϊόν των 16 bit στους καταχωρητές AN (υψηλό byte) και AL (χαμηλό byte).

· πολλαπλασιασμός λόγια-επιστρέφει το προϊόν 32-bit στους καταχωρητές DX (high word) και AX (low word). Έτσι, το μέγεθος του προϊόντος n- οι συντελεστές bit είναι ίσοι 2n.

Προσθήκη ακέραιου αριθμού ADC με μεταφορά

Ομάδα adcεκτελεί την προσθήκη του πρώτου και του δεύτερου τελεστή, προσθέτοντας την τιμή της σημαίας μεταφοράς CF στο αποτέλεσμα. Η αρχική τιμή του πρώτου τελεστή (προορισμός) χάνεται και αντικαθίσταται από το αποτέλεσμα της προσθήκης. Ο δεύτερος τελεστής είναι αμετάβλητος. Ως πρώτος τελεστής της εντολής adc

Οι τελεστές μπορούν να είναι byte ή λέξεις και να αντιπροσωπεύουν αριθμούς με υπογραφή ή χωρίς υπογραφή. Ομάδα adc(μαζί με την ομάδα Προσθήκη) χρησιμοποιείται συνήθως για την προσθήκη αριθμών 32-bit. Η εντολή επηρεάζει τις σημαίες OF, SF, ZF, AF, PF και CF.

Παράδειγμα 1:

Mov AX,1125h adc AX,2C25h; AX=3D4Bh, αν το CF ήταν = 1; AX=3D4Ah, εάν το CF ήταν = 0

Παράδειγμα 2:

; Στα πεδία δεδομένων: numlow dw 0FFFFh; Το χαμηλό μέρος του 2ου όρου numhigh dw 000Sh; Το υψηλότερο τμήμα του 2ου όρου;Αριθμός 0005FFFFh=393215;Στο τμήμα προγράμματος: mov AX,000Sh; Μέρος χαμηλής τάξης του 1ου όρου mov BX,0002h; Το υψηλότερο τμήμα του 1ου όρου;Αριθμός 00020005h=131077 προσθήκη AX,numlow; Προσθήκη junior εξαρτημάτων. AX=4, CF=1 adc BX, numhigh; Προσθήκη υψηλότερων εξαρτημάτων με μεταφορά. BX:AX=0008:0004h. ;Αριθμός 00080004h=524292

Η χρήση τελεστών 32 bit και πρόσθετων τρόπων διευθυνσιοδότησης επεξεργαστών 32 bit είναι αποδεκτή. Ομάδα adcμε τελεστές 32 bit, μπορεί να χρησιμοποιηθεί για την προσθήκη ακεραίων 64 bit.

Παράδειγμα:

; Στα πεδία δεδομένων mem321 dd 0FFFFFFFFh; Μέρος χαμηλής τάξης του 1ου όρου mem32h dd 98765432h; Το υψηλότερο μέρος της 1ης περιόδου. Στο τμήμα προγράμματος mov EAX,1; Μέρος χαμηλής τάξης του 2ου όρου mov EBX,0; Το υψηλότερο μέρος του 2ου όρου προσθέστε EAX,mem321; Προσθέστε τα κάτω μισά;Άθροισμα=100000000h>32 bit;EAX=000000h, μεταφορά adc EBX,mem32h; Διπλώστε τα παλαιότερα μισά και μεταφέρετε. EBX=90000001h; Ποσό: 9876543300000000h

ΠΡΟΣΘΗΚΗ προσθήκης ακέραιου αριθμού

Ομάδα Προσθήκηεκτελεί την πρόσθεση του πρώτου και του δεύτερου τελεστή. Η αρχική τιμή του πρώτου τελεστή (προορισμός) χάνεται και αντικαθίσταται από το αποτέλεσμα της προσθήκης. Ο δεύτερος τελεστής είναι αμετάβλητος. Ως πρώτος τελεστής της εντολής ΠροσθήκηΜπορείτε να καθορίσετε έναν καταχωρητή (εκτός από ένα τμήμα ένα) ή ένα κελί μνήμης, το δεύτερο μπορεί να είναι ένας καταχωρητής (εκτός από ένα τμήμα ένα), ένα κελί μνήμης ή μια άμεση τιμή, αλλά δεν επιτρέπεται να ορίσετε και τους δύο τελεστές ταυτόχρονα ως μνήμη κύτταρα.

Οι τελεστές μπορούν να είναι byte ή λέξεις και να αντιπροσωπεύουν αριθμούς με υπογραφή ή χωρίς υπογραφή. Η εντολή add μπορεί να χρησιμοποιηθεί για την προσθήκη κανονικών ακεραίων και δυαδικών δεκαδικών αριθμών (χρησιμοποιώντας τον καταχωρητή AX για την αποθήκευση του αποτελέσματος). Εάν προστεθούν μη συσκευασμένοι δυαδικοί κωδικοποιημένοι δεκαδικοί αριθμοί (BCD), μετά την εντολή Προσθήκηπρέπει να χρησιμοποιηθεί η εντολή aaa. αν προστεθούν συσκευασμένοι αριθμοί, τότε η εντολή ναι. Η εντολή επηρεάζει τις σημαίες OF, SF, ZF, AF, PF και CF.

Παράδειγμα 1:

Mov BX,lFFEh mov CX,3 προσθήκη BX,CX; BX=2001h, CX=0003h

Παράδειγμα 2:

Mov AX,25h προσθήκη AX,12h; AX=0037h

Παράδειγμα 3:

; Στα πεδία δεδομένων: mem dw 128 ;Στο τμήμα προγράμματος: προσθήκη mem,100; mem=228

Προσθήκη ακέραιου αριθμού ADC με μεταφορά

Η εντολή adc προσθέτει τον πρώτο και τον δεύτερο τελεστή, προσθέτοντας την τιμή της σημαίας μεταφοράς CF στο αποτέλεσμα. Η αρχική τιμή του πρώτου τελεστή (προορισμός) χάνεται και αντικαθίσταται από το αποτέλεσμα της προσθήκης. Ο δεύτερος τελεστής είναι αμετάβλητος. Ο πρώτος τελεστής της εντολής adc μπορεί να είναι ένας καταχωρητής (εκτός από ένα τμήμα) ή ένα κελί μνήμης, ο δεύτερος τελεστής μπορεί να είναι ένας καταχωρητής (εκτός από ένα τμήμα), ένα κελί μνήμης ή μια άμεση τιμή, αλλά δεν επιτρέπεται να καθοριστεί και οι δύο τελεστές ταυτόχρονα ως κύτταρα μνήμης. Οι τελεστές μπορούν να είναι byte ή λέξεις και να αντιπροσωπεύουν αριθμούς με υπογραφή ή χωρίς υπογραφή. Η εντολή adc (μαζί με την εντολή add) χρησιμοποιείται συνήθως για την προσθήκη αριθμών 32 bit. Η εντολή επηρεάζει τις σημαίες OF, SF, ZF, AF, PF και CF.

Παράδειγμα 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh, αν το CF ήταν = 1 ;AX=3D4Ah, αν το CF ήταν = 0
Παράδειγμα 2; Στα πεδία δεδομένων: numlow dw 0FFFFh ;Χαμηλό μέρος του 2ου όρου numhigh dw 000Sh ;Υψηλό μέρος του 2ου όρου;Αριθμός 0005FFFFh=393215 ;Στο τμήμα προγράμματος: mov AX,000Sh ;Χαμηλό μέρος του 2ου όρου του BX1st 0002h; Το υψηλότερο τμήμα του 1ου όρου;Αριθμός 00020005h=131077 προσθήκη AX,numlow;Προσθήκη των κάτω τμημάτων. AX=4, CF=1 adc BX, numhigh ;Προσθήκη υψηλότερων τμημάτων με;μεταφορά.BX:AX=0008:0004h. ;Αριθμός 00080004h=524292
Η χρήση τελεστών 32 bit και πρόσθετων τρόπων διευθυνσιοδότησης επεξεργαστών 32 bit είναι αποδεκτή. Η εντολή adc με τελεστές 32 bit μπορεί να χρησιμοποιηθεί για την προσθήκη ακεραίων 64 bit. Παράδειγμα 3; Στα πεδία δεδομένων mem321 dd 0FFFFFFFFh ;Χαμηλό μέρος του 1ου όρου mem32h dd 98765432h ;Υψηλό τμήμα του 1ου όρου; Στο τμήμα προγράμματος mov EAX,1 ;Το χαμηλό μέρος του 2ου όρου mov EBX,0 ;Το υψηλό τμήμα του 2ου όρου προσθέστε EAX,mem321 ;Προσθέστε τα χαμηλά μισά;Άθροισμα=100000000b>32 bit;EAX=000000h, μεταφορά adc EBX,mem32h ;Προσθέστε τα παλαιότερα μισά και μεταφέρετε. EBX=90000001h ;Ποσό: 9876543300000000h
ΠΡΟΣΘΗΚΗ προσθήκης ακέραιου αριθμού

Η εντολή add προσθέτει τον πρώτο και τον δεύτερο τελεστή. Η αρχική τιμή του πρώτου τελεστή (προορισμός) χάνεται και αντικαθίσταται από το αποτέλεσμα της προσθήκης. Ο δεύτερος τελεστής είναι αμετάβλητος. Ο πρώτος τελεστής της εντολής add μπορεί να οριστεί ως καταχωρητής (εκτός από ένα τμήμα ένα) ή ένα κελί μνήμης και ο δεύτερος τελεστής μπορεί να είναι ένας καταχωρητής (εκτός από ένα τμήμα ένα), ένα κελί μνήμης ή μια άμεση τιμή, αλλά είναι δεν επιτρέπεται να οριστούν και οι δύο τελεστές ταυτόχρονα ως κελιά μνήμης. Οι τελεστές μπορούν να είναι byte ή λέξεις και να αντιπροσωπεύουν αριθμούς με υπογραφή ή χωρίς υπογραφή. Η εντολή add μπορεί να χρησιμοποιηθεί για την προσθήκη κανονικών ακεραίων και δυαδικών δεκαδικών αριθμών (χρησιμοποιώντας τον καταχωρητή AX για την αποθήκευση του αποτελέσματος). Όταν προσθέτετε μη συσκευασμένους δυαδικούς κωδικοποιημένους δεκαδικούς αριθμούς (BCD), χρησιμοποιήστε την εντολή aaa μετά την εντολή add. εάν προστεθούν συσκευασμένοι αριθμοί, τότε εντολές daa. Η εντολή επηρεάζει τις σημαίες OF, SF, ZF, AF, PF και CF. Παράδειγμα 1

Mov BX,lFFEh mov CX,3 προσθήκη BX,CX ;BX=2001h, CX=0003h
Παράδειγμα 2 mov AX,25h προσθήκη AX,12h ;AX=0037h
Παράδειγμα 3; Στα πεδία δεδομένων: mem dw 128 ;Στο τμήμα προγράμματος: προσθήκη mem,100 ;mem=228
Παράδειγμα 4 mov AX,0507h ;BCD unpacked 57 add AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
Παράδειγμα 5 mov AL,57h ;BCD packed 57 add AL,05h ;BCD 5, AL=5Ch daa ;AL=62h, BCD 62

Η χρήση τελεστών 32 bit και πρόσθετων τρόπων διευθυνσιοδότησης επεξεργαστών 32 bit είναι αποδεκτή. Παράδειγμα

Mov EAX,98765432h προσθήκη EAX,11111111h ; EAX=A9876543h
ΚΑΙ Λογικό ΚΑΙ

Η εντολή and εκτελεί έναν λογικό (δυαδικό) πολλαπλασιασμό του πρώτου τελεστή με τον δεύτερο. Η αρχική τιμή του πρώτου τελεστή (προορισμός) χάνεται και αντικαθίσταται από το αποτέλεσμα του πολλαπλασιασμού. Ο πρώτος τελεστής της εντολής and μπορεί να είναι ένας καταχωρητής (εκτός από ένα τμήμα ένα) ή ένα κελί μνήμης, ο δεύτερος τελεστής μπορεί να είναι ένας καταχωρητής (εκτός από ένα τμήμα ένα), ένα κελί μνήμης ή μια άμεση τιμή, αλλά δεν επιτρέπεται να προσδιορίστε και τους δύο τελεστές ταυτόχρονα ως κελιά μνήμης. Οι τελεστές μπορεί να είναι byte ή λέξεις. Η εντολή επηρεάζει τις σημαίες SF, ZF και PF. Κανόνες για δυαδικό πολλαπλασιασμό:

Πρώτο bit τελεστή 0101 Δεύτερο bit τελεστή 0011 bit αποτελέσματος 0001 Παράδειγμα 1 mov AX,0FFEh και AX,5555h ;AX=0554h Παράδειγμα 2; Στα πεδία δεδομένων: mem dw 0С003h ;Στο τμήμα προγράμματος: mov AX,700Eh και AX,mem ;AX=4002h

Η χρήση τελεστών 32 bit και πρόσθετων τρόπων διευθυνσιοδότησης επεξεργαστών 32 bit είναι αποδεκτή. Παράδειγμα

Mov EDX, 0FA8 8 0 0 4 lh και EDX,0FF00000Fh ; EDX = FA000001h
386P+ ARPL
Προσαρμογή του ζητούμενου επιπέδου προνομίου επιλογέα

Η εντολή aprl συγκρίνει τον επιλογέα με ένα μοτίβο που περιέχει το μέγιστο επιτρεπόμενο επίπεδο προνομίων (συνήθως τον επιλογέα CS) και ορίζει την τιμή που θα δοκιμαστεί στο χαμηλότερο από τα δύο επίπεδα προνομίων. Εάν δεν απαιτείται αλλαγή επιπέδου, η σημαία ZF επαναφέρεται, εάν απαιτείται, ορίζεται. Ο πρώτος τελεστής της εντολής aprl μπορεί να είναι ένας καταχωρητής 16-bit ή μια λέξη μνήμης με ελεγχόμενο επιλογέα. ο δεύτερος τελεστής είναι ένας καταχωρητής 16-bit με επιλογέα μοτίβων. 386+ ΔΕΜΕΝΟ
Έλεγχος ενός ευρετηρίου πίνακα για πίνακα εκτός ορίων

Η εντολή bound ελέγχει εάν ο καθορισμένος δείκτης, που αντιμετωπίζεται ως υπογεγραμμένος αριθμός, βρίσκεται εντός των ορίων που καθορίζονται από τον δεύτερο τελεστή. Εάν ο δείκτης υπερβαίνει τα όρια του πίνακα κάτω ή πάνω, δημιουργείται μια διακοπή με το διάνυσμα 5. Ο πρώτος τελεστής πρέπει να είναι ένας καταχωρητής που περιέχει το ευρετήριο που ελέγχεται, ο δεύτερος - τη διεύθυνση ενός πεδίου μνήμης με δύο όρια του πίνακα υπό έλεγχο. Η εντολή δεσμευμένη επιτρέπει τόσο τελεστές 16-bit όσο και 32-bit (αλλά και ο πρώτος και ο δεύτερος τελεστής πρέπει να είναι του ίδιου τύπου).

Συμβολομεταφράστης- Γλώσσα συναρμολόγησης για ανδρείκελα

Γλώσσα συναρμολόγησης για ανδρείκελα.(#2) (Γ) Mikhail Spitsyn 1995Σημαίες Ο καταχωρητής "F" του επεξεργαστή ονομάζεται flag. Τι είναι? Μια σημαία είναι μια μεταβλητή που μπορεί να έχει δύο καταστάσεις: set (ίσο με ένα) και διαγραφή (ίσο με μηδέν). Επομένως, ο καταχωρητής "F" μπορεί να θεωρηθεί ως ένα σύνολο οκτώ bit σημαίας. Μπορούμε να χρησιμοποιήσουμε μόνο τέσσερις από αυτές: τη σημαία μηδέν, τη σημαία μεταφοράς, τη σημαία σήματος και τη σημαία υπερχείλισης ισοτιμίας.Αριθμητικές πράξεις. Η αριθμητική είναι μια πολύ, πολύ χρήσιμη επιστήμη· μετράμε συνεχώς κάτι: προσθέτουμε, αφαιρούμε, διαιρούμε, πολλαπλασιάζουμε. Θα μιλήσουμε τώρα για το πώς να το κάνουμε αυτό στο assembler. Θα ξεκινήσουμε με το πιο απλό πράγμα, προσθέτοντας ένα σε κάτι, για παράδειγμα, για να καταχωρήσουμε το "A": **************************** *** ** LD A,NUBER INC A RET ******************************** Όπως μπορείτε να δείτε, είναι πολύ απλό για αυτό υπάρχει μια εντολή "INC" - increment (αύξηση κατά ένα), ακολουθούμενη από έναν τελεστή, δηλ. κάποιο ζεύγος καταχωρητή ή καταχωρητή: ******************************** INC A INC HL INC H INC DE INC E INC IY INC E INC (HL) INC (IX+N) INC (IY+N) ********************************** ** Εάν θέλετε να αυξήσετε οποιοδήποτε κελί μνήμης κατά ένα, τότε θα πρέπει να κάνετε το εξής: ********************************* ****** *** LD HL,ADDRES LD IX,ADDRES INC (HL) INC (IX+0) RET RET ********************* **************** ***** Η πρώτη επιλογή λειτουργεί πιο γρήγορα και είναι πιο βολική εάν εργάζεστε με ένα κελί μνήμης, αλλά εάν εργάζεστε σε έναν πίνακα, τότε δεν είναι οικονομικό και άσχημο. Σύγκριση: πρέπει να αυξήσουμε το πρώτο, το πέμπτο και το δέκατο byte στον πίνακα κατά ένα: ********************************** * LD HL,TABL+1 LD IX,TABL INC (HL) INC (IX+1) LD HL,TABL+5 INC (IX+5) INC (HL) INC (IX+10) LD HL,TABL+10 RET INC (HL) RET ******************************** Όλα όσα ειπώθηκαν παραπάνω για αύξηση κατά ένα είναι αλήθεια και για μείωση, δηλ. να μειωθεί κατά ένα: ******************************** DEC A DEC HL DEC L DEC L DEC IX DEC H DEC DE DEC Ε ΔΕΚ Π.Χ. ΔΕΚ Δ. ΔΕΚ. ΙΙ ΔΕΚ Γ ΔΕΚ ΙΧ ΔΕΚ Β ΔΕΚ (ΗΛ) ΔΕΚ (ΙΧ+Ν) ΔΕΚ (ΙΧ+Ν) ********************* *********** Τώρα ας υποθέσουμε ότι πρέπει να αυξήσουμε τον καταχωρητή "A" όχι κατά ένα, αλλά, ας πούμε, κατά δέκα: **************** ***************** LD A,NUMBER ADD A,10 RET ************************* * ****** Μπορείτε να προσθέσετε καταχωρητή "A" με έναν αριθμό και άλλους καταχωρητές και με ένα κελί μνήμης που διευθύνεται από ζεύγη καταχωρητών "HL", "IX" και "IY". Μπορείτε επίσης να προσθέσετε ζεύγη καταχωρητών με "HL", "IX" και "IY". (PureBasic - σύστημα αρχείων) ******************************** ADD A,N ADD A,(HL) ADD A ,A ΠΡΟΣΘΗΚΗ A,(IX+N) ΠΡΟΣΘΗΚΗ A,B ΠΡΟΣΘΗΚΗ A,(IY+N) ΠΡΟΣΘΗΚΗ A,C ΠΡΟΣΘΗΚΗ HL,HL ΠΡΟΣΘΗΚΗ A,D ΠΡΟΣΘΗΚΗ HL,BC ADD A,E ΠΡΟΣΘΗΚΗ HL,DE ΠΡΟΣΘΗΚΗ A,H ΠΡΟΣΘΗΚΗ HL,SP ADD IX,IX ADD IX,BC ADD IX,DE ADD IX,SP ****************************** ** Όπως μπορείτε να δείτε, το σύνολο των εντολών είναι αρκετά μεγάλο. Κατά την εκτέλεση αυτής της εντολής, ενδέχεται να παρουσιαστεί ένα σφάλμα: ******************************** LD A,45 LD B,230 ADD A ,B RET ************************************ Το άθροισμα των "A" και "B" υπερέβη το 255 και επομένως στο "A" " θα αποδειχθεί ότι δεν είναι 275, αλλά 20 (το μητρώο "Α" δεν είναι καουτσούκ). Για να μας ενημερώσει ότι έχει συμβεί υπερχείλιση, ο επεξεργαστής ορίζει τη σημαία μεταφοράς σε ένα. Το μόνο που μένει είναι να το ελέγξουμε. Όπως το "INC" έχει "DEC", το "ADD" έχει επίσης ένα "ζευγάρι", αυτό είναι το "SUB" και έχει τα δικά του χαρακτηριστικά. Η εντολή "SUB" λειτουργεί μόνο με τον καταχωρητή "A", επομένως όταν γράφετε τα μνημονικά για αυτήν την εντολή, το "A" παραλείπεται: ********************* *********** SUB N SUB C SUB A SUB H SUB B SUB D SUB E SUB (HL) SUB (IX+N) SUB (IY+N) ******** * ********************** Η εντολή επηρεάζει τη σημαία μεταφοράς με τον ίδιο τρόπο όπως το "ADD". Εκτός από το ζεύγος εντολών "ADD" και "SUB", υπάρχει ένα άλλο ζεύγος. Οι εντολές "ADC" και "SBC" λειτουργούν λαμβάνοντας υπόψη τη σημαία μεταφοράς, δηλ. Κατά την πρόσθεση ή την αφαίρεση, η τιμή της σημαίας μεταφοράς προστίθεται (αφαιρείται) στο αποτέλεσμα. Υπάρχουν δύο ειδικές εντολές για να ορίσετε τη σημαία μεταφοράς - "SCF" και "CCF". "SCF" - ορίστε τη σημαία μεταφοράς σε ένα. "CCF" - ορίστε τη σημαία μεταφοράς στο μηδέν. ************************************ ADC A,N SBC A,N ADC A,A SBC A,A ADC A ,H SBC A,H ADC A,L SBC A,L ADC A,D SBC A,D ADC A,E SBC A,E ADC A,B SBC A,B ADC A,C SBC A,C ADC A,( HL) SBC A,(HL) ADC A,(IX+N) SBC A,(IX+N) ADC A,(IY+N) SBC A,)IY+N) ADC HL,HL SBC HL,HL ADC HL ,BC SBC HL,BC ADC HL,DE SBC HL,DE ADC HL,SP SBC HL,SP **************************** **** Και τώρα παραδείγματα της εργασίας των εντολών "ADC" και "SBC": ***************************** ************ * LD A,10 LD A,10 LD B,5 LD B,5 CCF CCF SBC A,B ADC A,B RET RET A=5 B=5 A=15 B=5 ******** *********************** Αντί για τις δύο εντολές "CCF" και "SBC A,B" μπορείτε απλά να βάλετε "SUB B", το αποτέλεσμα θα είναι το ίδιο. ************************************ LD A,10 LD A,10 LD B,5 LD B,5 SCF SCF SBC A,B ADC A,B RET RET A=4 B=5 A=16 B=5 **************************** **** Όπως φαίνεται από τα αποτελέσματα, η σημαία μεταφοράς επηρεάζει σημαντικά το αποτέλεσμα της λειτουργίας. Κατά την αφαίρεση αφαιρείται από το αποτέλεσμα και κατά την πρόσθεση προστίθεται στο αποτέλεσμα. Σχεδόν τα πάντα έχουν καλυφθεί για τις πράξεις πρόσθεσης και αφαίρεσης· τώρα θα μιλήσουμε για διαίρεση και πολλαπλασιασμό. Δυστυχώς, το SPECCY δεν έχει εντολές διαίρεσης και πολλαπλασιασμού, αλλά αυτές οι εντολές μπορούν να αποτελούνται από πολλές άλλες. Για παράδειγμα, πρέπει να πολλαπλασιάσουμε τα περιεχόμενα δύο καταχωρητών - "A" και "C": ***************************** ********** *** LD A,10 LD C,5 LD B,A XOR A LOOP ΠΡΟΣΘΗΚΗ A,C DJNZ LOOP RET *************** ********** ******* Στο παράδειγμα υπάρχουν δύο νέες εντολές - "XOR A" και "DJNZ LOOP". Το "XOR A" διαγράφει τον καταχωρητή "A" και η εντολή "DJNZ LOOP" επαναλαμβάνει όλες τις εντολές, από την εντολή που επισημαίνεται με μια ετικέτα (για παράδειγμα, "LOOP") έως την εντολή "DJNZ" (ακολουθούμενη από την ίδια ετικέτα). ka, όπως στην αρχή του κύκλου). Ο αριθμός των επαναλήψεων καθορίζεται στο μητρώο "Β". Χρησιμοποιώντας το γεγονός ότι ο πολλαπλασιασμός του M με το N προσθέτει τον αριθμό M στον εαυτό του N φορές, μπορείτε να κατανοήσετε το παράδειγμα που δίνεται παραπάνω. Αυτή η ιδιοκτησία μπορεί επίσης να χρησιμοποιηθεί για διαίρεση. Δοκιμάστε το μόνοι σας. Την επόμενη φορά θα μιλήσουμε για εντολές σύγκρισης και εργασίας με bit.________________________________

Άλλα άρθρα στο τεύχος:





Μπλουζα