|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
Structura unui program scris in limbaj de asamblare. Fisiere sursa, obiect si fisiere executabile (.EXE si .COM) | ||||||
|
||||||
Programele in limbaj de asamblare sint create din unul sau mai multefisiere
sursa. Pentru editarea fisierelor sursa se va folosi un editor de textece produce
fisiere ASCII (editorul din TC sau WS mod nondocument). In modimplicit, modulele
sursa in limbaj de asamblare au extensia .ASM. Se va utiliza programul TASM
pentru asamblarea fiecarui modul de program.Pentru fiecare fisier sursa TASM-ul
creaza fisierul corespunzator .OBJ. Infunctie de optiunile din linia de comanda
TASM pot fi create si fisiere .CRF (cureferinte incrucisate) si .LST (fisier
de listare). Se va utiliza TLINK pentru a combina toate fisierele obiect si
modulelebiblioteca ce formeaza un program in cadrul unui singur fisier executabil,
cuextensia implicita .EXE. Poate fi de asemenea creat un fisier .MAP.
Comanda TASM:
Sintaxa: TASM aoptiunii sursaa,obiectia,listingia,xrefi ,
unde: - sursa, reprezinta nume fisier sursa, in limbaj de asamblare, implicitcu extensia .ASM ; ai introducere optionala a parametrului din paranteza;- obiect, nume fisier obiect, implicit cu extensia OBJ;- listing, nume fisier listare, implicit cu extensia LST;- xref, nume fisier de referinte incrucisate, cu extensia .CRF. Optiuni: /h sau /? afiseaza lista optiunilor posibile; /l genereaza fisier listing; /n elimina tabela de simboluri din fisierul listing; /t elimina mesajele pentru asamblare fara erori; /w setare nivel generare mesaje de avertisment; /z afiseaza liniile sursa corespunzatoare mesajelor de eroare; /zd introduce informatii privind numarul liniei in .OBJ; /zi introduce informatii pentru depanare in fisierul obiect. Comanda TLINK: Sintaxa: TLINK aoptiunii obiect a,exeia,mapia,libi Optiuni: /i = initializeaza toate segmentele; /l = include numar pentru linile sursa; /s = genereaza o harta detaliata a segmentelor; /v = include informatie completa pentru depanare; /t = creare fisier COM. Pentru a putea folosi Turbo Debugger-ul, optiunile minimale sunt:a) Operanzii utilizati in instructiunile JMP si CALL: - JMP GET_CHAR ; salt cu adresare directa la eticheta GET_CHAR- CALL PROC ; apelarea procedurii cu eticheta PROC1- JMP BX ; salt la adresa CS:BX, adica la adresa locatiei cu bazain registrul CS si offset-ul dat de continutul lui BX.- CALL NEAR_LABEL_ARRAYaDIi;apelul proc. apropiate selectate de continutullui DI, unde NEAR_LABEL_ARRAY DW PROC1 ; adresa offset a procedurii 1 DW PROC2 ; adresa offset a procedurii 2 - CALL FAR_LABEL_ARRAYaBXi ; apelul proc. FAR selectate de continutul luiBX, unde: FAR_LABEL_ARRAY DD FAR_PROC1 ; adresa procedurii 1 DD FAR_PROC2 ; adresa procedurii 2 - ET: MOV AX,CX : JNZ ET Asamblorul analizeaza la asamblare distanta dintre adresa instructiuniiJNZ ET si ET. Daca aceasta este cuprinsa intre -128,127 atunci se genereazacodul obiect pentru salturi "scurte", adresa de salt fiind relativa si exprimataca o deplasare cu semn pe 8 biti.b) referiri la variabile din memorie: MOV CX,ALFA ; registru<-Mem. direct MOV ALFA,6 ; Mem. direct<-Imediat. Segmentul variabilei ALFArezulta din definirea acesteia. MOV ALFA,DX ; Mem. direct<-registru MOV BL,aBXi ; registru<-Mem. indirect MOV aDIi,BH ; Mem. indirect<-registru MOV aBPi.ALFA,AH ; Mem. bazat<-registru. ALFA=cimpul unei structuri cuadresa de baza data de BP. MOV SI,aBP+10iaDIi ; Reg<-Mem. bazat, indexat. Adresa efectiva asursei este BP+SI+10 ; (Pentru registrul segment utilizat in aceste instructiunise va consulta lucrarea anterioara.) Exemplul urmator ilustreaza codul sursa ce produce programe executabileautonome. ;program ce copie incepind cu DS:100 100 de octeti de la CS:100 .DOSSEG .MODEL SMALL .STACK 100h ;aloca stiva 256 octeti .DATA ;inceputul segmentului de datelen EQU 100h ORG 100h ;pozitioneaza contorul de locatii la 100h-array1 DB len DUP (?) ;declarare vector de 10 octeticurent EQU $ ;valoarea curenta a contorului de locatii in ;segmentul de date .CODEstart: mov ax,@DATA ;initializare registrul segment de date mov ds,ax mov si,100het: mov al,cs:asii mov array1asi-100hi,al inc si mov ax,si sub ax,len jg et mov ax,4c00h ;functie iesire sistem in AH si cod int 21h ;de eroare 0 in AL (vezi HELP) END startObservatii: 1. Numerele hexa ce incep cu cifre mai mari decit 9, (A...F), trebuie precedatede cifra 0, pentru a nu fi confundate cu nume de variabile; 2. Comentariile sint precedate de ";";3. Variabila predefinita $ contine valoarea curenta a deplasamentului insegmentul de date;4. Directivele .model si dosseg indica folosirea conventiilor C stabilite pentrunume si ordine de segmente. Aceste linii definesc automat segmentele in ordineacorecta si specifica instructiunile ASSUME si GROUP. Segmentele pot fi apoiplasate in fisierul sursa in ordinea dorita cu directivele de segmentsimplificate .STACK, .DATA, .CODE.5. Eticheta "start" urmeaza directivei .code si marcheaza inceputulinstructiunilor programului. Aceeasi eticheta este utilizata la sfirsitulprogramului, dupa instructiunea END.6. Simbolul @data reprezinta numele segmentului creat cu directiva .data.Instructiuni de transfer GRUPMnemo- nicaOperanziDest SrcEfectulinstr.FLAG-URIExemple deinstructiuni a)Generale 1. MOV M, A A, M R, R R, M M, R R, DATA M, DATASR, R16SR, M16R16, SR M, SR DEST<-SRC SR !=CS - MOV ARRAYaSIi,ALMOV AX,BETAMOV AX,BXMOV SP,STACK_TOPMOV COUNTaDIi,DXMOV AX,3MOV BETAaBXiaSIi,5MOV DS,CXMOV ES,SEG_BASEMOV BP,SSMOV ALFAaBXi,CS c6x12xt3. POP R16SRM16transfer decuvint dinstivaDEST<-(SP+1,SP)SP<-SP+2SR != CS -POP DXPOP DSPOP VAR 4. XCHG(eXCHanGe)A, RM, RR, RpermutareSRC<-> DEST - XCHG AX,DXXCHG SEMAFOR,AXXCHG BL,CL b)Specificepentru A 1.IN(INputport)A, DATA8 A, DX citire portin. A<-PORT(DATA8)A<-PORT (DX) - IN AL,0FAH IN AX,DXOUT(OUTputport) DATA8, A DX, AscriereportPORT(DATA8)<-A(DX)<-A - OUT 44,AX OUT DX,AL2. XLAT(Translate)TABLOU SRC conversieBX=adresatablouluiAL<-(BX+AL) -XLAT TABLE c)AdresaefectivaLEA(LoadEffec-tiveAddr.)R16, EAR16<-EA(incarcareadresaefectiva)
-LEA BX, BETAaBXi d)Registresegment LDS(Loaddatasegmentreg.)R16, M32R16<-(EA+1,EA)DS<-(EA+3,EA+2)
- LDS BX, D_SaDIiLDS SI, NSEGaBXi Notatii: A = registru acumulator, (AX sau AH, sau AL); R8/16 = registru general, de 8 resp. 16 biti; M = operand din memorie (de 8, 16 sau 32 biti); SR = registru segment; DATA = constanta (8/16 biti); DEPL = deplasare ("offset") de adresa; (DATA) = octetul de adresa offset egala cu DATA; (DATA+1,DATA)= cuvintul (16 biti) de adresa offset egala cu DATA; (DATA+3,...,DATA)= cuvint dublu (de obicei pointer) cu adresa offsetegala cu DATA ; (nume registru) = octetul adresat prin registrul indicat; (nume registru+1,nume registru) = cuvintul de 16 biti adresat indirectprin registrul indicat ; SRC = sursa de date:- DATA, DATA8, DATA16, DATA32;- (DATA);- nume registru;- (nume registru) sau anume registrui; DEST = destinatie a datelor:- (DATA);- nume registru;- (nume registru) sau anume registrui; EA = adresa efectiva ; Aplicatii: 1. Urmariti programul de mai sus (program care muta continutul unei zone dememorie de la offset 100, din segmentul de cod curent, intr-un vector definitde utilizator in segmentul de date) si rulati-l pas cu pas in TD, vizualizindregistrele si memoria.2. Scrieti un program care va face conversia literelor mari dintr-un text inlitere mici, memorind rezultatul intr-o zona de memorie. Textul initial va fidefinit de programator.3. Scrieti un program ce va face conversia unui numar hexazecimal reprezentatpe cuvint in codul ASCII corespunzator acestuia. (O posibilitate ar fifolosirea instructiunii XLAT.) |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|