Structura de segmente de programe
Cum conceptul de segmente de memorie este reflectată în structura programului? Trebuie remarcat faptul că structura programului este determinată, pe de o parte, arhitectura procesorului (în cazul în care accesul de memorie este posibilă numai cu ajutorul segmentelor, atunci programul, probabil, ar trebui să constea din segmente), iar pe de altă parte - caracteristicile sistemului de operare sub care această programul va rula. În cele din urmă, pe structura programului și este, de asemenea, afectată de regulile de traducător selectat - compilatoare diferite impun cerințe oarecum diferite cu privire la codul sursă al programului. În pregătirea pentru această carte traducere și depana programele exemplu pachetul de utilizat TASM 5.0 Corporation Borland International; este convenabil, în special, prezența ferestre multiple debugger vizual. Această problemă, cu toate acestea, nu este critică, iar cititorul poate depana exemplele date în cartea utiliza orice asamblor familiarizat în prealabil cu descrierea acestuia.
Programul Exemplu 1-1.Prostaya cu trei segmente
; Se specifică segmentul corespunzător înregistrează segmente
presupunem CS: cod, DS: date
; Vom descrie segmentul de date
segment de date; date segmente deschise
msg db programul“se execută $„, șirul de ieșire
date se termină; Închideți segmentul de date
; Descriem segmentul de stivă
stk segmentul stivă; segmentul Deschideți stivă
db 256 DUP (?), îndoaie stiva 256 octeți
stk se termină; Închideți segmentul de stivă
end începe, punctul final de introducere a textului
Trebuie remarcat faptul că programul textul sursă de intrare de la tastatură pot fi utilizate atât litere pretat litere mici; traducător primește, de exemplu, MOV linie AX, DATA și mov ax, date în mod egal. Cu toate acestea, folosind tastele corespunzătoare pot fi făcute la compilator pentru a distinge între litere mari și mici în elementele individuale ale propunerilor. În această carte, în textul programului și descrierea literelor declarații lingvistice cu litere mici sunt folosite în principal, cu excepția registrul denumirilor care pentru claritate sunt marcate cu litere majuscule.
Programul 1-1 descrie trei segmente: segmentul de comandă cu numele de cod, segmentul de date numit de date si segmentul de stiva numit stk. Descrierea fiecărui segment începe cu segmentul de cuvinte cheie, precedat de un nume, și se termină cu sfârșitul cuvântului cheie, precedat de același nume, traducător să știe exact ce vrem să se încheie segmentul. Numele segmentelor sunt alese la întâmplare. Textul se încheie cu o directivă de asamblare de sfârșit de program, transmisia finală. Calitatea acestei directive operand specifică punctul de intrare în program; în acest caz începe marca.
Ordinea acestor segmente în program, de regulă, nu contează. Programul de multe ori începe cu segmentul de date, este oarecum mai ușor de citit programul, și, în unele cazuri, eliminarea posibila ambiguitate în interpretarea comenzilor care se leagă de date care nu a fost încă descrisă. Suntem la începutul programului este segmentul de meniu, urmat de - segmentul de date, iar în cele din urmă - un segment al stivei; acest aranjament oferă unele confort pentru depanare programe. Este important doar să se înțeleagă că în calculator segmentele de memorie vor cădea în aceeași ordine în care acestea sunt descrise în program (în cazul în care mijloacele speciale de asamblare nu stabilesc o ordine de boot de segmente în memorie).
Segmentele sunt introduse în program, utilizând directivele de asamblare și capetele segmentului. Care este directiva de asamblare? Pe tot parcursul programului sunt cuvintele cheie de două tipuri: (. Mov int) instrucțiunile CPU și directivele de compilare (în acest caz, termenii „traducător“ și „asamblare“ sunt sinonime, ceea ce înseamnă programul care convertește codul sursă scris în limbaj de asamblare în cod care va fi atunci când programul este perceput de către procesorul). Pentru directive de asamblare sunt indică începutul și sfârșitul capetelor și segmentele de segment; cuvinte cheie care descriu tipul de date utilizate (db, DUP); descriptori specifici, cum ar fi un teanc de segmente, și așa mai departe. e. Regulile sunt utilizate pentru a transmite informația de serviciu compilator, pe care îl folosește în cadrul programului de difuzare. Cu toate acestea, o parte a programului executabil, format din cod mașină, aceste linii nu cad, ca procesorul execută programul, acestea nu sunt necesare. Cu alte cuvinte, operatorii de capetele segmentului și nu sunt traduse în cod mașină, și sunt utilizate numai de asamblare la programul de traducere. Cu această întrebare ne vom întâlni atunci când se analizează listele de program.
O altă directivă de asamblare este utilizat în prima teză a programului:
Scopul programului 1-1 este de așteptat să încheie pe șirul text de ecran „Funcționează!“, Descris în segmentul de date. Următoarele sugestii ale programului efectua doar această operație. Acest lucru se face nu în mod direct, ci prin referire la sistemul de operare Utilități MS-DOS, care, pentru concizie ne vom referi de acum înainte, pur și simplu ca DOS. Faptul este că, în instrucțiunile procesorului și, în consecință, operatorii de limbaj de asamblare sunt comenzi pentru afișarea pe ecran (și instrucțiunile de intrare tastatură, scrie într-un fișier de pe disc, etc). Concluzie Chiar și un singur caracter pe ecran este de fapt o operațiune destul de complexă, care este necesar pentru a efectua o secvență lungă de instrucțiuni procesor. Desigur, această secvență de comenzi pot fi incluse în programul nostru, dar este mult mai ușor de a cere ajutor pentru sistemul de operare. Structura include un număr mare de programe de DOS, punerea în aplicare a funcțiilor standard, și în mod frecvent necesare - afișare și de intrare tastatură, scrie într-un fișier și a citit dintr-un fișier, citit sau pentru a seta ora curentă, alocarea sau Dealocarea, și multe altele.
Cum de a finaliza un program care rulează? De fapt, la sfârșitul programului - este o secventa destul de complex de operații, care include, printre altele, de memorie de presă ocupat pentru a finaliza programul, precum și provocarea programului de sistem (în mod special - pentru Command.com procesorul de comandă), care afișează cererea DOS și va fi de așteptare pentru următoarea declarație de comandă. Toate aceste acțiuni sunt realizate cu funcția DOS numărul 4Ch. Această funcție presupune că registrul AL este codul complet al programului nostru, pe care îl va transmite DOS. În cazul în care programul este de succes, codul de finalizare ar trebui să fie 0, deci suntem în aceeași propoziție mov ax, sarcină 4C00h în NA 4Ch și AL - 0 și sună familiar DOS instrucțiunea int 21h.
Pentru a efectua un proces de funcționare a programului de mai sus, acesta trebuie să fie mai întâi o elaborare și link-ul. Lăsați codul sursă este stocată într-un fișier numit P.ASM. Broadcast din ansamblul prin apelarea TASM.EXE folosind următoarele comenzi DOS;
Cheie / Z permite ieșirea la o sursă de program de linii de afișare de text în care asamblorul găsit de eroare (fără această căutare cheie ar trebui să efectueze eroare pentru o listare de difuzare).
Controale cheie / zi de cotitură în fișierul de informații obiect nu este necesară atunci când executarea programului, dar este utilizat de către debugger.
Cheie / n suprimă listarea listei de notație simbolică în program, din care a redus oarecum descriptiv de listare, dar a redus dimensiunea sa.
Parametrii care se confruntă în continuare defini numele de fișier ale originalului (P.ASM), obiect (P.OBJ) și listarea (P.LST). Este posibil să doriți să apelați în compilatorul linie pentru a specifica numele complete de fișiere cu extensiile lor, dar acest lucru nu este necesar, deoarece compilatorul implicit utilizează un extensiile de nume enumerate mai sus.
Linia are aspect Apel formularul de mai jos:
/ X aranjament cheie listarea suprima formarea, care în mod normal nu este necesară.
/ Comutator V transmite fișierul cu informații de pornire utilizat de către debugger. Care se confruntă și alți parametri indicați numele modulelor: obiect (R.OBJ) și de boot (R.EHE).
Ca și în studiul acestei cărți, va trebui să scrie și depana un număr mare de programe, este recomandabil să se creeze un fișier batch (numit, de exemplu, A.VAT) care automatizează executarea de același tip de operațiuni de difuzare și de aspect. Textul de fișier batch în forma sa cea mai simplă poate fi atât (presupunând că calea către directorul cu pachetul TASM a fost listat în parametrul de comandă PATH):
tasm / z / zi / n p, p, p
TLINK / x / v p, p
Rularea programului este R.EHE pregătit echipa r.ehe
Când descărcarea programului segmentele sunt introduse în memorie așa cum se arată în Fig. 1.9.
Fig. Programul 1.9.Obraz în memorie.