Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 15003|Απάντηση: 0

[Αποσυναρμολόγηση] Λεπτομερής επεξήγηση της χρήσης της εντολής συναρμολόγησης JMP

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 3/11/2014 11:32:49 μ.μ. | | |
Όταν συνάντησα τον ακόλουθο κώδικα ενώ μάθαινα συμβολική γλώσσα, σκέφτηκα απλώς ότι το πρόγραμμα δεν μπορούσε να τελειώσει κανονικά. Ωστόσο, μετά τον εντοπισμό σφαλμάτων παρακολούθησης σε ένα βήμα, διαπιστώθηκε ότι το πρόγραμμα μπορούσε να τελειώσει κανονικά και συνέβη ένα περίεργο φαινόμενο: όταν το πρόγραμμα άρχισε να εκτελείται από τον κωδικό:0005 στον κωδικό:0014, συνέχισε να μεταβαίνει στον κωδικό:0008 με την εντολή jmp. Ωστόσο, όταν συνεχίζει να εκτελεί ένα βήμα προς τα εμπρός, το πρόγραμμα μεταβαίνει απευθείας στον κωδικό:0 αντί για τον κωδικό:0018 (δηλαδή, τον προσδιορισμό του τμήματος S1). Στην αρχή, δεν καταλάβαινα τι συνέβαινε, αλλά μετά από πολλές παρατηρήσεις ενός βήματος, ένιωθα ακόμα περίεργα. Αφού μελέτησα προσεκτικά τη χρήση των εντολών JMP στο σχολικό βιβλίο [1] και στη συνέχεια ανέλυσα το πρόγραμμα σε συνδυασμό με τον κώδικα μηχανής, έχω μια νέα κατανόηση των εντολών JMP.

Οδηγίες μηχανήματος μετατόπισης διεύθυνσης κωδικού (IP).  

Υποθέστε cs:code (μονάδα: h)

Τμήμα κώδικα

        AX MOV, 4C00H 0000 B8004C   

        int 21h 0003 CD21

start:  mov ax,0            0005         B80000

    S: NOP 0008 90

        NOP 0009 90

        mov di, μετατόπιση s 000A BF0800

        mov si, μετατόπιση s2 000D BE2000        

        mov ax,cs:[si] CS:0020=F6EB

        mov cs:[di],ax CS:0008=9090

    S0: JMP Σορτς S 0016 EBF0

    s1: MOV AX,0 0018 B80000

        int 21h 001B CD21

        mov ax, 0 001D B80000

    S2: JMP Σορτς S1 0020 EBF6

        NOP 0022 90

Ο κώδικας τελειώνει

Τέλος Έναρξη

1. Τα ακόλουθα δύο σημεία πρέπει να γίνουν κατανοητά με σαφήνεια
1. Η διαδικασία εκτέλεσης εντολών CPU είναι η εξής:
<1>. Διαβάστε την εντολή από τη μονάδα μνήμης που υποδεικνύεται από το CS:IP και τοποθετήστε την στην προσωρινή μνήμη εντολών.
<2>. IP=IP+Το μήκος της εντολής που διαβάζεται αυτήν τη στιγμή στο buffer, δηλαδή, η IP δείχνει στην επόμενη εντολή.
<3>. Εκτελέστε την τρέχουσα εντολή στο buffer. Μεταβείτε στο βήμα <1>
2. Η έννοια της σύντομης εντολής jmp για τη μεταφορά του εσωτερικού τμήματος
<1>. Η IP είναι η μετατόπιση, δηλαδή η διεύθυνση στο IP = προσδιοριστής - η διεύθυνση του πρώτου byte μετά την εντολή jmp.
<2>. Η λειτουργία αυτής της εντολής είναι να τροποποιήσει την τιμή της IP και μετά την εκτέλεση της εντολής, IP = IP + 8 bit offset
< 3> και 8 bit έχουν εύρος μετατόπισης -128~127 και η μετατόπιση εκφράζεται με τη μορφή συμπληρώματος [2].
2. Ανάλυση κώδικα
1. Βήμα 1: Το πρόγραμμα αρχίζει να εκτελείται από την αρχή εισόδου (κωδικός:0005), όταν εκτελείται η δήλωση code:0013~0014, ο κωδικός μηχανής της δήλωσης jmp short S1 στην ετικέτα S2 αντιγράφεται στον κωδικό:0008 και η IP είναι 0016. Αυτή τη στιγμή, υποθέτοντας ότι δεν υπάρχει εντολή jmp short s, το πρόγραμμα θα εκτελεστεί στο s2:jmp short s1, διαβάστε το jmp short s1 στο buffer εντολών και IP=0022. και η μεταφορά από το s2 στο s1 είναι η μεταφορά εντός τμήματος, η μορφή κωδικού μηχανής είναι EB disp και disp=ονομασία s1-ονομασία s2=(00018-0022) complement=F6, επομένως ο κωδικός μηχανής της εντολής jmp short s1 θα πρέπει να είναι EBF6. Επομένως, το EBF6 αντιγράφεται στη μονάδα code:0008~code:0009.
2. Βήμα 2: Διαβάστε την εντολή jmp short s (EBF0) στο buffer εντολών,
IP=IP+0002=0018; ο κωδικός συμπληρώματος της ονομασίας s-ονομασία s0=(0008-0018) = F0 και η μεταφορά από το s0 στο s είναι η μεταφορά εντός τμήματος και η μορφή κωδικού μηχανής είναι EB disp (δηλαδή, EBF0)
3. Βήμα 3: Η εντολή jmp short s(EBF0) είναι μια εντολή για την τροποποίηση της IP, μετά την εκτέλεση της εντολής EBF0, IP=IP+(ονομασία s-ονομασία s0)=0008, δείχνοντας τη μονάδα code:0008.
4. Βήμα 4: Διαβάστε το περιεχόμενο του κωδικού μονάδας:0008. Δεδομένου ότι η εντολή jmp short s1 (EBF6) στο s2 αντιγράφεται στη μονάδα code:0008~code:0009, αφού διαβάσετε τα περιεχόμενα της μονάδας, IP=IP+0002=000A
5. Βήμα 5: Η εντολή jmp short s1 (EBF6) είναι μια εντολή για την τροποποίηση της IP, μετά την εκτέλεση της εντολής EBF6, IP=IP+(ονομασία s1-ονομασία s2)=0000, δείχνοντας τον κωδικό:0000 μονάδα.
6. Βήμα 6: Το πρόγραμμα πηγαίνει στον κωδικό:0000 για εκτέλεση, δηλαδή ολοκληρώνεται το κανονικό τέλος.
3. Υστερόγραφο
Αναλύστε σωστά αυτόν τον κώδικα: Θέλετε να κατανοήσετε τη διαδικασία εκτέλεσης εντολών CPU και jmp short; (υπολογιζόμενο με τροποποίηση IP). Επιπλέον, ο κωδικός συμπληρώματος του αποτελέσματος υπολογισμού μετατόπισης είναι επίσης ένα κλειδί. Αφού ανέλυσα αυτόν τον φαινομενικά μη φυσιολογικό κώδικα, απέκτησα μια βαθύτερη κατανόηση των οδηγιών JMP στη συναρμολόγηση.





Προηγούμενος:Εκδήλωση "Sim Couple" για την Ημέρα των Εργένηδων
Επόμενος:Πώς να χρησιμοποιήσετε λεπτομερώς την περίληψη σε Java
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com