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)