Diferente pentru introducere-in-asamblare intre reviziile #2 si #1

Nu exista diferente intre titluri.

Diferente intre continut:

(Creat de '_chris_11_':user/chris_11 la data de _2005-08-15_ categoria _Limbaje_, autor(i) _Botau Cristian_)
*Continut scurt:*
 Acest articol prezinta un limbaj mai putin folosit : limbajul de asamblare. Este folosit de cele mai multe ori pentru marirea vitezei de rulare a programelor. In prima sectiune sunt prezentate cateva avantaje / dezavantaje in folosirea acestui limbaj. Apoi sunt definite notiunile elementare ce trebuie stiute inainte de a trece la tratarea limbajului propriu-zis. De asemenea, sunt prezentate cateva intructiuni si transcrieri ale unor structuri din C/Pascal in limbaj de asamblare. In final sunt comparati timpii de executie intre varianta pascal si varianta assembler ale unei proceduri de Bubble Sort.
 ==Include(page="template/raw")==
 
Acest articol prezinta un limbaj mai putin folosit : limbajul de asamblare. Este folosit de cele mai multe ori pentru marirea vitezei de rulare a programelor. In prima sectiune sunt prezentate cateva avantaje / dezavantaje in folosirea acestui limbaj. Apoi sunt definite notiunile elementare ce trebuie stiute inainte de a trece la tratarea limbajului propriu-zis. De asemenea, sunt prezentate cateva intructiuni si transcrieri ale unor structuri din C/Pascal in limbaj de asamblare. In final sunt comparati timpii de executie intre varianta pascal si varianta assembler ale unei proceduri de Bubble Sort.
*Continut lung:*
==Include(page="template/raw")==
 
Limbajul de asamblare : avantaje si dezavantaje in folosirea lui
Desi este unul dintre cele mai vechi limbaje de programare, limbajul de asamblare este incorporat si ??n cele mai noi compilatoare cum ar fi Visual C++ si Delphi. Codul de asamblare este foarte apropiat de codul executabil al programelor, asamblorul avand rolul de a codifica instructiunile din limbaj de asamblare in cod masina.
Desi este unul dintre cele mai vechi limbaje de programare, limbajul de asamblare este incorporat si *n cele mai noi compilatoare cum ar fi Visual C++ si Delphi. Codul de asamblare este foarte apropiat de codul executabil al programelor, asamblorul avand rolul de a codifica instructiunile din limbaj de asamblare in cod masina.
In prezent, limbajul de asamblare este din ce in ce mai putin folosit in scrierea programelor, deoarece compilatoarele de ultima generatie au functiile cele mai folosite de programatori deja scrise si optimizate in limbaj de asamblare (gen memmove, memset / fillchar, etc.) incluse in unit-uri si biblioteci. Bineinteles, daca se doreste atingerea unor timpi de executie foarte mici, folosirea limbajului de asamblare este preferabila (cand avem algoritmul de complexitate optima).
Acestia sunt :
* eax â?? numit si "accumulator" â?? acesta este cel mai folosit in executarea operatiilor aritmetice (adunare, scadere, inmultire, impartire);
* ebx â?? numit si "base" â?? acesta registru este folosit pentru adresarea indirecta a memoriei;
* ecx â?? numit si "count" â?? acest registru este folosit mai ales in cadrul "buclelor" (in instructiunile repetitive â?? for/ while do/ do while/ repeat until);
* edx â?? numit si "data" â?? retine anumite variabile, si este folosit impreuna cu eax in executarea operatiei "div" â?? impartire intreaga (avand rolul de a retine restul impartirii).
* eax * numit si "accumulator" * acesta este cel mai folosit in executarea operatiilor aritmetice (adunare, scadere, inmultire, impartire);
* ebx * numit si "base" * acesta registru este folosit pentru adresarea indirecta a memoriei;
* ecx * numit si "count" * acest registru este folosit mai ales in cadrul "buclelor" (in instructiunile repetitive * for/ while do/ do while/ repeat until);
* edx * numit si "data" * retine anumite variabile, si este folosit impreuna cu eax in executarea operatiei "div" * impartire intreaga (avand rolul de a retine restul impartirii).
Dupa cum ati observat, fiecare registru general are o functie specifica, insa oricare din ei pot fi folositi si la operatii aritmetice/logice, adresare memorie sau ca si variabile.
Parantezele drepte se refera la zona de memorie adresata de registru.
Exemplu :
"[esi]" â?? se refera la valoarea aflata la adresa de memorie cu offset-ul esi, iar "esi" â?? se refera la valoarea stocata in registrul esi;
"[esi]" * se refera la valoarea aflata la adresa de memorie cu offset-ul esi, iar "esi" * se refera la valoarea stocata in registrul esi;
daca esi = 100 atunci [esi] â?? va reprezenta valoarea care se afla la adresa cu offset-ul 100, iar esi va reprezenta valoarea 100.
daca esi = 100 atunci [esi] * va reprezenta valoarea care se afla la adresa cu offset-ul 100, iar esi va reprezenta valoarea 100.
Va sfatuiesc sa NU incercati sa modificati urmatorii registri : cs (care contine segmentul la care se afla incarcat codul executabilului, ss â?? contine segmentul de memorie in care se afla stiva sistemului).
Va sfatuiesc sa NU incercati sa modificati urmatorii registri : cs (care contine segmentul la care se afla incarcat codul executabilului, ss * contine segmentul de memorie in care se afla stiva sistemului).
Sunt folosite urmatoarele prescurtari :
* reg8/ reg16/ reg32 â?? se refera la registri pe 8/16/32 biti;
* imm8/ imm16/ imm32 â?? se refera la valori imediate (constante);
* mem8/ mem16/ mem32 â?? zona memorie de memorie sau variabile pe 8/16/32 biti;
* reg8/ reg16/ reg32 * se refera la registri pe 8/16/32 biti;
* imm8/ imm16/ imm32 * se refera la valori imediate (constante);
* mem8/ mem16/ mem32 * zona memorie de memorie sau variabile pe 8/16/32 biti;
Scriere/Citire memorie si registri
add dest, source // echivalenta cu dest+=source
sub dest, source // echivalenta cu dest-=source
inc dest // echivalenta cu dest++
dec dest // echivalenta cu dest
dec dest // echivalenta cu dest*
Descriere
Instructiunea "add" este folosita pentru a aduna doua valori, "sub" pentru a scadea o valoare din alta, inc â?? incrementarea unei variabile, "dec" â?? decrementarea unei variabile (registru/memorie).
Instructiunea "add" este folosita pentru a aduna doua valori, "sub" pentru a scadea o valoare din alta, inc * incrementarea unei variabile, "dec" * decrementarea unei variabile (registru/memorie).
Aceste instructiuni sunt folosite pentru generarea instructiunilor If /while do /do while /repeat /for.Sunt asemanatoare instructiunii goto din C/Pascal.
Sintaxa : instructiune label
JE â?? "sare" cu executia programului la label daca flag-ul equality este setat;
JNE â?? "sare" cu executia programului la label daca flag-ul equality nu este setat;
JB â?? "sare" cu executia programului la label daca flag-ul below este setat;
JBE â?? "sare" cu executia programului la label daca flag-ul below sau flagul equality este setat;
JA â?? "sare" cu executia programului la label daca flag-ul below nu este setat;
JAE â?? "sare" cu executia programului la label daca flag-ul equality este setat sau flag-ul below nu este setat;
JZ â?? "sare" cu executia programului la label daca flag-ul zero este setat;
JNZ â?? "sare" cu executia programului la label daca flag-ul zero nu este setat;
JMP â?? "sare" cu executia programului la label;
JE * "sare" cu executia programului la label daca flag-ul equality este setat;
JNE * "sare" cu executia programului la label daca flag-ul equality nu este setat;
JB * "sare" cu executia programului la label daca flag-ul below este setat;
JBE * "sare" cu executia programului la label daca flag-ul below sau flagul equality este setat;
JA * "sare" cu executia programului la label daca flag-ul below nu este setat;
JAE * "sare" cu executia programului la label daca flag-ul equality este setat sau flag-ul below nu este setat;
JZ * "sare" cu executia programului la label daca flag-ul zero este setat;
JNZ * "sare" cu executia programului la label daca flag-ul zero nu este setat;
JMP * "sare" cu executia programului la label;
Exemplu :
@loop :
instr1
instr2
 
*
inc ax
// compara ax cu valoarea 10
IF cond THEN instr
* IF cond THEN instr
Exemplu : if (a==5) b=a; // a, b â?? integer
Exemplu : if (a==5) b=a; // a, b * integer
mov ax, a
cmp ax, 5
mov b, ax
@skip_if :
IF cond THEN instr1 ELSE instr2
* IF cond THEN instr1 ELSE instr2
Exemplu : if (a==b) a-=b; else b-=a;
DO { inst } WHILE
* DO { inst } WHILE
Exemplu :

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.