Elemente de baza in programarea īn limbaj de asamblare


  • Reprezentarea informatiilor in memoria calculatoarelor

        Informatiile sunt reprezentate in calculator sub forma binara. Utilizatorii folosesc codificarea zecimala a informatiei. In limbajul de asamblare vor fi folosite deci, pe lānga baza de numeratie 10, bazele de numeratie 2, 8 si 16, iar sistemele de numeratie respective se numesc binar, octal si hexazecimal. ļn sistemul hexazecimal, cifrele de la 10 la 15 se noteaza cu literele de la A pana la F. In memoria calculatorului informatia este pastrata numai sub forma binara. Deoarece este greu de operat cu numere mari īn baza 2, pentru exprimarea unor cantitati binare se foloseste baza 16. De exemplu, numarul 255 se poate exprima in binar ca fiind 11111111 iar in hexa FF.
        Orice fel de informatie (programe, valori numerice, texte, imagini, sunete, etc.) este codificata numeric in baza 2 (Codificare binara). Se grupeaza apoi cate 4 biti si se reprezinta informatia pe ecran in cod hexazecimal pentru o mai usoara citire.


       * Tabelul de valori hexa afisat mai sus, reprezinta continutul memoriei de la o anumita adresa.
        Informatia este grupata in memorie pe grupe de cāte 8 cifre binare (biti). Un asemenea grup se mai numeste si octet(sau byte). Octetul este unitatea de masura īn care se exprima volumul memoriei unui calculator. Deoarece dimensiunea memoriei este totdeauna o putere a lui 2, multiplii folositi pentru octeti nu sunt 100, 1000 etc., ci puteri adecvate ale lui 2. Astfel, un numar de 2 la puterea 10 = 1024 de octeti se mai numeste si kilooctet sau kilobyte (pe scurt KO sau KB). Similar, un numar de 2 la puterea 20 = 10264576 octeti se numeste megaoctet sau megabyte (MO sau MB).
        kilo = 210 = 1024
        mega = 220 = 10264576
        giga = 230 = 1073741824

        Reprezentarea numerelor intregi

         Numerele īntregi pot fi reprezentate pe unul sau mai multi octeti. In general, avand n biti, numarul total de valori distincte este 2 la puterea n.
         Pentru numerele fara semn, valoarea interna a bitilor, reprezinta chiar valoarea numarului.
         Pentru numerele cu semn, prin conventie, primul bit reprezinta semnul (1 pentru numere negative si 0 pentru numere pozitive). Daca bitul de semn este 0, atunci configuratia interna reprezinta chiar valoarea numarului. Daca bitul de semn este 1, atunci valoarea absoluta a numarului se obtine prin complement fata de 2, adicå prin complementarea tuturor bitilor (0 devine 1 si reciproc) si prin adunarea apoi a valorii 1. Aceasta regula se aplica pentru ambele sensuri de conversie (de la reprezentari interne la numere cu semn si reciproc).

        Reprezentarea numerelor intregi in baza 10 codificate binar pe opt biti (BCD):

        In cazul in care este folosita des baza 10, se utilizeaza codificarea de tip BCD (Binary Coded Decimal) - Zecimal Codificat īn Binar. In acest sistem, se reprezinta o cifra zecimala pe un grup de 4 biti (4 biti pot codifica 16 valori distincte, deci 6 valori nu vor fi folosite).
        Un octet va codifica deci 2 cifre zecimale. In acest caz codul se numeste zecimal impachetat unde se codifica doua cifre zecimale cu un singur octet sub forma: prima cifra pe primii 4 biti ultima cifra pe ultimii 4 biti. De exemplu, octetul cu valoarea 01011001 reprezinta codificarea BCD pentru numårul zecimal 59 (primul grup de 4 biti reprezinta cifra 5, iar al doilea grup cifra 9). Daca este necesar, se pot considera n octeti pentru memorarea a 2n cifre zecimale.
        Se mai utilizeaza si codul BCD zecimal neimpachetat , in care se reprezinta o cifra BCD pe un octet sub forma: prima primii 4 biti au tot timpul valoarea=3, cifra fiind codificata pe ultimii 4 biti(format ASCII). De exemplu, secventa 0111 1001 0111 0111 reprezinta codificarea BCD despachetat pentru numarul 97 in baza 10.

        Reprezentarea numerelor reale
        Reprezentarea datelor alfanumerice

        Pe langa date numerice, in memoria calculatorului trebuie reprezentate si alte tipuri de date cum ar caracterele alfabetice (litere mari sii mici), caracterele numerice (cifre zecimale), semnele de punctuatie si asa-numitele caractere de control (folosite pentru comanda diverselor echipamente periferice). Pentru codificarea acestor tipuri de date se foloseste codul standard ASCII (American Standard Code for Information Interchange)-Codul Standard American pentru Schimb de Informatii.
        Codul ASCII standard este un cod pe 7 biti, deci cuprinde 128 de caractere distincte. Un caracter ASCII se reprezinta pe un octet, īn care bitul cel mai semnificativ este 0. Domeniul de valori este deci de la 0 la 127 (īn zecimal) sau de la 00 la 7F (īn hexazecimal).
        Dintre cele 128 de caractere, 32 sunt caractere de control si nu au reprezentari grafice (nu sunt afisabile).
        Restul de 96 de caractere pot fi afisate pe ecranul calculatorului, la imprimanta etc. Caracterele afisabile se noteaza de obicei prin scrierea simbolului grafic respectiv īntre apostrofuri. De exemplu, 'A' īnseamna codul ASCII corespunzator literei A mare, '!' īnseamna codul ASCII pentru semn de exclamare etc.


        Deoarece caracterele de control nu au reprezentari grafice, ele au nume speciale (exprimate de obicei prin prescurtari de 2 sau 3 litere). Dintre caracterele de control uzuale, pot fi amintite: CR (Carriage Return), LF (Line Feed)

    Nume Descriere Definire cu esc in C
    nul null byte \0
    bel bell character \a
    bs backspace \b
    ht horizontal tab \t
    np formfeed \f
    nl newline \n
    cr carriage return \r
    vt vertical tab
    esc escape
    sp space


        S-a definit si un asa-numit cod ASCII extins, īn care se folosesc toti cei 8 biti ai unui octet.
        Setul ASCII standard este un subset al acestui cod ASCII extins.



        Observatie

        Modurile de reprezentare prezentate anterior ilustreaza faptul ca datele din memoria calculatorului se pot interpreta diferit.
        Aceste interpretari sunt facute de programul care foloseste datele. De exemplu octetul 1001 0100 poate reprezenta numarul zecimal pozitiv 148 daca il interpretam ca un numar in binar fara semn , poate reprezenta numarul zecimal negativ -108 daca il interpretam ca un numar in binar fara cu semn, poate reprezenta numarul zecimal pozitiv 94 daca il interpretam ca un numar BCD , poate reprezenta caracterul ASCII ö din setul extins de caractere, daca il interpretam ca fiind un cod ASCII etc.

    Programarea in ASM - primele elemente


  • Elemente de baza ale programarii in limbaj de asamblare


    Necesitatea limbajului de asamblare
    Caracterizare limbaj de asamblare

         - Utilizarea simbolurilor si expresiilor simbolice pentru operatii si adrese operanzi
         - Utilizarea comenzilor simbolice pentru controlul asamblarii

    Elemente constitutive

         - alfabet: litere mari si mici, caractere numerice 0-9 si caractere speciale =-*/[]()@ etc
         - cuvinte rezervate (identificatori ) ex: nume de instructiuni(MOV ,ADD, INT... ), resurse(AX,BX,...CS,DS etc), nume de operatori (MOD, OFFSET, SEG,...), pseudoinstructiuni pentru assamblor( .ASSUME, .MODEL..)
         - cuvinte date de utilizator ex: nume de variabile , nume de adrese, nume de proceduri, nume de segmente, nume de macroinstructiuni.
         - comentarii : nu sunt interpretate de asamblor dar sunt necesare pentru explicitarea programelor
         - propozitii

  • Primul program scris in limbaj de asamblare

       
    ; Primul program scris in limbaj de asamblare - forma simplificata de definire a segmentelor
     
    .model  tiny
    .stack  100h
    .data
    Mesaj   DB 'Primul program. Felicitari !',13,10,10,'$' ;CR,LF,LF,Term.
    .code
      start:
    	mov ax,@data
    	mov ds,ax           	; se seteaza ds pentru a marca segmentul de date
    	mov ah,9            	; functie DOS 09 - afisare sir terminat cu '$'
    	mov dx,OFFSET Mesaj 	; locul unde incepe Mesaj
    	int 21h             	; afisare  mesaj pe ecran
    	mov ah,4ch          	; functiei DOS 4c terminare proces
    	int 21h	     		; terminare program
      end start
       
    


  • Crearea unui program executabil


    Etapele necesare in vederea realizarii a unui program executabil


        Pentru editarea programului sursa se foloseste orice editor text care furnizeaza fisiere text de tip ANSI. Se recomanda folosirea utilitarului NOTEPAD, iar dupa editarea programului sursa se salveaza fisierul cu numele primul.asm cu optiunea "Text Document" Encoding ANSI.
        Se creaza un Folder de exemplu C:\ASM in care se copiaza utilitarele tasm, tlink si fisierul primul.asm
        Din "Command Prompt" se ajunge in C:\ASM unde se lanseaza comanda: tasm primul.asm. Daca fisierul sursa a fost corect editat si nu sunt erori, in "Command Prompt" se afiseaza mesajele:


        Se lanseaza urmatoarea operatie si anume operatia de link-editare cu comanda tlink primul
        Daca totul e corect, programul primul.exe a fost creat si se lanseaza in executie prin comanda primul
        In urma link-editarii si a lansarii , fereastra "Command Prompt" arata astfel:


        Reluam procesul de asamblare dar de aceasta data cu comanda tasm /l primul.asm. In acest caz se genereaza, pe langa fisierele generate anterior si fisierul primul.LST. Daca deschidem acest fisier putem sa analizam modul in care a fost asamblat in limbaj cod masina fisierul sursa.

       
    Turbo Assembler	 Version 5.0	    09-26-08 08:55:05	    Page 1
    primul.ASM
    
          1       ; Primul program scris in limbaj de asamblare - forma simplificata de definire a segmentelor
          2
          3	0000			     .model  tiny
          4	0000			     .stack  100h
          5	0000			     .data
          6	0000  50 72 69 6D 75 6C	20+  Mesaj DB'Primul program. Felicitari !',13,10,10,'$' ;CR,LF,LF,Term.
          7	      20 70 72 6F 67 72	61+
          8	      6D 2E 20 46 65 6C	69+
          9	      63 69 74 61 72 69	20+
         10	      21 0D 0A 0A 24
         11	0021			     .code
         12	0000			       start:
         13	0000  B8 0000s			  mov ax,@data
         14	0003  8E D8			  mov ds,ax	      ; se seteaza ds pentru a marca segmentul de date
         15	0005  B4 09			  mov ah,9	      ; functie DOS 09 - afisare sir terminat cu '$'
         16	0007  BA 0000r			  mov dx,OFFSET Mesaj ; locul unde incepe Mesaj
         17	000A  CD 21			  int 21h	      ; afisare	mesaj pe ecran
         18	000C  B4 4C			  mov ah,4ch	      ; functiei	DOS 4c terminare proces
         19	000E  CD 21			  int 21h	      ; terminare program
         20				       end start
    
    Turbo Assembler	 Version 5.0	    09-26-08 08:55:05	    Page 2
    
    Symbol Table
    
    Symbol Name			  Type	 Value
    
    ??DATE				  Text	 "09-26-08"
    ??FILENAME			  Text	 "primul  "
    ??TIME				  Text	 "08:55:05"
    ??VERSION			  Number 0500
    @32BIT				  Text	 0
    @CODE				  Text	 DGROUP
    @CODESIZE			  Text	 0
    @CPU				  Text	 0101H
    @CURSEG				  Text	 _TEXT
    @DATA				  Text	 DGROUP
    @DATASIZE			  Text	 0
    @FILENAME			  Text	 PRIMUL
    @INTERFACE			  Text	 000H
    @MODEL				  Text	 1
    @STACK				  Text	 DGROUP
    @WORDSIZE			  Text	 2
    MESAJ				  Byte	 DGROUP:0000
    START				  Near16 DGROUP:0000
    
    Groups & Segments		  Bit Size Align  Combine Class
    
    DGROUP				  Group
      STACK				  16  0100 Para	  Stack	  STACK
      _DATA				  16  0021 Word	  Public  DATA
      _TEXT				  16  0010 Word	  Public  CODE
       
    


        Exista si alte optiuni de asamblare pe care le puteti afla prin comanda tasm /?.




        Pentru a putea depana si urmari executia programului pas cu pas se lanseaza comanda td. Se incarca apoi programul executabil primul.exe Dupa cum vedeti in imaginea de jos se pot vizualiza programul ,registrii, zona de memorie, etc


        Pentru a putea vedea continutul zonei de memorie in care este salvat textul:"Primul progra....", se activeaza fereastra "Dump". Dupa rularea pas cu pas a primelor 3 instructiuni prin apasarea tastei F8 de 3 ori, se observa ca DS ajunge la valoarea 5721. Dupa cum se vede din program, OFFSET-ul pentru "Mesaj" este 0010 deci daca vom cauta in fereastra "Dump" la adresa DS:0010 se va vedea textul: "Primul progra...."
        Vom incarca acum programul de jos pentru a fi rulat pas cu pas apoi in mod animat.
        
  • Program demo pentru a fi rulat cu Turbo Debugger

       
    ; Program demo pentru a fi rulat cu Turbo Debugger 
     
    .model  tiny
    .stack  100h
    .data
    Mesaj   DB 'Acest program se ruleaza pas cu pas in Turbo Debugger !',13,10,10
    	DB 'Se calculeaza suma primelor 10 numere naturale',13,10,10, '$' 
    .code
      start:
    	mov ax,@data
    	mov ds,ax		; se seteaza ds pentru a marca segmentul de date
    	mov ah,9		; functie DOS 09 pentru afisare sir terminat cu '$'
    	mov dx,OFFSET Mesaj	;locul unde incepe Mesaj
    	int 21h			; afisare  mesaj pe ecran
    	mov cx,0
    	mov ax,0
      et1:
    	add ax,cx		; se calculeaza suma 
    	inc cx			; se trece la noul numar natural
    	cmp cx,11		; am ajuns la 11 de numere ?
    	jnz et1			; reiau de la et1 daca nu am ajuns la 11
    				; iesire daca am ajuns la 101 
    	mov ah,4ch		; functiei DOS 4c terminare proces
    	int 21h			; terminare program
      end start
       
    

        La terminarea programului, registrul AX va contine suma primelor 10 numere naturale adica 37H=55 iar registrul CX are valoarea 0bH adica 11



        
  • Utilizarea bibliotecilor sau modulelor de program externe

        Rareori realizam programe care sa nu contina proceduri externe sau apeluri de proceduri din biblioteci.
        Vom utiliza in continuare apeluri din modulul extern proc_ext.obj pentru a afisa continutul registrului AX. In cadrul modulului "proc_ext.obj" esista o procedura numita init_afis pentru a initializa modul de afisare in fereastra DOS, 80 X 25 caractere VGA 16 culori. Tot in acest modul exista si procedura afis_ax procedura care ne permite afisarea continutului registrului AX. Procedura init_afis nu necesita nici un parametru pe cand procedura afis_ax necesita doi parametrii. Primul parametru este un numar intre 0 si 24 reprezentand linia de pe ecran pe care se va afisa continutul registrului AX, iar al doilea parametru este un text de doua litere care va fi afisat ca atare la inceputul liniei pe care se afiseaza continutul registrului AX. Programul principal care afiseaza continutul registrului AX este urmatorul:

       
    ; Se afiseaza registrul AX sub forma binara folosind proceduri din modulul extern "proc_ext"
    ; Se folosesc procedurile externe init_afis si afis_ax aflate in modulul proc_ext
    .model  tiny,pascal
    .stack  100h
    .code
    
    EXTRN	init_afis:PROC
    EXTRN	afis_ax:PROC
    
    start:
      	call init_afis			; seteaza modul 80 X 25 caractere VGA 16 culori
    	mov ax,05555h
    	call afis_ax,21,'AX'		; afisez continutul lui AX pe randul 21
    	mov ah,4ch			; iesire DOS
    	int 21h
    END start
       
    

        Salvam acest program cu numele prg.asm . Dupa ce executam operatia de asamblare cu comanda:
    tasm prg
    link -editatea se face cu comanda:
    tlink prg+proc_ext

        Dupa rulare, obtinem:



        Pentru a asambla, tink-edita si rula programul, cu o singura comanda, vom realiza un fisier bat cu numele "asm.bat", a carui continut se gaseste mai jos.

       
    tasm /z %1.asm
    tlink %1.obj + proc_ext.obj
    %1
       
      


        In ipoteza ca programul principal a fost salvat cu numele prg.asm, operatiile de asamblare, link, rulare vor fi lansate cu comanda:

    asm prg

    Elemente de programare īn limbaj de asamblare


  • Definirea constantelor


        Baze de numeratie utilizate in ASM:
    Observatii:
    - Constantele reprezentate hexa incep obligatoriu cu o cifra. Nu se scrie a34h ci 0a43h
    - Cu directiva RADX < expresie > se poate stabili o baza implicita de compilare
    - Constantele intregi sunt reprezentate in memorie pe 8,16,32 sau 64 biti

        Constantele reale sunt reprezentate in virgula mobila pe:
  • Instructiuni in limbaj de asamblare


        Sintaxa generala:[eticheta:][mnemonica [operanzi]][;comentariu] unde:

        eticheta - este un camp cu nume simbolic de maxim 30 caractere unde primul caracter este o litera

        mnemonica - numele instructiunii sau pseudoinstructiunii

        operanzi - sunt functie de instructiune

  • Declararea datelor

        Se declara cu ajutorul unor pseudoinstructiuni ce asigura alocarea memoriei pentru date, in procesul de asamblare.
    Sintaxa: [nume_variabila] tip [lista expresii] [;comentarii]
    sau:
    [nume_variabila] tip [numar] DUP([lista expresii]) [;comentarii]
    unde nume_variabila este un identificatior pentru variabila
    tip=mnemonica pseudoinstructiunii, indicand tipul datelor astfel:
  • db - define byte
  • dw - define word
  • dq - define quadruple
  • df - define float
  • dp - define pointer
  • dt - define ten bytes
  • db - define bytes
  • nume_structura - defineste o structura de date
    lista_expresii expresii reprezentand valorile folosite la initializarea datelor (? inseamna ca datele nu se initializeaza)
    numar reprezinta factorul de multiplicare al listei de expresii ce urmeaza dupa DUP

  • Operatori


    Operatori aritmetici
  • Operatori unari +,- pentru stabilirea smnului
  • Operatori binari +,-,*,/,MOD

    Operatorul index

    Utilizat pentru precizarea operanzilor prin adresare indirecta, indexata, bazata, bazata si indexata
    exemplu depl [bx] [di] echivalenta cu depl+(bx)+(di)

    Operatori logici

    Pentru realizarea operatiilor logice bit cu bit :AND, NOT, OR, XOR

    Operatori de deplasare
  • < expresie > SHR numar
  • < expresie > SHL numar
    unde < expresie > este expresia ce va fi deplasata dreapta respectin stanga iar numar este numarul de biti pe care se executa deplasarea.

    Operatori de deplasare

    sunt utilizati pentru a compara doua expresii, rezultatul find valoarea logica true=ffh) sau false(00h)
  • EQ - egalitate
  • NE - inegalitate
  • GT - mai mare
  • GE - mai mare sau egal
  • LT - mai mic
  • LE - mai mic sau egal

    Operatori de tip si de conversie
  • HIGH - extrage octetul mai semnificativ dintr-un word
  • LOW - extrage octetul mai putin semnificativ dintr-un word
  • SEG - furnizeaza adresa de segment a unei adrese
  • OFFSET - furnizeaza deplasamentul in cadrul segmentului
  • TYPE < expresie > - returneaza tipul expresiei astfel: byte=1, word=2 ... tbyte=10
  • LENGTH < expresie > furnixeaza numarul de elemente ale unei variabile declarate cu DUP
  • SIZE < expresie > furnixeaza numarul de octeti ocupati de o variabila
  • PTR < expresie > realizeaza conversia de tip pentru o variabila.
    Sintaxa: tip PTR < expresie >
  • SHORT accepta un argument de tip eticheta utilizat pentru salturi in intervalul -128 127
  • WIDTH returneaza numarul de biti pentru o inregistrare ce reprezinta un tip de date structurat.

  • Etichete


        Identifica locatii de memorie ale instructiunilor, operanzilor sau procedurilor.
    Etichetele de instructiuni sau proceduri au trei atribute:segment, deplasament(offset) si distanta(near sau far)
    Etichetele pentru operanzi au doua tipuri:(byte sau word)

  • Directive


    Directiva EQU
    Permite atribuirea unei valori unui simbol in momentul asamblarii
    Sintaxa: < nume > EQU < expresie >
        Urmatorul program foloseste directiva EQU pentru a initializa lungimea sirului de caractere ce urmeaza a fi tiparit la dispozitivul asociat prin handler
       
    ; Program scris in limbaj de asamblare - folosirea directivei EQU
    ; Aplicatia listeaza la imprimanta un sir de caractere
     
    .model  small
    .stack  100h
    .data
    Mesaj   DB 'Listare la dispozitivul asociat !',13,10,10 ;CR,LF,LF
    L_mes	EQU 35				; lungimea sirului ce urmeaza a fi tiparit
    
    			
    .code
      start:
    	mov ax,@data
    	mov ds,ax           	; se seteaza ds pentru a marca segmentul de date
    	mov ah,40h            	; functie DOS 40h pentru scriere la dispozitivul asociat
    	mov bx,1		; indicatorul(handler-ul) pentru ecran ( 0=input,1=output,4=printer)
    	mov cx,L_mes		; lungimea mesajului
    	mov dx,OFFSET Mesaj 	; locul unde incepe Mesaj
    	int 21h             	; afisare  mesaj pe ecran
    	mov ah,4ch          	; functiei DOS 4c terminare proces
    	int 21h	     		; terminare program
      end start
       
    


    Operatorul THIS
    Creaza un operand cu adresa de segment si offset egala cu cea a locatiei cueente
    Sintaxa: THIS tip exemplu: unde tip poate fi byte, word, dword, qword, tbyte
    etich1:
    etich1 EQU this byte

    Simbolul $ (contor locatii)
    Reprezinta adresa curenta a PC
        Urmatorul program foloseste simbolul $ si EQU pentru a initializa lungimea sirului de caractere ce urmeaza a fi tiparit la dispozitivul asociat prin handler
       
    ; Program scris in limbaj de asamblare - folosirea simbolului $
    ; Aplicatia listeaza la imprimanta un sir de caractere
     
    .model  small
    .stack  100h
    .data
    Mesaj   DB 'Listare la dispozitivul asociat !',13,10,10 ;CR,LF,LF
    
    L_mes	EQU $-Mesaj 	;$ ia valoarea curenta a offset-ului
    			
    .code
      start:
    	mov ax,@data
    	mov ds,ax           	; se seteaza ds pentru a marca segmentul de date
    	mov ah,40h            	; functie DOS 40h pentru scriere la dispozitivul asociat
    	mov bx,1		; indicatorul(handler-ul) pentru ecran ( 0=input,1=output,4=printer)
    	mov cx,L_mes		; lungimea mesajului
    	mov dx,OFFSET Mesaj 	; locul unde incepe Mesaj
    	int 21h             	; afisare  mesaj pe ecran
    	mov ah,4ch          	; functiei DOS 4c terminare proces
    	int 21h	     		; terminare program
    end start
    	   
    


    Directiva ORG
    Initializare adresa curenta a PC
    Sintaxa: ORG < expresie > unde expresie este o valoare a adresei intre 0 si 64 KO
    Mai jos este prezentat un program asm ce utilizeaza directiva ORG

       
       ; Primul program scris in limbaj de asamblare 
     
    .model  tiny,pascal
    .stack  200h
    
    .code
    	org 100h
    
    begin:
    	jmp start
    
    Mesaj   DB 'Program ce foloseste directiva ORG !',13,10,10,'$' ;CR,LF,LF,Terminator
    
    
    start:
    	mov ax,seg Mesaj
    	mov ds,ax           	; se seteaza ds pentru a marca segmentul de date
    	mov ah,9            	; functie DOS 09 pentru afisare sir terminat cu '$'
    	mov dx,OFFSET Mesaj 	; locul unde incepe Mesaj
    	int 21h             	; afisare  mesaj pe ecran
    	mov ah,4ch          	; functiei DOS 4c terminare proces
    	int 21h	     		; terminare program
    
    	end begin
       
    


    Definirea si utilizarea segmentelor


  • Definirea segmentelor

        Un segment este o colectie de instructiuni sau date ale caror adrese sunt relative fata de inceputul segmentului.
        Mod de definire segmente:
        Forma completa de definire segmente
    nume_seg SEGMENT [tip_aliniere][tip_combinare][tip_utilizare][clasa_seg]
    ...
    ... corpul segmentului
    ...
    nume_seg ENDS

  • Segmentare simplificata

        Directive simplificate de segmentare
    .MODEL tip_model

    Unde tip model este:
        Aplicatie ce utilizeaza forma simplificata de definire a segmentelor

       
    ; Program scris in limbaj de asamblare ce foloseste forma simplificata de definire a segmentelor
    ; Se tipareste litera "x" folosind serviciul 2 de tiparire caracter 
    ; Se foloseste registrul es pentru a adresa datele din zona data
     
    	.model  small
    
    	.stack  200h
    
    	.data
    litera	db	'X'	
    
    	.code
    start:
    	mov dx,@data
    	mov es,dx           	; se seteaza es pentru a marca segmentul de date
    	mov bx,OFFSET litera 	; locul unde s-a salvat litera X
    	mov dl,es:[bx]		; incarcare registru dl cu continutul locatiei de la adresa es:[bx]
    	mov ah,2            	; functie DOS 02 pentru afisare caracter aflat in dl
    	int 21h             	; afisare  mesaj pe ecran
    	mov ah,4ch          	; functiei DOS 4c terminare proces
    	int 21h	     		; terminare program
    	end start
       
    

        Folosind forma simplificata de definire a segmentelor, vom realiza in continuare o aplicatie care foloseste functia DOS 01h Keyboard Input pentru asteptarea apasarii unei taste.

       
    ; Primul program scris in limbaj de asamblare - forma simplificata de definire a segmentelor
    ; Asteptarea apasarii unei taste
     
    .model  tiny
    .stack  100h
    .data
    Mesaj   DB 'Acest program foloseste functia DOS 01h Keyboard Input ',13,10,10
    	DB 'Apasati orce tasta !',13,10,10,'$' 
    Mesaj2	DB 'La revedere!',13,10,10,'$'
    .code
      start:
    	mov ax,@data
    	mov ds,ax           	; se seteaza ds pentru a marca segmentul de date
    	mov ah,9            	; functie DOS 09 - afisare sir terminat cu '$'
    	mov dx,OFFSET Mesaj 	; locul unde incepe Mesaj
    	int 21h             	; afisare  mesaj pe ecran
    	mov ah,01h		; functie DOS 01 - astept apasarea unei taste
    	int 21h
    	mov ah,9            	; functie DOS 09 - afisare sir terminat cu '$'
    	mov dx,OFFSET Mesaj2 	; locul unde incepe Mesaj2
    	int 21h             	; afisare  mesaj pe ecran
    	mov ah,4ch          	; functiei DOS 4c terminare proces
    	int 21h	     		; terminare program
      end start
       
    


  • Forma completa de definire a segmentelor

        Aplicatie ce utilizeaza forma completa de definire a segmentelor

       
    ; Primul program scris in limbaj de asamblare in care se utilizeaza forma completa de definire a segmentelor 
     
    stiva	segment word para stack	'stack'
    	dw	10	dup(?)
    stiva	ends
    
    date	segment word public	'data'
    mesaj	db	'Program ce utilizeaza forma completa de definire a segmentelor',13,10,'$'
    date	ends
    
    cod	segment word public	'code'
    assume cs:cod, ds:date, ss:stiva
    start:
    	mov ax,seg date
    	mov ds,ax           	; se seteaza ds pentru a marca segmentul de date
    	mov ah,9            	; functie DOS 09 pentru afisare sir terminat cu '$'
    	mov dx,OFFSET mesaj 	; locul unde incepe Mesaj
    	int 21h             	; afisare  mesaj pe ecran
    	mov ah,4ch          	; functiei DOS 4c terminare proces
    	int 21h	     		; terminare program
    cod	ends
    end 	start
    
       
    


    Tematica de laborator