Asamblare Inline

1. Generalitati despre asamblorul inline Turbo Pascal
-
permite inserarea de instructiuni ale lb. de asamblare in programe scrise in limbaje de programare de nivel inalt (Pascal, C++, etc.).
-sintaxa instructiunilor asm intr-un program pascal este:
asm <instr asm> [ <separator> <instr asm>] ... end;
unde:       <separator>={ ;, linie noua, comentariu pascal}
               <instr asm>=[eticheta:][prefix] mnemonica [operanzi]
Obs. O instructiune asm trebuie sa pastreze integritatea registrilor BP,SP,SS,DS.
Ex:
           asm
                  mov ax,5
                  xchg bx,cs
           end;

a) etichete:              
  • etichete pascal: se declara cu label si sunt vizibile in procedurile/functiile in care sunt declarate
  • etichete locale: acestea nu trebuiesc declarate, numele lor incepe cu @ si sunt vizibile doar in instructiunile asm in care sunt definite

  • Ex:
    Procedure A;
    label et1;
    begin

      {instructiuni pascal}
    asm

     



    @1:

    et1:
    ...
    jmp et1
    ...
    jmp @1
    ...
    ...
    ...
    end;
    end;
    b) prefixe pentru instructiuni:          
  • prefixe repetitive pentru instructiuni: REP,...
  •          
  • prefixe de suprascriere a registrilor de segment: SEGDS, SEGES, SEGCS, SEGSS

  • Ex:
    SEGSS instr - prezenta prefixului SEGSS are urmatorul efect: registrul segment care se va folosi va fi SS si nu cel implicit DS.
    SEGSS LODSB - pune in registrul AL continutul locatiei de memorie byte ptr SS:[SI] si apoi incrementeaza/decrementeaza SI

    
    c) mnemonica:
  • toate instructiunile 8086, 8087 ($N+), 8026 ($G+), 80287, 80386, 80486, ...
  • directive: DB, DW, DD

  • Obs: In Pascal nu se pot defini variabile cu ajutorul directivelor de generare de date; acestea se folosesc pentru a genera siruri de octeti, cuvinte, dublu cuvinte in segmentul de cod.
    d)operanzi: -constante, referinte la memorie, registrii, obiecte pascal -constantele hexa (in baza 16) pot fi scrise in doua moduri: 0Ah si $0A -obiecte pascal: variabile, etichete, object

    Structura unui program pascal (din punctul de vedere al limbajului de asamblare)

  • 1 segment de date: contine variabile globale (din programul principal, unituri) + constante cu tip (constante care pot fi modificate; ex: const a:integer=5;)
  • 1 segment de stiva: se foloseste la apelurile de proceduri/functii (pentru a pune acolo adresa de revenire), se pun variabile locale si se mai foloseste pentru transmiterea parametrilor
  • cate un segment de cod pentru: programul principal si fiecare unit folosit
  • Obiecte pascal folosite in limbajul de asamblare

    1) constante pascal: orice constanta cu urmatoarele exceptii: real, set of, sir de caractere mai lung de 4 octeti
    2) etichete pascal: pot sa apara ca operanzi pentru instructiuni de salt
    3) variabile locale sau globale pascal 
    
    Corespondenta tipurilor Pascal - ASM
    char <--> byte         (ex: c:char <--> c db ?)
    byte <--> byte
    integer <--> DW
    longint <--> DD
    pointer <--> DD
    real <--> 6 octeti (virgula flotanta standard Turbo P.)
    string[10] <--> s db 11 dup(?)
    st of .. --> se reprezinta in memorie pe 32 octeti
    
    record
        a: integer;       <-->    db 3 dup(?)
        b: char; 
    end;
    
    4) nume de parametrii
    5) nume de proceduri/functii (exceptie: nu pot fi folosite proceduri si functii standard (cele definite in unit-ul System))
    6) simboluri speciale: @code,@data,@result 
       seg @code : adresa de segment a segmentului de cod 
       seg @data : adresa de segment a segmentului de date
       @result : variabila ce se poate folosi pentru a pune in ea rezultatul intors de o functie
    
    [ex: functia F returneaza expresia val:
         F:=val;	<--> mov @result,val	
         tipul lui @result coincide cu tipul valorii returnate de functie dar tradus in asamblare]
    

    Apelarea procedurilor pascal

    1. Transmitera parametrilor
    -prin valoare
    -prin referinta
    Parametrii se transmit prin intermediul stivei in modul urmator:
    
  • pentru parametrii transmisi prin valoare reprezentati pe maxim 4 octeti se va pune in stiva valorile parametrilor actuali
  • - daca valoarea parametrului actual este reprezentata pe 1 octet se pune in stiva un cuvant - daca valoarea parametrului actual este reprezentata pe 2 octeti se pune in stiva un cuvant - daca valoarea parametrului actual este reprezentata pe 4 octeti se pune in stiva doua cuvinte
  • pentru parametrii transmisi prin referinta se pune in stiva adresa far a parametrului actual: mai intai segmentul, apoi offsetul
  • pentru parametrii transmisi prin valoare reprezentati pe mai mult de 4 octeti se pune in stiva adresa parametrului, dar la intrarea in procedura se face o copie in stiva a valorii parametrului actual
  • 2. Intoarcerea rezultatelor de catre functii -in interiorul procedurile/functiilor toate rezultatele se pun in @result -in codul apelant, rezultatul intors de functie se preia din registrii: AL : daca rezultatul e pe 1 octet AX : daca rezultatul e pe 2 octeti DX:AX : daca rezultatul este pe dublucuvant -daca rezultatul e un string, acesta se returneaza intr-o zona de memorie a carei adresa este transmisa procedurii ca un ultim parametrii 3. Apel procedura 1)se pun parametrii in stiva (de la stanga la dreapta; in limbajul C parametrii se pun in stiva de la dreapta spre stanga) 2)daca procedura apelata este o functie care intoarce string, se aloca spatiu pentru rezultat dupa cere se pune in stiva adresa spatiului pentru rezultat 3)call numeproc/fct 4. Parametrii transmisi prin valoare au tipul in limbajul de asamblare egal cu tipul Pascal si se afla in stiva; daca parametrii sunt trimisi prin referinta, tipul in limbajul de asamblare coincide cu tipul adresa in pascal (dublu cuvant)