|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
Directive de asamblare. Operatori. Definirea si apelarea procedurilor. Transferul parametrilor. Instructiuni de intrare/iesire. | ||||||
|
||||||
Directive de segment
Segmentarea unui program se obtine cu ajutorul directivelor de asamblare,care
indica asamblorului modul de organizare a rezultatului "traducerii"
unorinstructiuni sau a datelor prelucrate de instructiuni. Se mai numescpseudoinstructiuni
deoarece nu genereaza cod. Directivele de segmentare pot fi:
I. simplificateII. complete
I. Directive de segmentare simplificate
Presupun declararea unui model de memorie, cu directiva .MODEL:
Sintaxa: .MODEL tip, unde <tip> poate fi:
1. TINY - considera implicit un singur segment (codul, datele, stiva suntcuprinse
in 64Ko) - numai referinte NEAR ;2. SMALL - permite cite un segment de cod,
date si stiva, si deci pot fiaccesate cu referinte NEAR (cel mai uzual model)
;3. MEDIUM - permite un segment de date si mai multe segmente de cod, deci codulpoate
fi si cu referinte de tip FAR ;4. COMPACT - permite un segment de cod si mai
multe segmente de date, decidatele pot fi cu referinta FAR ;5. LARGE - pot fi
mai multe segmente de cod sau de date (cod si date cureferinte FAR) ;6. HUGE
- asemanator 5, insa tablourile de date pot ocupa mai multe segmente(>64Ko),
deci si pointerii vor fi tot cu referinta FAR.
Directive segment:
.CODE anumei - seg. cod, anumei repr. numele segmentului (daca existamai multe
segmente de cod (model de memorie 3, 5 si 6) ; .DATA- seg. date initializate
cu referinta NEAR ; .DATA?- seg. date neinitializate cu referinta NEAR ; .CONS-
seg. date constante ; .FARDATA- seg. date initializate cu referinta FAR ; .FARDATA?-
seg. date neinitializate cu referinta FAR ; .STACK amarimei - seg. stiva, amarimei
repr. nr. de octeti ai stivei(implicit 1Ko) ;Observatii:
- Separarea segmentului de date permite interfatarea optima cu limbajelede nivel
inalt (C, Pascal).- Datele din segmentele definite cu .STACK, .DATA, .DATA?
sau .CONST suntplasate intr-un grup numit DGROUP. Fiecare noua directiva de
segmentare incheie segmentul anterior. - Directiva .MODEL precede orice alta
directiva de segment.Cel mai micmodel de memorie ce corespunde codului si datelor
va fi cel mai eficient. nume_seg SEGMENT aaliniereiacombinareiaclasai Parametrii comenzii contin informatii pentru asamblor si link-editor cuprivire la incarcarea si combinarea segmentelor.nume_seg - defineste numele segmentului. Segmentele cu nume identice sunttratate ca si cum ar fi acelasi segment. Exemplu: daca este nevoie sa se plaseze diferite portiuni ale unui singursegment in module sursa diferite, atunci segmentului ii este atribuit acelasinume in ambele module. aalinierei - defineste adresele de inceput si sfirsit ale zonei de memoriede la care poate fi selectata o adresa de inceput pentru segment. Valori posibile: BYTE- utilizeaza urmatoarea adresa de octet disponibila ; WORD- utilizeaza urmatoarea adresa de cuvint disponibila (*2) ; DWORD- utilizeaza urmatoarea adresa de dublu cuvint disponibila (*4) ; PARA - utilizeaza urmatoarea adresa de paragraf disponibila (*16),optiune implicita ; PAGE - utilizeaza urmatoarea adresa de pagina disponibila (*256). acombinarei - defineste modul de combinare a segmentelor cu acelasi nume.Valori posibile: PUBLIC - concateneaza toate segmentele cu acelasi nume. Toate deplasamentele sunt ajustate pentru a reprezenta distanta de la inceputulsegmentului. STACK - segmentul curent va face parte din segmentul de stiva ; COMMON - segmentele cu acelasi nume vor fi suprapuse, incepind la aceeasi adresa. Lungimea zonei rezultate este lungimea celui mai lung segment AT <expr.ads.> - segmentul curent va incepe la adresa respectiva ; Expresia adresa nu trebuie sa contina o referinta anticipata (o referinta la unsimbol definit ulterior acesteia in fisierul sursa). Uzual un astfel de segmentcontine date neinitializate (de exemplu, un buffer). aclasai - permite asocierea segmentelor cu nume diferite dar scopurisimilare in momentul editarii legaturilor. Astfel, segmentele cu acelasi tip declasa sunt incarcate impreuna in memorie indiferent de ordinea (secventiala saualfabetica) din sursa. Avem, de exemplu clasele: 'CODE', 'STACK', 'DATA'. In cazul folosirii directivelor de segment complete, segmentul se incheiecu directiva: nume_segENDS Grupuri de segmente Un grup este o colectie de segmente asociate cu aceeasi adresa 'depornire'. Se va folosi cƒnd se doreste organizarea unor tipuri de date insegmente separate in codul sursa, dar aceste tipuri de date trebuie sa fieaccesibile printr-un singur registru de segmente comun. Directiva GROUP permite gruparea segmentelor cu aceeasi semnificatie:nume_grup GROUP segment aa,segmenti... <nume_grup> - este simbolul atribuit adresei 'de pornire' a grupului. Observatie: - Toate etichetele si variabilele definite in cadrul segmentelor grupuluisunt legate de inceputul grupului, nu de inceputul segmentului in care suntdefinite. - <segment> - orice segment definit anterior sau o expresie SEG (operatorul SEG returneaza adresa segmentului unei expresii). Directiva ASSUME ASSUME reg_seg1:num_seg1......reg_seg4:num_seg4reg_seg - unul din cele 4 registre segment ; num_seg - poate fi:- nume segment declarat cu SEGMENT ;- nume grup declarat cu GROUP ;- o expresie de forma: SEG eticheta (vezi mai jos) ; SEG variabila ;- cuvintul cheie NOTHING, anuleaza definirile anterioare ;Exemplu: ASSUME NOTHING - anuleaza toate selectiile de registre segment efectuatede instructiunile ASSUME anterioare. Directiva ASSUME informeaza asamblorul asupra corespondentei dintre cele4 (eventual) segmente logice din program si cele 4 registre segment aferente,creind astfel premiza adresabilitatii corecte a instructiunilor si variabilelorprogramului. Incarcarea registrelor segment trebuie facuta, insa, in program.La asamblarea unei instructiuni cu referire la memorie, asamblorul: - determina in care segment logic apare operandul ;- determina din directiva ASSUME care este registrul segment ce contineadresa de baza a acelui segment logic ;- daca registrul segment gasit difera de cel utilizat implicit pentruinstructiunea respectiva, genereaza un prefix de modificare registru segment. Initializarea segmentelor 1. Registrele CS si IP sunt initializate prin specificarea unei adrese deinceput, cu directiva END: END adresa_inceput,unde adresa_inceput reprezinta adresa de la care va incepe executia programului.Registrul CS va fi initializat la incarcarea in memorie, registrul IP fiindinitializat cu 0. Valoarea initiala a registrului IP poate fi modificata cudirectiva ORG.2. Registrul DS trebuie initializat la adresa segmentului ca va fi folositpentru date. Adresa segmentului sau a grupului va fi incarcata in DS. Exemplu: _DATA SEGMENT WORD PUBLIC 'DATA' . ._DATA ENDS_TEXT SEGMENT BYTE PUBLIC 'CODE' ASSUMEcs:_TEXT,ds:_DATAstart: mov ax,_DATA movds,ax ._TEXT ENDS END start 3. Registrul SS este initializat automat la valoarea ultimului segment din codulsursa cu tipul de combinare STACK, SP fiind initializat automat la dimensiuneasegmentului stiva. Deci, SS:SP indica initial virful stivei.Observatie: Segmentul de stiva poate fi initializat sau reinitializat direct, prinintermediul instructiunilor de transfer. 4. Registrul ES nu este initializat automat. Operatori pentru atribute Operatorii pentru atribute sunt utilizati pentru urmatoarele scopuri: - generarea unor valori ce caracterizeaza variabilele sau etichetele ;- modificarea temporara a unor atribute ;- acces la cimpurile unei inregistrari. Operatori generatori de valori 1. SEG <eticheta> | <variabila> - aplicat unei variabile sau unei etichete genereaza valoarea segmentuluiacesteia. 2. OFFSET <eticheta> | <variabila> - aplicat unei variabile sau unei etichete genereaza adresa relativa(offset-ul) fata de adresa de baza a segmentului. 3. TYPE <eticheta> | <variabila> a) aplicat unei etichete genereaza valorile NEAR sau FAR ; b) aplicat unei variabile genereaza nr. de octeti ai variabilei (infunctie de modul de generare avem: 1-DB, 2-DW, 4-DD, 8-DQ, 10-DT). 4. LENGTH <variabila>- aplicat unei variabile genereaza lungimea in numar de elemente aacesteia (ex.: numarul de elemente ale unui vector). 5. SIZE <variabila>- genereaza numarul de octeti alocat unei variabile. Avem relatia:SIZE=LENGTH*TYPE Operatori modificatori de atribute Acesti operatori permit modificarea segmentului, a offset-ului, a tipuluivariabilei sau etichetei, in scopul utilizarii lor mai eficiente. 1. <tip> PTR <exp_adr> unde: <tip> - BYTE, WORD, DWORD, nume de structura, pentru variabile ; - NEAR, FAR, pentru etichete ; <expr_adr> - variabila, eticheta sau numar. Efect: asigneaza atributul specificat in stinga lui PTR (pointer operator)variabilei sau etichetei din dreapta: Exemple: INC BYTE PTR aBXi ;incrementeaza octetul cu adresa DS*16+BX MOV WORD PTR aDIi,99H ;incarca cuvintul cu adresa DS*16+DI cu 99H JMP DWORD PTR aBXi ;salt intersegment la adresa data de "pointer-ul" ;cu patru octeti de la adresa DS*16+BX - preluarea unui octet dintr-un vector de cuvinte si invers: ARR_B DB 100 DUP(?) ARR_W DW 50 DUP(?) . MOV AL,BYTE PTR ARR_Wa50i MOV DX,WORD PTR ARR_Ba20i Fara acest operator instructiunile de mai sus ar contine referinteincomplete, pe care asamblorul nu le poate trata.2. Modificare de segmente - utilizind operatorul de tip prefix ':' astfel:reg_seg:exp_adr, sau nume_seg:exp_adr (numai daca nume_seg apare intr-un ASSUME cu reg.segm.aferent), sau nume_grup:exp_adr. Exemple: MOV AX,DS:aBPi ; modifica MOV AX,SS:aBPi MOV CS:aBX+2i,AX ; modifica MOV DS:aBX+2i,AX Operatorul de modificare a segmentului determina generarea, la asamblareaprogramului, a unui octet prefix plasat la adresa anterioara codului operatieiinstructiunii respective. Operatorii SHORT, THIS, HIGH, LOW 1. SHORT - precizeaza ca o eticheta este la o distanta de maximum a-128;127ifata de instructiunea JMP/CALL ce se refera la aceasta eticheta. (are sens numaipentru salturile inainte, pentru celelalte asamblorul punindu-l automat).Exemplu: START: MOV AL,5 JMPSHORT ET . ET: JMPSHORT START ; redundant 2. THIS <tip>/<distanta> - defineste o data cu tipul specificat explicit, lapozitia curenta a contorului de locatii ; <tip> - BYTE, WORD, DWORD ; <distanta> - NEAR,FAR. Exemplu: ARR_B EQU THIS BYTE ; echivalent cu ADRBYTE LABEL BYTE ARR_W DW 10 DUP(?)sau: ET_FAR EQU THIS FAR ET_NEAR: ... Practic, este echivalent cu LABEL.3. HIGH, LOW - operatori de izolare a octetului dintr-un cuvint: HIGH <exp_adr> - returneaza partea mai semnificativa a unui cuvint ; LOW <exp_adr> - returneaza partea mai putin semnificativa. Exemplu: ;programul initializeaza un vector de 10 cuv.(20 octeti) cu caracterele;'A'..'T' ASSUME CS:CODE,DS:DATADATA SEGMENTTABB LABEL BYTETABW DW 10 DUP(?) ;vector de 10 cuvinteCHRE DB 'A'DATA ENDSCODE SEGMENT;START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET TABB MOV BX,SIZE TABW - 1 ; MOV CL,LENGTH TABW*2 ;10 cuvinte =20 octeti XOR CH,CH ;CX=contor iteratiiAG: MOV AL,CHRE MOV BYTE PTR aSIi,AL INC CHRE ;caracterul urmator INC SI SUB BX,TYPE TABW - 1 LOOP AG MOV AX,4C00H ; INT 21HCODE ENDS END START Observatie: Se va urmari programul, folosind Tech HELP-ul pt. instructiunile necunoscute. Definirea si apelarea procedurilor 1. Definirea procedurilor Inceputul unei proceduri in limbaj de asamblare poate fi definit cudirectiva PROC, iar sfirsitul procedurii cu directiva ENDP. Sintaxa:nume PROC aNEAR|FARi . instructiuni RET aconstantainume ENDP nume - identificatorul procedurii ; Procedurile sunt implicit de tip NEAR (poate fi apelata doar din segmentulde cod curent). La revenire, se 'descarca' stiva cu numarul de octeti dati de<constanta>. Daca <constanta> nu apare, se executa RET NEAR/FAR, in functie detipul procedurii. 2. Apelarea procedurilor Apelul unei proceduri (printr-o instructiune CALL) determina salvarea instiva a lui IP - pentru procedura NEAR, sau a lui CS si IP (in aceasta ordine !!) - pentru procedura FAR, dupa care se transfera controlul proceduriiprin incarcarea lui IP (sau IP si CS) cu adresa de start a procedurii. ASSUME CS:SEG1 ASSUME CS:SEG2 ÚAAAAAAAAAAAAAAAAAA¿ ÚAAAAAAAAAAAAAAAA¿ ÚAAAAAAA¿ ³ ³ ³ ³ ³ START AAAAA0 PROC1 PROC ³ ³ PQR PROC FAR ³ AAAAAAAAÙ ³ . ³ ³ ³ ³ . ³ ³ ³ ÚAAAAAA0 CALL ABC ³ ³ ³ ÚAAAAAAA0B0: MOV AL,2 ³ ÚAAAAAAAA0XYZ LABEL FAR ³ ³ 1 ³ ³ ³ ³ ³ ³ 1 ³ PROC1 ENDP ³ ³ ³ ³ ³ 2AAAA0ABC PROC NEAR ³ 1 ³ ³ 1 ³ . ³ 2 ÚAAAA0 RET 8 ³ 4 ³ . ³ 3 ³ ³ ³ 3 ³ Z DD XYZ ³ ³ ³ ³ ³ ³ ³ CALL Z 2AAAAAAAAAAÙ ³ ³ ³ ³ ³ A0: INC BX 2AAAAAAAAAA0 32AÙ ³ ³ ³ ³ . ³ ³ ³ ³ ³ . ³ ³ ³ AAAAAAAAAAAA0 RET ³ ³ ³ ³ ABC ENDP ³ ³ PQR ENDP ³ AAAAAAAAAAAAAAAAAAAÙ AAAAAAAAAAAAAAAAAÙ SEG1 ENDS SEG2 ENDS Fig.1 Apelarea si revenirea din procedura START 1 2 3 4 v3n13nomov ax,10 ;constanta 10 este <argument 3> push ax push arg2 ;o zona de memorie este <argument 2> push cx ;registrul CX este <argument 1> call addup ;se apeleaza procedura add sp,6 ;se distrug argumentele introduse, echivalent . ;cu RET 6 in addupaddup PROC NEAR push bp ;se salveaza BP, deoarece va fi modificat in procedura mov bp,sp mov ax,abp+4i ;AX<-<argument 1> add ax,abp+6i ;<argument 2> se aduna la <argument 1> add ax,abp+8i pop bp ;se reface BP retaddup ENDP Aplicatii:1. Analizati programul de mai sus (TAB.ASM). Observati cu Turbo Debugger-ul efectul operatorilor definiti anterior.Asignati segmentul DATA registrului ES. Modificati programul, (daca este nevoie), astfel incit sa fie corect. 2. Analizati programul KEY.ASM. 3. Sa se realizeze un program care sa aprinda LED-urile tastaturii, reprezentindu-se succesiv codul binar alcifrelor in baza 8. La sfirsit, programul va reface starea initiala a LED-urilor. Programul va contine - procedura trimitere octet comanda la tastatura;- procedura trimitere octet data la tastatura;- procedura temporizare;Indicatii:- adresa port LED-uri: 060h ;- cuvint de comanda: 0edh ;- cuvint de date: bitii 0-2 contin in ordine led-urile aferente tastelor Scroll - bit0, Num - bit1,respectiv Caps -bit2 (bit pe 1 inseamna LED aprins); Intre trimiterea celor 2 cuvinte se va face o bucla de temporizare. Starea celor 3 LED-uri se va citi fie din octetul cu adresa 0000:0497H, bitii 0-2, in ordinea descrisaanterior in cuvintul de date, fie din octetul cu adresa 0000:0417H, (bitii 4-6). La refacerea starii initiale bitii3-7 din octetul de date trebuie sa fie 0. Pentru informatii suplimentare se va folosi programul HELP (comanda HEsau HER); se va selecta I/O Port Map si apoi AT Keyboard. S-ar putea modifica starea LED-urilor tastaturii doarprin scrierea in memorie ?4. Analizati programul SOUND.ASM. Modificati-l astfel incit sa contina:- procedura programare timer pe o anumita nota muzicala, parametrii transmisi fiind adresa tabelului TABW,si indexul in acest tabel al notei respective; parametrii vor fi transmisi prin stiva;- procedura temporizare, folosind ca parametru continutul din SI si o bucla de temporizare LOOP;- programul principal va contine apelul acestor rutine cu anumite note muzicale si diferite temporizari.Informatii suplimentare cu privire la porturi se pot obtine din HELP, meniulI/O Port Map, I/O Port Detail. |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|