|
Όταν συνάντησα τον ακόλουθο κώδικα ενώ μάθαινα συμβολική γλώσσα, σκέφτηκα απλώς ότι το πρόγραμμα δεν μπορούσε να τελειώσει κανονικά. Ωστόσο, μετά τον εντοπισμό σφαλμάτων παρακολούθησης σε ένα βήμα, διαπιστώθηκε ότι το πρόγραμμα μπορούσε να τελειώσει κανονικά και συνέβη ένα περίεργο φαινόμενο: όταν το πρόγραμμα άρχισε να εκτελείται από τον κωδικό: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 στη συναρμολόγηση.
|