Η οδηγία ORG και πραγματική μετατοπίσεις

Αποποίηση ευθυνών για περιεχόμενο της Γνωσιακής βάσης που έχει αποσυρθεί

Αυτό το άρθρο αφορά προϊόντα για τα οποία η Microsoft δεν παρέχει πλέον υποστήριξη. Συνεπώς, το παρόν άρθρο παρέχεται "ως έχει" και δεν θα ενημερώνεται πλέον.

Σύνοψη

Η οδηγία ORG στο MASM δεν παράγει αναγκαστικά μια πραγματική μετατόπιση που ταιριάζει με την απόσταση που καθορίζεται από την "ORG XXX". Για παράδειγμα, εάν χρησιμοποιείτε "ORG 100h" στο πρόγραμμα, ο κώδικας που ακολουθεί θα δεν πάντα ξεκινούν από το 100h μετατόπιση σε σχέση με την έναρξη του τμήματος αγοράς.


Όταν χρησιμοποιείτε ένα αρχείο προέλευσης δεδομένων .COM και υπάρχει μόνο μια λειτουργική μονάδα, την "ORG 100h" θα έχει ως αποτέλεσμα μια πραγματική μετατόπιση από 100h για τον κώδικα που ακολουθεί την πρόταση του Οργανισμού. Αυτή η συμπεριφορά παρουσιάζεται επίσης με τμήματα αγοράς με την εντολή AT συνδυάσετε τύπο (οπότε δεν συνδυάζονται τμήματα από το πρόγραμμα σύνδεσης και δεν υπάρχουν δεδομένα ή κώδικα που έχει καθοριστεί).


Ωστόσο, εάν έχετε πολλαπλές λειτουργικές μονάδες ή/και δεν είστε με ένα αρχείο προέλευσης δεδομένων .COM, το "ORG 100h" παράγει μια πραγματική μετατόπιση, που είναι κάπως μεγαλύτερο από 100h.


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

Περισσότερες πληροφορίες

Στην παρακάτω εικόνα (εξετάζει τις παρακάτω ενότητες προέλευσης), σημειώστε ότι η οδηγία ORG αυξάνει την τοπική μετατόπιση από 100h, με αποτέλεσμα η μετατόπιση της οδηγίας PUSH στο example2 είναι 100h (δηλαδή τι θα αναφερθεί στο αρχείο λίστας). Ωστόσο, όταν συνδέονται οι λειτουργικές μονάδες, ενωθούν όλα τα τμήματα του τμήματος κώδικα. Έτσι, το EXAMPLE2.asm:code:100h μετατρέπεται σε κώδικα: 113 h. Η σειρά των αλληλουχία είναι η σειρά των συνδέσεων.


Το παράδειγμα που ακολουθεί παρουσιάζει το σενάριο:

     Actual                      Offset     offset                      from start
from of segment
code code in module
------- ---------------
+-----------------+
0117 | ret | 0105
0116 | pop | 0103 test2.asm
0114 | mov | 0101
0113 | push | 0100
0013 | org | 0000
+-----------------+
0012 | ret | 0004
0011 | pop | 0003 test1.asm
000F | mov | 0001
000E | push | 0000
+-----------------+
000C | int | 000C
0009 | mov | 0009 testmain.asm
0006 | call | 0006
0003 | call | 0003
0000 | mov | 0000
+-----------------+
segment code


|---------------testmain.asm: |---------------test1.asm:
code segment public 'code' PUBLIC _test
assume cs:code code segment public 'code'
assume cs:code
mov ax, 0a0ah _test proc

extrn _test:proc push bp
extrn _test2:proc mov bp, sp

call _test pop bp
call _test2 ret

mov ax, 4c00h _test ENDP
int 21h code ends
code ends

END END



|---------------test2.asm:
code segment public 'code'
assume cs:code
org 100h

PUBLIC _test2
_test2 PROC

push bp
mov bp, sp

pop bp
ret

_test2 ENDP
code ends
END

Ιδιότητες

Αναγνωριστικό άρθρου: 39441 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια