Συμβολική γλώσσα. Εντολές συναρμολόγησης και βασικά

Εργαλείο 21.06.2019
Εργαλείο

Το Assembly Language for x86 Processors, 7e είναι κατάλληλο για προπτυχιακά μαθήματα προγραμματισμού γλωσσών assembly και εισαγωγικά μαθήματα σε συστήματα υπολογιστών και αρχιτεκτονική υπολογιστών. Συνιστάται η γνώση μιας άλλης γλώσσας προγραμματισμού, κατά προτίμηση Java, C ή C++.

Αυτή η πλήρης και πλήρως ενημερωμένη μελέτη γλώσσας assembly, που γράφτηκε ειδικά για την πλατφόρμα Intel/Windows 32 και 64 bit, διδάσκει στους μαθητές να γράφουν και να διορθώνουν προγράμματα σε επίπεδο μηχανής. Αυτό το κείμενο απλοποιεί και απομυθοποιεί έννοιες που πρέπει να κατανοήσουν οι μαθητές προτού μπορέσουν να προχωρήσουν σε πιο προηγμένα μαθήματα αρχιτεκτονικής υπολογιστών και λειτουργικών συστημάτων. Οι μαθητές εφαρμόζουν τη θεωρία στην πράξη μέσω της συγγραφής λογισμικού σε επίπεδο μηχανής, δημιουργώντας μια αξέχαστη εμπειρία που τους δίνει την αυτοπεποίθηση να εργαστούν σε οποιοδήποτε περιβάλλον προσανατολισμένο στο λειτουργικό σύστημα/μηχανή.

Περιγράφονται οι αρχές λειτουργίας, τα αρχιτεκτονικά χαρακτηριστικά και οι τεχνικές προγραμματισμού για τους μικροελεγκτές Atmel AVR. Παρέχονται έτοιμες συνταγές για τον προγραμματισμό των βασικών λειτουργιών του σύγχρονου μικροηλεκτρονικού εξοπλισμού: από την ανταπόκριση σε ένα πάτημα κουμπιού ή την κατασκευή μιας δυναμικής οθόνης έως πολύπλοκα πρωτόκολλα εγγραφής δεδομένων σε εξωτερική μνήμηή χαρακτηριστικά σύνδεσης ρολογιού σε πραγματικό χρόνο. Ιδιαίτερη προσοχήεπικεντρώνεται στην ανταλλαγή δεδομένων από μικροηλεκτρονικές συσκευές με προσωπικό υπολογιστή και παρέχει παραδείγματα προγραμμάτων. Το βιβλίο λαμβάνει υπόψη τα χαρακτηριστικά μοντέρνα μοντέλα AVR και σχετικά τσιπ τα τελευταία χρόνιαελευθέρωση. Η εφαρμογή περιέχει βασικές παραμέτρους Μικροελεγκτές AVR, μια λίστα με εντολές και κείμενα προγράμματος για αυτές, καθώς και μια λίστα όρων και συντμήσεων που χρησιμοποιούνται. Για φοιτητές, μηχανικούς και ραδιοερασιτέχνες. 3η έκδοση, διορθώθηκε.

Αυτό το βιβλίο ασχολείται με τη λειτουργία του επεξεργαστή στους δύο βασικούς τρόπους λειτουργίας του: προστατευμένη λειτουργία και 64-bit, η οποία ονομάζεται επίσης μεγάλη λειτουργία. Επίσης, εκτός από την περιγραφή των αρχών και των μηχανισμών λειτουργίας του επεξεργαστή σε προστατευμένες και 64-bit λειτουργίες, θα μιλήσουμε για προγραμματισμό σε assembler σε λειτουργικό σύστημαΧ Οικογένεια Windows, και στις δύο εκδόσεις 32 και 64 bit. Δεν εξετάζεται μόνο η ανάπτυξη τακτικές εφαρμογέςγια λειτουργικά συστήματα Windows, αλλά και ανάπτυξη προγραμμάτων οδήγησης σε assembler. Κατά τη συγγραφή του βιβλίου δόθηκε μεγάλη προσοχή στο πρακτικό στοιχείο, δηλ. η παρουσίαση του υλικού είναι μόνο στο σημείο και μόνο αυτό που χρειάζεται να γνωρίζει κάθε σύστημα και προγραμματιστής χαμηλού επιπέδου. Τελευταία ενότητατα βιβλία είναι αφιερωμένα στις αρχές της εργασίας πολυεπεξεργαστικών συστημάτων, καθώς και εργασία με τον προηγμένο προγραμματιζόμενο ελεγκτή διακοπής (APIC).
Ο δίσκος που περιλαμβάνεται στο βιβλίο περιέχει πλήρη πηγαίους κώδικεςπαραδείγματα για το βιβλίο, καθώς και πρόσθετα προγράμματακαι υλικά.

Η δημοσίευση προορίζεται για προγραμματιστές συστημάτων και χαμηλού επιπέδου, καθώς και για μαθητές και καθηγητές τεχνικών ειδικοτήτων σε ανώτερα και δευτεροβάθμια εξειδικευμένα εκπαιδευτικά ιδρύματα.

Όλα τα βασικά θέματα προγραμματισμού σε γλώσσα assembly εξηγούνται αναλυτικά και ξεκάθαρα. Οι ομάδες αξιολογήθηκαν Επεξεργαστές Intel, καταχωρητές 16 και 32 bit, βασικά στοιχεία συνεπεξεργαστή, τμηματοποίηση μνήμης σε πραγματικό χρόνο, διαχείριση πληκτρολογίου και σειριακής θύρας, χειρισμός δίσκου και πολλά άλλα. Περιγράφει πώς να αναπτύξετε έναν αβλαβή μη μόνιμο ιό και ένα anti-virus κατά αυτού του ιού, πώς να γράψετε ένα κέλυφος αρχείου (όπως το Norton Commander ή το FAR Manager) και πώς να γράψετε μόνιμα προγράμματα.
Κάθε κεφάλαιο αποτελείται από μια εξήγηση νέο θέμα, περιγραφές αλγορίθμων προγραμμάτων, πολυάριθμα παραδείγματα και απαντήσεις σε συχνές ερωτήσεις. Η δεύτερη έκδοση αναθεωρήθηκε και προστέθηκαν νέα παραδείγματα.
Το CD περιέχει τον πηγαίο κώδικα για όλα τα παραδείγματα του βιβλίου, με λεπτομερείς περιγραφές.

Περιγραφή του βιβλίου Πρακτικός προγραμματισμόςΜικροελεγκτές Atmel AVR σε γλώσσα συναρμολόγησης:
Περιγράφονται οι αρχές λειτουργίας, τα αρχιτεκτονικά χαρακτηριστικά και οι τεχνικές προγραμματισμού για τους μικροελεγκτές Atmel AVR. Παρέχονται έτοιμες συνταγές για τον προγραμματισμό των βασικών λειτουργιών του σύγχρονου μικροηλεκτρονικού εξοπλισμού: από την απόκριση σε ένα πάτημα κουμπιού ή τη δημιουργία μιας δυναμικής οθόνης έως πολύπλοκα πρωτόκολλα για την εγγραφή δεδομένων σε εξωτερική μνήμη ή δυνατότητες σύνδεσης ρολογιού πραγματικού χρόνου. Ιδιαίτερη προσοχή δίνεται στην ανταλλαγή δεδομένων από μικροηλεκτρονικές συσκευές με προσωπικό υπολογιστή και παρέχονται παραδείγματα προγραμμάτων.

Το βιβλίο λαμβάνει υπόψη τα χαρακτηριστικά των σύγχρονων μοντέλων AVR και των σχετικών μικροκυκλωμάτων των τελευταίων ετών παραγωγής. Οι εφαρμογές περιέχουν τις βασικές παραμέτρους των μικροελεγκτών AVR, μια λίστα εντολών και κειμένων προγραμμάτων για αυτούς, καθώς και μια λίστα με όρους και συντομογραφίες που χρησιμοποιούνται. Για φοιτητές, μηχανικούς και ραδιοερασιτέχνες.

Περιγραφή του βιβλίου Συμβολομεταφράστης. Προγραμματισμός γλώσσας IBM PC Assembly:
Ένα από τα καλύτερα εγχειρίδια γλώσσας assembly. Το βιβλίο είναι μικρό σε όγκο. Πολλά σημαντικά θέματα παρουσιάζονται πολύ καλά - τμηματοποίηση, διακοπές, δυαδική αριθμητική. Οι εντολές του υπολογιστή, τα σχέδια γλωσσών και οι μέθοδοι προγραμματισμού σε αυτό συζητούνται λεπτομερώς. Η παρουσίαση συνοδεύεται από πολλά παραδείγματα. Ως «σύντομη πορεία» μάλλον δεν έχει όμοιο.

Το βιβλίο είναι ένα εγχειρίδιο για τη γλώσσα assembly για προσωπικούς υπολογιστές όπως το IBM PC. Οι εντολές αυτών των υπολογιστών, ο σχεδιασμός της γλώσσας και οι μέθοδοι προγραμματισμού σε αυτόν συζητούνται λεπτομερώς. Η παρουσίαση συνοδεύεται από πολλά παραδείγματα. Για φοιτητές και καθηγητές πανεπιστημίου, για όλους όσους θέλουν να μελετήσουν αναλυτικά τη γλώσσα assembly και τις τεχνικές προγραμματισμού σε αυτήν.

Περιγραφή του βιβλίου Προγραμματισμός γλώσσας Assembly για μικροελεγκτές οικογένειας i8051:
Περιγράφονται τα βασικά του προγραμματισμού στη γλώσσα Assembly για τη δημοφιλή οικογένεια μικροελεγκτών i8051. Περιγράφονται τα χαρακτηριστικά αρχιτεκτονικής της οικογένειας μικροελεγκτών i8051. Παρέχει πληροφορίες σχετικά με την τεχνολογία ανάπτυξης προγραμμάτων, τις μορφές συστήματος και εντολών. Το βιβλίο περιέχει πληροφορίες σχετικά με τον προγραμματισμό ορισμένων τύπων εργασιών, συμπεριλαμβανομένων των εργασιών ψηφιακό φιλτράρισμασήματα, καθώς και ορισμένες συστάσεις σχετικά με το στυλ προγραμματισμού για αρχάριους προγραμματιστές.

Για ένα ευρύ φάσμα ειδικών που ασχολούνται με την ανάπτυξη βιομηχανικού και οικιακού εξοπλισμού, ραδιοερασιτέχνες, μπορεί να είναι χρήσιμο για φοιτητές και μεταπτυχιακούς φοιτητές.

Περιγραφή του βιβλίου Γλώσσα συναρμολόγησης για επεξεργαστές Intel Pentium :
Η δημοσίευση είναι αφιερωμένη στον προγραμματισμό σε γλώσσα assembly για επεξεργαστές Intel Pentium. Καλύπτεται ένα ευρύ φάσμα θεμάτων, από τα βασικά του προγραμματισμού γλώσσας assembly έως τη χρήση των πιο πρόσφατων τεχνολογιών επεξεργασίας δεδομένων, όπως MMS, SSE και SSE2. Το υλικό του βιβλίου αποκαλύπτει τεχνικές βελτιστοποίησης κώδικα προγράμματοςγια όλες τις γενιές επεξεργαστών Intel Pentium, συμπεριλαμβανομένου του Intel Pentium 4. Το θεωρητικό υλικό υποστηρίζεται από πολλά παραδείγματα κώδικα προγράμματος. Για ένα ευρύ φάσμα αναγνωστών, από φοιτητές έως έμπειρους προγραμματιστές λογισμικού.

Δεν χρειάζεται να είστε χάκερ για να γράψετε προγράμματα σε γλώσσα assembly. Μόνο ένα πράγμα είναι σίγουρο - να επιτευχθεί πλήρης έλεγχοςΗ εργασία σε διάφορα εξαρτήματα του υπολογιστή χωρίς γνώση της γλώσσας assembly είναι σχεδόν εφικτή. Σε αυτό το βιβλίο, ο συγγραφέας, σε προσιτή μορφή, εισάγει τους αναγνώστες σε όλες τις βασικές κατασκευές της γλώσσας assembly, καταδεικνύοντας συγκεκριμένα παραδείγματαεπιλογές για την επίλυση διαφόρων πρακτικών προβλημάτων. Μπορεί να υποτεθεί ότι είναι η επιλογή των εργασιών που διακρίνει διάφορες δημοσιεύσεις σχετικά με αυτό το θέμα. Άλλωστε, το σύνολο των λειτουργιών είναι ουσιαστικά αμετάβλητο. Η ιδιαιτερότητα αυτού του βιβλίου έγκειται στον επιτυχημένο συνδυασμό ενός επίσημου στυλ παρουσίασης με ευνόητα παραδείγματα. Από την άλλη, ένα σημαντικό μέρος του υλικού ενδιαφέρει τους αναγνώστες που έχουν ήδη εμπειρία εργασίας με αυτή τη γλώσσα. Αυτό αφορά τα χαρακτηριστικά των νέων αρχιτεκτονικών επεξεργαστών, παρέχοντας μια διεπαφή με γλώσσες υψηλό επίπεδοκαι ομάδες επέκτασης σύγχρονους επεξεργαστές. Αυτά τα θέματα πρακτικά δεν καλύπτονται στη βιβλιογραφία, γεγονός που αυξάνει σημαντικά το ενδιαφέρον για αυτό το βιβλίο. Τα περιεχόμενα του βιβλίου και η προσιτή φύση της παρουσίασης του υλικού καθιστούν δυνατή τη σύστασή του στο ευρύτερο κοινό των αναγνωστών που όχι μόνο αποφασίζουν να μελετήσουν ανεξάρτητα τη γλώσσα assembly, αλλά και να αποκτήσουν πρόσθετες πληροφορίες για πιο λεπτά ζητήματα προγραμματισμού συστήματος.

Περιγραφή του βιβλίου Learning Assembler:
Το βιβλίο είναι αφιερωμένο στα βασικά του προγραμματισμού γλώσσας assembly σε συστήματα Windows και DOS. Η γνώση του assembler είναι απαραίτητη για να κατανοήσει ένας επαγγελματίας προγραμματιστής τη λειτουργία του λειτουργικού συστήματος και του μεταγλωττιστή. Η γλώσσα assembly σάς επιτρέπει να γράψετε ένα πρόγραμμα (ή μέρος του) έτσι ώστε να εκτελείται γρήγορα και να καταλαμβάνει λίγο χώρο. Είναι η αγαπημένη γλώσσα των χάκερ. η γνώση του σάς επιτρέπει να αλλάζετε προγράμματα κατά την κρίση σας, έχοντας μόνο ένα εκτελέσιμο αρχείο χωρίς κείμενα πηγής. Η παρουσίαση βασίζεται σε σύντομα παραδείγματαστο MASM assembler από τη Microsoft, εισάγοντας τον αναγνώστη στις βασικές ιδέες της γλώσσας, η γνώση της οποίας επιτρέπει όχι μόνο να γράφει απλά προγράμματα, αλλά και να προχωρήσει ανεξάρτητα.

Το βιβλίο απευθύνεται σε μαθητές Γυμνασίου και Λυκείου, καθώς και σε όποιον ενδιαφέρεται για τον προγραμματισμό γενικά και τη γλώσσα assembly ειδικότερα.

Περιγραφή του βιβλίου Χρήση του assembler για τη βελτιστοποίηση προγραμμάτων C++:
Εξετάζεται η χρήση της γλώσσας assembly για τη βελτιστοποίηση προγραμμάτων γραμμένων σε C++. Αναλυτικά παρουσιάζονται τα ζητήματα χρήσης σύγχρονων τεχνολογιών επεξεργασίας δεδομένων MMX και SSE, καθώς και η χρήση των χαρακτηριστικών των σύγχρονων αρχιτεκτονικών επεξεργαστών για τη βελτιστοποίηση των προγραμμάτων. Δεδομένος πρακτικές συστάσειςσχετικά με τη βελτιστοποίηση λογικές δομέςυψηλού επιπέδου, χρησιμοποιώντας αποδοτικούς αλγόριθμους υπολογισμού, εργασία με συμβολοσειρές και πίνακες δεδομένων.

Το βιβλίο περιλαμβάνει παραδείγματα κώδικα εφαρμογής που επεξηγούν διάφορες πτυχές της χρήσης του assembler. Ο συναρμολογητής μακροεντολών MASM 6.14 και το Microsoft Visual C++ .NET 2003 χρησιμοποιούνται ως εργαλεία ανάπτυξης για τα παραδείγματα. Πηγαία κείμεναΤα προγράμματα περιέχονται στο CD που περιλαμβάνεται στο βιβλίο.

Όταν γράφετε ένα πρόγραμμα σε γλώσσα assembly, γράφετε απλώς οδηγίες στον επεξεργαστή. Οι εντολές στον επεξεργαστή είναι απλώς κωδικοί ή opcodes ή opcodes. Τα Opcodes είναι ουσιαστικά εκδόσεις "αναγνώσιμου κειμένου" δεκαεξαδικών κωδίκων. Εξαιτίας αυτού, το assembler θεωρείται το πιο γλώσσα χαμηλού επιπέδουπρογραμματισμού, τα πάντα στο assembler μετατρέπονται απευθείας σε δεκαεξαδικούς κωδικούς. Με άλλα λόγια, δεν έχετε μεταγλωττιστή που να μετατρέπει τη γλώσσα υψηλού επιπέδου σε χαμηλό επίπεδο, ο assembler μετατρέπει μόνο κωδικούς συναρμολόγησης σε δεδομένα.

Σε αυτό το σεμινάριο, θα συζητήσουμε αρκετούς κωδικούς λειτουργίας που σχετίζονται με υπολογισμούς, λειτουργίες bitwise κ.λπ. Άλλοι κωδικοί λειτουργίας: άλμα, σύγκριση, κ.λπ. οδηγίες θα συζητηθούν αργότερα.

Τα σχόλια στα προγράμματά σας αφήνονται μετά το ερωτηματικό. Ακριβώς όπως στους Δελφούς ή στο C μέσω //.

Οι αριθμοί στη γλώσσα συναρμολόγησης μπορούν να αναπαρασταθούν σε δυαδικό, δεκαδικό ή δεκαεξαδικό. Για να δείξετε σε ποιο σύστημα χρησιμοποιείται ο αριθμός, πρέπει να τοποθετήσετε ένα γράμμα μετά τον αριθμό. Για το δυαδικό σύστημα το γράμμα b γράφεται (παράδειγμα: 0000010b, 001011010b), για το δεκαδικό σύστημα δεν μπορείτε να υποδείξετε τίποτα μετά τον αριθμό ή να υποδείξετε το γράμμα d (παραδείγματα: 4589, 2356d), για δεκαεξαδικό σύστημαπρέπει να καθορίσετε το γράμμα h, δεκαεξαδικός αριθμόςείναι απαραίτητο να γράψετε με ένα μηδέν στην αρχή (παραδείγματα: 00889h, 0AC45h, 056Fh, λάθος F145Ch, C123h).

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

Δέκτης Mov, πηγή

Μπορείτε να αντιγράψετε μια τιμή από έναν καταχωρητή σε άλλο.

Mov edx, ecx

Η παραπάνω εντολή αντιγράφει τα περιεχόμενα του ecx στο edx. Το μέγεθος της πηγής και του δέκτη πρέπει να είναι το ίδιο,

για παράδειγμα: αυτή η εντολή ΔΕΝ είναι έγκυρη:

Mov al, ecx; λανθασμένος

Αυτό το opcode επιχειρεί να χωρέσει μια τιμή DWORD (32-bit) σε ένα byte (8 bit). Αυτό δεν μπορεί να γίνει με την εντολή mov (υπάρχουν και άλλες εντολές για αυτό).

Και αυτές οι εντολές είναι σωστές επειδή η πηγή και ο προορισμός τους δεν διαφέρουν σε μέγεθος:

Mov al, bl mov cl, dl mov cx, dx mov ecx, ebx

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

προκατάληψη34 35 36 37 38 39 3C3D3F40 41 42
δεδομένα0D50 32 44 57 25 72 Η Ε.Φ.FFΕΝΑ ΔΓ7
(Κάθε μπλοκ αντιπροσωπεύει ένα byte)

Η τιμή μετατόπισης υποδεικνύεται εδώ ως byte, αλλά στην πραγματικότητα είναι μια τιμή 32 bit. Ας πάρουμε το 3Α ως παράδειγμα, αυτό είναι επίσης μια τιμή 32-bit: 0000003Ah. Ακριβώς για να εξοικονομήσουν χώρο, μερικοί χρησιμοποιούν μικρές μετατοπίσεις.

Κοιτάξτε τη μετατόπιση 3Α στον παραπάνω πίνακα. Τα δεδομένα σε αυτή τη μετατόπιση είναι 25, 7A, 5E, 72, EF, κ.λπ. Για να βάλετε την τιμή στο offset 3A σε έναν καταχωρητή, για παράδειγμα, χρησιμοποιείτε επίσης την εντολή mov:

Mov eax, dword ptr

Μέσα: τοποθετήστε μια τιμή με μέγεθος DWORD (32-bit) από τη μνήμη σε μετατόπιση 3Ah στον καταχωρητή eax. Μετά την εκτέλεση αυτής της εντολής, το eax θα περιέχει την τιμή 725E7A25h. Ίσως έχετε παρατηρήσει ότι αυτό είναι το αντίστροφο αυτού που υπάρχει στη μνήμη: 25 7A 5E 72. Αυτό συμβαίνει επειδή οι τιμές αποθηκεύονται στη μνήμη χρησιμοποιώντας τη μορφή μικρού endian. Αυτό σημαίνει ότι το λιγότερο σημαντικό byte αποθηκεύεται στο πιο σημαντικό byte: σειρά byte από πίσω προς τα εμπρός. Νομίζω ότι αυτά τα παραδείγματα θα το δείξουν:

  • Η τιμή dword (32-bit) 10203040 δεκαεξαδική αποθηκεύεται στη μνήμη ως: 40, 30, 20, 10
  • λέξη (16-bit) τιμή 4050 δεκαεξαδικό αποθηκεύεται στη μνήμη ως: 50, 40

Ας επιστρέψουμε στο παραπάνω παράδειγμα. Μπορείτε να το κάνετε και με άλλα μεγέθη:

Mov cl, byte ptr ; cl θα λάβει την τιμή 0Dh mov dx, λέξη ptr ; dx θα πάρει την τιμή 7DEFh

Πιθανότατα έχετε ήδη συνειδητοποιήσει ότι το πρόθεμα ptr σημαίνει ότι πρέπει να πάρετε ένα συγκεκριμένο μέγεθος από τη μνήμη. Και το πρόθεμα πριν από το ptr υποδεικνύει το μέγεθος των δεδομένων:

Byte - 1 byte Word - 2 byte Dword - 4 byte

Μερικές φορές το μέγεθος μπορεί να μην καθορίζεται:

Mov eax,

Δεδομένου ότι το eax είναι ένας καταχωρητής 32 bit, ο assembler κατανοεί ότι χρειάζεται επίσης μια τιμή 32 bit, σε σε αυτήν την περίπτωσηαπό μνήμη σε μετατόπιση 403045h.

Μπορείτε επίσης να χρησιμοποιήσετε άμεσες τιμές:

Mov edx, 5006h

Αυτή η εντολή απλώς θα γράψει στον καταχωρητή edx, την τιμή 5006. Οι παρενθέσεις, [ και ], χρησιμοποιούνται για να λάβουμε την τιμή από τη μνήμη (η μετατόπιση είναι στις παρενθέσεις), χωρίς τις παρενθέσεις, είναι απλώς η άμεση τιμή.

Μπορείτε επίσης να χρησιμοποιήσετε έναν καταχωρητή ως θέση μνήμης (πρέπει να είναι 32-bit σε προγράμματα 32-bit):

Mov eax, 403045h; γράφει στο eax την τιμή 403045 mov cx, ; βάζει την τιμή ( μέγεθος λέξης) από μνήμης; καθορίζεται στο EAX (403045)

Στο mov cx, , ο επεξεργαστής εξετάζει πρώτα ποια τιμή (=κελί μνήμης) περιέχει το eax, μετά ποια τιμή είναι σε αυτό το κελί μνήμης και βάζει αυτήν την τιμή (λέξη, 16 bit, επειδή ο προορισμός, cx, είναι 16-bit εγγραφή) στο CX.

Λειτουργίες στοίβας - PUSH, POP. Πριν σας πω για τις λειτουργίες στοίβας, σας εξήγησα ήδη τι είναι στοίβα. Η στοίβα είναι μια περιοχή στη μνήμη που επισημαίνεται από τον καταχωρητή στοίβας ESP. Η στοίβα είναι ένα μέρος για την αποθήκευση διευθύνσεων επιστροφής και προσωρινών τιμών. Υπάρχουν δύο εντολές για την ώθηση μιας τιμής στη στοίβα και την απόσπασή της από τη στοίβα: PUSH και POP. Η εντολή PUSH ωθεί μια τιμή στη στοίβα, π.χ. τοποθετεί την τιμή στη θέση μνήμης που δείχνει ο καταχωρητής ESP, μετά την οποία η τιμή του καταχωρητή ESP αυξάνεται κατά 4. Η εντολή Pop βγάζει μια τιμή από τη στοίβα, π.χ. Εμφανίζει την τιμή από τη θέση μνήμης στην οποία υποδεικνύει ο καταχωρητής ESP και, στη συνέχεια, μειώνει την τιμή του καταχωρητή ESP κατά 4. Η τελευταία τιμή που ωθείται στη στοίβα εμφανίζεται πρώτη. Όταν μια τιμή ωθείται στη στοίβα, ο δείκτης στοίβας μειώνεται και όταν εμφανίζεται μια τιμή, αυξάνεται. Ας δούμε ένα παράδειγμα:

(1) mov ecx, 100 (2) mov eax, 200 (3) push ecx ; save ecx (4) push eax (5) xor ecx, eax (6) add ecx, 400 (7) mov edx, ecx (8) pop ebx (9) pop ecx

  • 1: βάλε 100 σε εκχ
  • 2: βάλε 200 στο eax
  • 3: σπρώξτε την τιμή από το ecx (=100) στη στοίβα (σπρώξτε πρώτα)
  • 4: ωθήστε την τιμή από το eax (=200) στη στοίβα (σπρώχτηκε τελευταία)
  • 5/6/7: εκτέλεση πράξεων στο ecx, η τιμή στο ecx αλλάζει
  • 8: μεταφέρετε μια τιμή από τη στοίβα σε ebx: το ebx θα γίνει 200 ​​(τελευταία ώθηση, πρώτη εμφάνιση)
  • 9: άνοδος μιας τιμής από τη στοίβα στο ecx: το ecx θα γίνει ξανά 100 (πρώτη ώθηση, τελευταία έκρηξη)

Για να δείτε τι συμβαίνει στη μνήμη όταν οι τιμές τοποθετούνται και εμφανίζονται στη στοίβα, δείτε την παρακάτω εικόνα:

(η στοίβα εδώ είναι γεμάτη με μηδενικά, αλλά αυτό δεν συμβαίνει στην πραγματικότητα εδώ). Το ESP βρίσκεται στο σημείο που δείχνει)

Mov ax, 4560h push ax mov cx, FFFFh push cx pop edx edx είναι πλέον 4560FFFFh.

Κλήση υπορουτίνων και επιστροφή από αυτές - CALL, RET. Η εντολή κλήσης μεταφέρει τον έλεγχο σε μια διαδικασία κοντά ή μακριά, αποθηκεύοντας τη διεύθυνση του σημείου επιστροφής στη στοίβα. Η εντολή ret επιστρέφει τον έλεγχο από μια διαδικασία. πρόγραμμα κλήσης, η διεύθυνση επιστροφής λαμβάνεται από τη στοίβα. Παράδειγμα:

Κωδ.. καλέστε 0455659 ..περισσότερος κωδικός.. Κωδικός από διεύθυνση 455659: add eax, 500 mul eax, edx ret

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

Περισσότερες λεπτομέρειες: Η εντολή κλήσης σπρώχνει τον καταχωρητή EIP (έναν δείκτη στην επόμενη εντολή που θα εκτελεστεί) στη στοίβα και η εντολή ret τον ανοίγει και μεταφέρει τον έλεγχο σε αυτήν τη διεύθυνση. Μπορείτε επίσης να καθορίσετε ορίσματα για το πρόγραμμα (διαδικασία) που θα κληθεί. Αυτό μπορεί να γίνει μέσω της στοίβας:

Push value_1 push value_2 διαδικασία κλήσης

Μέσα σε μια διαδικασία, τα ορίσματα μπορούν να διαβαστούν από τη στοίβα και να χρησιμοποιηθούν. Τοπικές μεταβλητές, π.χ. Τα δεδομένα που χρειάζονται μόνο σε μια διαδικασία μπορούν επίσης να αποθηκευτούν στη στοίβα. Δεν θα μπω σε λεπτομέρειες σχετικά με αυτό γιατί μπορεί να γίνει εύκολα στους συναρμολογητές MASM και TASM. Απλώς θυμηθείτε ότι μπορείτε να κάνετε διαδικασίες και ότι μπορούν να χρησιμοποιήσουν παραμέτρους.

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

Αυτό ισχύει και για τις λειτουργίες των Windows. Φυσικά, μπορείτε να χρησιμοποιήσετε οποιαδήποτε άλλη περίπτωση στις δικές σας διαδικασίες, αλλά αυτό είναι το πρότυπο.

Αυτό είναι το τέλος ενός άλλου μαθήματος. Στο επόμενο μάθημα θα γράψουμε το πρώτο μας πρόγραμμα σε γλώσσα assembly.

Πίσω | Περιεχόμενα |

Αφήστε ένα σχόλιο

Σχόλια

η στοίβα μεγαλώνει μέχρι κάτω και τι κάνει περισσότερα θέματα ESP λιγότερο

Κάτι σαν αυτό λοιπόν;:
|| σαν άδεια στοίβα
V
| |ΕΣΠ
| |6
| |5
| |4
| |3
| |2
| |1
| |0

Μετά τον κωδικό
ώθηση 0fh
ώθηση 0ffh

|| τύπος στοίβας
V
|0fh|7
|0ffh|6
| |ΕΣΠ
| |4
| |3
| |2
| |1
| |0

Αν ναι τότε
τι σημαίνει ESP όταν η στοίβα είναι άδεια;

Η εγγραφή φορτωτών λειτουργικού συστήματος, προγραμμάτων οδήγησης, επανεγγραφή περιοχών μνήμης και άλλες εργασίες για εργασία με υπολογιστή υλοποιούνται με χρήση του assembler. Επιλεγμένα βιβλία για τη γλώσσα συναρμολόγησης θα σας βοηθήσουν να κατανοήσετε την αρχή λειτουργίας μιας γλώσσας προσανατολισμένης στη μηχανή και να την κατακτήσετε.

1. Revich Yu – Πρακτικός προγραμματισμός μικροελεγκτών Atmel AVR σε γλώσσα assembly, 2014.

«Νέο αίμα» στον τομέα του προγραμματισμού μικροελεγκτών. Τα χαρακτηριστικά του Atmel AVR περιγράφονται αναλυτικά, υπάρχει λίστα με εντολές και έτοιμες συνταγές - assembler με παραδείγματα. Ενα καλό πράγμαγια ραδιοερασιτέχνες και μηχανικούς, αν και είναι επίσης κατάλληλο για αρχάριους κωδικοποιητές: η ιστορία, οι οικογένειες και οι δυνατότητες του AVR MK θίγονται. Αξίζει να σημειωθεί ότι η εισαγωγή είναι λακωνική και γρήγορα μπαίνει στην ουσία, οπότε δεν υπάρχει λόγος να παραπονιόμαστε για τους στίχους.

2. Καλάσνικοφ Ο. – Η γλώσσα συναρμολόγησης είναι απλή. Μαθαίνοντας να προγραμματίζω, 2011

Μια πραγματική έκταση για αρχάριους που εξακολουθούν να γκουγκλάρουν βασική ορολογίακαι αναζητήστε ένα σεμινάριο assembler. Αυτός είναι. Εκτός από την εξοικείωση με τη γλώσσα και τα πρώτα προγράμματα, καλύπτονται επίσης σημεία πόνου– διακοπές: κάτι απλό, αλλά στην αρχή δυσνόητο. Με κάθε κεφάλαιο, τα μαθήματα assembler γίνονται πιο περίπλοκα και στο τέλος ο αναγνώστης θα μπορεί να γράφει προγράμματα σε assembler, να τα βελτιστοποιεί, να δουλεύει με ιούς, antivirus, μνήμη και συστήματα αρχείων.

3. Ablyazov R. – Προγραμματισμός γλώσσας συναρμολόγησης στην πλατφόρμα x86-64, 2011

Η έμφαση δίνεται στη λειτουργία του επεξεργαστή σε προστατευμένη λειτουργία και σε λειτουργία long. Αυτή είναι μια απαραίτητη βάση για τον προγραμματισμό στα Win32 και Win64, η οποία επηρεάζει τις εντολές του assembler, τις διακοπές, τη μετάφραση και τους μηχανισμούς προστασίας, λαμβάνοντας υπόψη τις διαφορές λειτουργίας. Εξετάζεται η ανάπτυξη παραθυρωμένες εφαρμογέςκαι οδηγούς. Αυτό το σεμινάριο assembler κατάλληλο για αρχάριουςκωδικοποιητές και εκείνοι που μεταπήδησαν αμέσως στον προγραμματισμό της γλώσσας assembly, αλλά δεν κατάλαβαν καλά την πλατφόρμα υλικού x86-64.

4. Stolyarov A. – Προγραμματισμός σε γλώσσα συναρμολόγησης NASM για Unix OS, 2011.

Από την ορολογία μέχρι την αλληλεπίδραση με το λειτουργικό σύστημα, αυτό είναι, χωρίς υπερβολή, ένα από τα καλύτερα διδακτικά βοηθήματα. Για όσους θέλουν να μάθουν προγραμματισμό συναρμολόγησης αλλά δεν θέλουν να υπερφορτώνουν τα ράφια τους, αυτό το εγχειρίδιο είναι αρκετό. Η σύνταξη της γλώσσας συναρμολόγησης NASM περιγράφεται λεπτομερώς, καταχωρούνται και μνήμη, λειτουργίες διαφορετικής πολυπλοκότητας, αγγίζονται εντολές και δίνονται επίσης παραδείγματα.

Στα σύγχρονα λειτουργικά συστήματα, είναι προβληματική η εκτέλεση εργασιών HS&T, για να το θέσω ήπια. Για να γράψετε δοκιμές και απλώς να κατακτήσετε τις αρχικές δεξιότητες, πρέπει να κατανοήσετε τον μεταγλωττιστή MASM ή TASM, που λειτουργούν στο DOS.
Οι ίδιοι οι μεταγλωττιστές, οι σύνδεσμοι και όλα τα άλλα gadget μπορούν να βρεθούν, για παράδειγμα, στη διεύθυνση http://kalashnikoff.ru/ ή http://www.wasm.ru/. Και εδώ θα μιλήσουμε για το τι είναι πιο κοντά στο σώμα.

Απαραίτητα εργαλεία και η διαμόρφωσή τους.

Και λοιπόν τι χρειαζόμαστε. Χρειαζόμαστε έναν εξομοιωτή τερματικού DOS και έναν μεταγλωττιστή. Επέλεξα το MASM 6.11 ως μεταγλωττιστή, επειδή το είχα χρησιμοποιήσει στο παρελθόν, και είχα ήδη κάποιο στη μνήμη μου, προτείνω το DOSBox ως εξομοιωτή DOS. Υπάρχουν εκδόσεις τόσο για Windows όσο και για Linux. Στο Linux μπορεί να εγκατασταθεί από το τυπικό αποθετήριο. Για το Ubuntu:
$sudo apt-get install dosbox ή από το Application Center.
Μόλις εκκινήσετε, θα δείτε μια οθόνη προτροπής:
Z:\> Τοποθετήστε τη μονάδα δίσκου C:\ για να κάνετε αυτόν τον τύπο:
Z:\>mount c /home/user/folder_prodject Και μεταβείτε σε αυτό:
Z:\>c: με την εντολή dir μπορείτε να δείτε τα περιεχόμενα του καταλόγου και με την εντολή cd directory_name μπορείτε να μετακινηθείτε σε άλλο φάκελο που βρίσκεται στο σημείο προσάρτησης ή στους υποφακέλους του.
Παράδειγμα για το έργο μου:


Εάν εργάζεστε πολύ σε έναν εξομοιωτή DOS, τότε αυτή η μέθοδος μπορεί να μην είναι πολύ βολική. Αλλά μπορείτε να διαμορφώσετε την αυτόματη τοποθέτηση της μονάδας δίσκου C:\
Ανοίξτε το /home/user/.dosbox/dosbox-0.74.conf στο πρόγραμμα επεξεργασίας και αναζητήστε τις γραμμές:
# Οι γραμμές σε αυτήν την ενότητα θα εκτελούνται κατά την εκκίνηση. # Yju μπορείτε να βάλετε τις γραμμές σας MOUNT εδώ. και γράψε κάτι σαν αυτό:
mount C /home/user/asm PATH=%PATH%;C:\masm611\bin\ C: Κατά την εκκίνηση, η μονάδα δίσκου C:\ θα τοποθετηθεί στο /home/user/asm και αυτός ο κατάλογος πρέπει να υπάρχει. Το PATH ορίζει διαδρομές αναζήτησης για προγράμματα, αυτό είναι απαραίτητο για να μην στριμώχνουμε σε έναν κατάλογο, αλλά να έχουμε την ευκαιρία να διαχωρίσουμε τον μεταγλωττιστή και το έργο σε διαφορετικά. Στο τέλος υπάρχει το C: ώστε το DOSBox να μας μεταφέρει αυτόματα στον δίσκο C:\ και να φροντίζει τις κινήσεις μας.


Η τελευταία εικόνα δείχνει την εντολή cd και dir, προσέξτε πώς εμφανίζονται τα ονόματα αρχείων που είναι γραμμένα με ρωσικά γράμματα. Μπορεί να είναι δυνατό να το αντιμετωπίσουμε, αλλά το χρειαζόμαστε; Και μην ξεχνάτε ότι το MS-DOS χρησιμοποιούσε ονόματα αρχείων σε μορφή 8.3. Δηλαδή, κατανεμήθηκαν 8 χαρακτήρες για το όνομα, ακολουθούμενο από μια τελεία (.) και στη συνέχεια η επέκταση αρχείου. Άλλα ονόματα μπορεί επίσης να δημιουργήσουν προβλήματα.

Πώς να χρησιμοποιήσετε το MASM 6.11.

Τώρα ας δούμε πώς να μεταγλωττίσουμε τον κώδικα που θα γράψουμε.
C:\>ml /c filename.asm παίρνουμε το αρχείο filename.obj Ο διακόπτης /c λέει στον μεταγλωττιστή να μην συνδεθεί.
C:\>link file_name.obj θα λάβουμε το εκτελέσιμο αρχείο.
Αλλά μπορείτε να το κάνετε πιο γρήγορα:
C:\>ml file_name.asm /AT Σε αυτή την περίπτωση θα λάβουμε και ένα αρχείο .obj και ένα εκτελέσιμο.com. Η σημαία /AT λέει στον μεταγλωττιστή να καλέσει τον σύνδεσμο και του μεταβιβάζει τη σημαία /T που υποδηλώνει το μοντέλο TINY.
Χρειάζεστε επίσης συχνά ένα αρχείο λίστας προγραμμάτων, για αυτό χρησιμοποιήστε το πλήκτρο /Fl:
C:\>ml filename.asm /Fl Το αρχείο καταχώρισης θα γραφτεί στο filename.lst

Γράφουμε ένα πρόγραμμα.

Αυτό ήταν, το πιο δύσκολο κομμάτι τελείωσε. Τώρα αρχίζουμε να γράφουμε ένα πρόγραμμα στο assembler.
Δεδομένου ότι τα προβλήματα συχνά ζητούν να εμφανίζεται η λύση των τύπων στην οθόνη, θα αναλύσουμε ένα παρόμοιο παράδειγμα. Άθροισμα διαιρέσεων με x= από 1 έως 10:

Βασικές εντολές που θα χρησιμοποιήσουμε

Μητρώα, ω αυτά τα μητρώα. Μια σύντομη εκδρομή.

Τώρα, για να ξεκινήσετε την ανάγνωση του κώδικα, αρκεί να γνωρίζετε τα μητρώα γενικού σκοπού:
Μπορούν να είναι 8 bit (για παράδειγμα, al, ah), 16 bit (για παράδειγμα, ax) και 32 bit (για παράδειγμα, eax).
Όλοι οι καταχωρητές 16-bit χωρίζονται σε low και high, για παράδειγμα, το ax χωρίζεται σε al και ah. Η διαίρεση των μέσων αποτελείται, όχι μια μαθηματική πράξη.
eax, ax, al - πολύ συχνά λειτουργούν ως δέκτης τιμών, για παράδειγμα, κατά τον πολλαπλασιασμό και τη διαίρεση.
ebx, bx. bl, bh - δωρεάν μητρώο που μπορεί να χρησιμοποιηθεί στην ουρά και τη χαίτη.
edx, dx - χρησιμοποιείται συχνά για προώθηση Επιπλέον πληροφορίεςή το υπόλοιπο της διαίρεσης.
ecx, cx - ονομάζεται μετρητής, που χρησιμοποιείται σε βρόχους.
Όλα τα άλλα είναι στα σχόλια του προγράμματος. Παρεμπιπτόντως, το ερωτηματικό (;) χρησιμοποιείται ως εντολή για την έναρξη ενός σχολίου και ό,τι γράφεται μετά από αυτό στη γραμμή δεν ερμηνεύεται από τον μεταγλωττιστή

Προπονούμαστε

Το πρώτο πράγμα που χρειαζόμαστε είναι να αποσυνθέσουμε το παράδειγμά μας σε απλά στοιχεία για να δημιουργήσουμε έναν αλγόριθμο. Για παράδειγμα: x σε κύβους είναι x*x*x. Ας θυμηθούμε: ο πολλαπλασιασμός είναι mul, δηλαδή μπορούμε να τον γράψουμε:
mov ax,1 ; εκχωρήθηκε η τιμή mul ax ; πολλαπλασιάστηκε για πρώτη φορά, δηλαδή, τετράγωνο mul ax ; πολλαπλασιάζεται για δεύτερη φορά, δηλαδή σε κύβους Έτσι γίνεται βήμα-βήμα.

Και τώρα η λίστα της ίδιας της λύσης του παραδείγματος:

.ΜΟΝΤΕΛΟ μικροσκοπικό ; ορίστε το μοντέλο σε αυτήν την περίπτωση.com .ΚΩΔΙΚΟΣ .486 ; υποδεικνύουν το μοντέλο του επεξεργαστή org 100h. εκχώρηση μνήμης έναρξη: mov ecx,10 ; ορίστε τον αριθμό των κύκλων. 10 γιατί έχουμε x από 1 έως 10 Lb1: ; ορίστε την ετικέτα για τον κύκλο mov eax,11 ; βρείτε x sub eax,ecx; x=11-αριθμός κύκλων (1, 2, 3... 11-1=10) push ecx ; αποθηκεύστε το cx στη στοίβα για χρήση στον βρόχο ώθησης eax. ας σώσουμε τσεκούρι στη στοίβα για να μην χρειάζεται να το υπολογίζουμε άλλο mul eax ? x^2 (^ - θα σημαίνει "στο βαθμό") mov ecx,eax ; Ας αποθηκεύσουμε το eax σε ecx και μετά θα χρειαστεί να αφαιρέσουμε το mov ebx,3 ; ebx = 3 mul ebx ; 3x^2 sub eax,1 ; 3x^2-1 mov ebx,eax ; αποθηκεύστε eax στο ebx τότε θα χρειαστείτε pop eax. επαναφέρουμε το eax αφού ήδη χρειαζόμαστε ξανά eax = x push ebx ; και αποθηκεύστε ebx γιατί αργότερα θα χρειαστούμε mov ebx,eax ; ebx = eax mov eax,ecx ; θυμηθείτε ecx=x^2, τώρα eax = ecx, αλλά θα μπορούσατε απλώς να πολλαπλασιάσετε το mul ebx ; eax = x^3 mov ebx,4 ; ebx = 4 mul ebx ; eax = 4x^3 sub eax,ecx ; eax = 4x^3-x^2 προσθέστε eax,2 ; eax = 4x^3-x^2+2 pop ebx ; επαναφορά ebx mov a,eax ; μέρισμα (a είναι μια μεταβλητή) mov z,ebx ; ο διαιρέτης (το z είναι επίσης μεταβλητή) περιγράφονται στο τέλος του προγράμματος finit. αρχικοποιήστε τον συνεπεξεργαστή fld a ; μέρισμα στον συνεπεξεργαστή fdiv z ; πραγματοποιήστε τη διαίρεση στην κλήση του συνεπεξεργαστή tEnter. Αυτή είναι μια κλήση συνάρτησης που μεταφράζει την κλήση συμβολοσειράς pFloat. έξοδος του αποτελέσματος διαίρεσης στην κονσόλα @4: fadd t ; προσθέστε το προηγούμενο αποτέλεσμα διαίρεσης για να λάβετε το άθροισμα. τιμές συνάρτησης (t είναι μια μεταβλητή) fst t ; αποθηκεύστε το ποσό στη μεταβλητή pop ecx. αφαιρέστε το ecx από τη μνήμη για σωστή λειτουργίαβρόχος βρόχος Lb1 ; μεταβείτε στην ετικέτα Lb1 έως ότου η ecx γίνει ίση με μηδενική κλήση pEnter. Αυτή είναι μια κλήση συνάρτησης που μεταφράζει την κλήση συμβολοσειράς pFloat. άθροισμα εκτύπωσης((4x^3-x^2+2)/(3x^2-1)) για x από 1 έως 10 σε προσαυξήσεις 1 int 20h ; Τερματισμός του προγράμματος (αυτό ονομάζεται, διακοπή κλήσης 20 ώρες) ret ; τέλος του μπλοκ? τότε αρχίζει η πραγματική μαγεία τυπώνει έναν ακέραιο αριθμό pInt: pushad ; αποθήκευση όλων των καταχωρητών mov bx,sp ; bx = sp mov byte ptr ss:,"$" ; χαρακτήρας τέλους γραμμής @1:cdq ; ετικέτα κύκλου. και η εντολή cdq αντιγράφει το bit πρόσημου του καταχωρητή eax στο. όλα τα μπιτ καταχωρητή edx div ecx ; διαιρέστε τον αριθμό με τη βάση edx - υπόλοιπο, eax - πηλίκο προσθήκη dl,"0" ; μετατροπή σε ASCII dec bx ; μείωση bx κατά 1 mov ss:,dl ; προσθέστε στη γραμμή πριν από την προηγούμενη δοκιμή eax,eax ; τσεκαρε αν υπαρχει κατι αλλο στο eax jne @1 ; αν υπάρχει, επαναλάβετε τον κύκλο mov ax,ss ; εμφάνιση της συμβολοσειράς στην οθόνη mov ds,ax ; ds = ax dec bx ; μείωση bx κατά 1 mov dx,bx ; dx = bx xchg sp,bx ; αν δεν το ανταλλάξεις θα βγουν σκουπίδια mov ah,9? αριθμός συνάρτησης διακοπής int 21h ; διακοπή κλήσης xchg sp,bx ; αν δεν ανταλλάξετε το πρόγραμμα θα τελειώσει το popad? επαναφορά δεδομένων από τη στοίβα ret εκτυπώνει τον αριθμό pFloat: pushad ; αποθήκευση όλων των καταχωρητών mov ecx,10 ; ορίστε τη βάση του συστήματος αριθμών push ecx ; αποθήκευση της βάσης mov bp,sp ; bp = sp fst dword ptr ss: ; έξοδος από τον συνεπεξεργαστή ως διπλή λέξη στον καταχωρητή ss xor eax,eax ; επαναφορά eax (xor binary ή) mov edx,ss: ; edx = ss: shl edx,1 ; μετατοπίστε όλα τα bit στο edx κατά 1 προς τα αριστερά mov ecx,edx. ecx = edx shr ecx,24 ; μετατοπίστε όλα τα bit στο ecx προς τα δεξιά κατά 24 sub cx,126 ; αφαιρέστε τα cx 126 - Σειρά (εκθέτης) shl edx,7 ; μετατόπιση edx προς τα αριστερά κατά 7 ή edx,80000000h ; σημαντικά bits (mantissa) shld eax,edx,cl ; eax - ακέραιο μέρος shl edx,cl ; edx - κλασματικό μέρος pop ecx? αποθήκευση ecx call pInt ; εμφάνιση ολόκληρου του τμήματος κλασματικό μέρος xchg eax,edx ; ανταλλακτική αξία cdq ; μετατρέψτε τη διπλή λέξη σε τετραπλή λέξη sub bp,28 ; αφαιρώ από bp 28 mov byte ptr ss:,"." ; προσθήκη δεκαδικού διαχωριστικού @2:mul ecx ; πολλαπλασιάστε με τη βάση 10 προσθέστε dl,"0" ; μετατροπή σε ASCII inc bp ; αύξηση bp κατά ένα mov ss:,dl ; Προσθέστε test eax, eax στη γραμμή. ελέγξτε αν υπάρχουν άλλα δεκαδικά ψηφία jne @2 ; Ναί; επαναλάβετε το βρόχο mov byte ptr ss:,"$" ; Οχι; προσθέστε ένα σύμβολο τέλους γραμμής, διαφορετικά θα βγει garbage sub sp,32 ; βάλε τη γραμμή κανονική κατάσταση push ss pop ds mov dx,sp ; το βάζουμε στο dx από εκεί που είναι και θα εκτυπώσουμε mov ah,9 ; λειτουργία διακοπής διακοπή int 21h ; κλήση διακοπής κλήσης nEnter ; καλέστε τη συνάρτηση νέας γραμμής add sp,32 ; επαναφορά sp popad? επαναφορά καταχωρητών ret ;βοηθητική συνάρτηση - μεταφράζει τη συμβολοσειρά nEnter: pushad mov dx,offset str0 mov ah,9 int 21h popad ret ;βοηθητική συνάρτηση, εκτυπώνει τη συμβολοσειρά "Temp αποτέλεσμα:" tEnter: pushad mov dx,offset str1 movah, int 21h popad ret ;helper function, εκτυπώνει τη συμβολοσειρά "Αποτέλεσμα:" pEnter: pushad mov dx,offset strE mov ah,9 int 21h popad ret ;μεταβλητές a dd ? z ηη ? t dd 0 str0 db 10,13,"$" str1 db "Αποτέλεσμα θερμοκρασίας: ","$" strE db 10,13,"Αποτέλεσμα: ","$" τέλος έναρξης ; τέλος του προγράμματος

Συνιστούμε να διαβάσετε

Μπλουζα