Diferente pentru introducere-in-asamblare intre reviziile #27 si #28

Nu exista diferente intre titluri.

Diferente intre continut:

h4. Instructiunea MOV
h5. Sintaxa
_Sintaxa_:
* $mov dest, source$ // echivalenta cu dest = source
h5. Variante
_Variante_:
* $mov reg8/16/32, mem8/16/32$
* $mov reg8/16/32, reg8/16/32$
* $mov reg8/16/32, imm8/16/32$
* $mov mem8/16/32, imm8/16/32$
h5. Descriere
_Descriere_:
Instructiunea copiaza o valoare dintr-o locatie in alta locatie. Aceasta locatie poate fi zona de memorie, variabila, registru. De retinut este ca nu exista variante ale instructiunii care copiaza direct dintr-o zona de memorie in alta.
h5. Flaguri afectate
_Flaguri afectate_:
Instructiunea mov nu modifica nici un flag.
h5. Restrictii
_Restrictii_:
Ambii operanzi trebuie sa aiba aceeasi marime. De exemplu pentru ultima varianta a instructiunii mov trebuie specificata marimea zonei de memorie. Instructiunea "mov [bx], 0" nu este corecta deoarece compilatorul nu stie ce vrea sa faca instructiunea: sa copieze valoarea 0 in byte-ul, in word-ul sau in doubleword-ul de la adresa bx. Astfel variantele corecte sunt:
mov dword ptr [bx], 0
==
h5. Exemplu
_Exemplu_:
== code(cpp) |mov ax, 3 // ax = 3
mov bx, ax // bx = ax
h4. Instructiuni aritmetice. Instructiunile ADD, SUB, INC, DEC
h5. Sintaxa
_Sintaxa_:
* $add dest, source$ // echivalenta cu dest+=source
* $sub dest, source$ // echivalenta cu dest-=source
* $inc dest$ // echivalenta cu dest++
* $dec dest$ // echivalenta cu dest--
h5. Variante
_Variante_:
* $add(sub) reg8/16/32, mem8/16/32$
* $add(sub) reg8/16/32, reg8/16/32$
* $add(sub) reg8/16/32, imm8/16/32$
* $add(sub) mem8/16/32, imm8/16/32$
h5. Descriere
_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).
h5. Flaguri afectate
_Flaguri afectate_:
* $carry flag$ - pentru "signed overflow"
* $overflow flag$ - pentru overflow
* $zero flag$ - activat daca rezultatul operatiei a fost 0
* $parity flag$ - este setat in functie de paritatea rezultatului
h5. Restrictii
_Restrictii_:
Destinatia trebuie sa aiba aceeasi marime ca si sursa.
h5. Exemplu
_Exemplu_:
== code(cpp) |mov ax, 3 // ax = 3
add bx, ax // bx = ax+3
h4. Instructiuni pe biti. Instructiunile AND, TEST, OR, XOR, NOT
h5. Sintaxa
_Sintaxa_:
* $and dest, source$ // echivalenta cu dest&=source
* $test dest, source$ // dest & source
* $xor dest, source$ // echivalenta cu dest^=source
* $not dest$ // ~dest
h5. Variante
_Variante_:
Pentru "{$and$}", "{$or$}", "{$test$}", "{$xor$}" sunt ca si cele de la "{$add$}". Pentru "{$not$}" avem doua variante :
* $not reg8/16/32$
* $not mem$
h5. Descriere
_Descriere_:
Executa operatiile pe biti corespunzatoare. Instructiunea test (non-destructive and) este asemanatoare lui and, dar nu afecteaza rezultatul ci doar flagurile.
h5. Flaguri afectate
_Flaguri afectate_:
Instructiunea "{$not$}" nu afecteaza nici un flag.
Flagurile afectate de celalalte instructiuni sunt :
* $zero flag$ - activat daca rezultatul operatiei a fost 0
* $parity flag$ - este setat in functie de paritatea rezultatului
h5. Restrictii
_Restrictii_:
Destinatia trebuie sa aiba aceeasi marime ca si sursa.
Instructinile $OR/XOR/INC/DEC$ modifica flag-urile microprocesorului: {$Carry$}(numai {$ADD/SUB$}), {$Overflow$}, {$Zero$}, {$Parity$}.
h5. Exemplu
_Exemplu_:
== code(cpp) |mov ax, 5 // ax = 3
test ax, 1 // daca (ax & 1)
h4. Instructiunile PUSH/POP
h5. Descriere
_Descriere_:
Aceste instructiuni sunt folosite pentru accesarea stivei sistemului. Instructiunea PUSH pune pe stiva sistemului o valoare, iar instructiunea POP extrage valoarea din varful stivei.
h5. Sintaxa
_Sintaxa_:
* $push val$
* $pop val$
h5. Variante
_Variante_:
* $push reg8/16/32$
* $pop reg8/16/32$
h5. Exemplu
_Exemplu_:
== code(cpp) |@lp:
push cx // salvam valoarea cx
h4. Instructiunea CMP
h5. Descriere
_Descriere_:
Compara doua valori si seteaza flag-urile microprocesorului cu rezultatele compararii. De cele mai multe ori este folosita in combinatie cu jump-urile (vezi mai jos).
h5. Sintaxa
_Sintaxa_:
* $cmp val1, val2$
h5. Variante
_Variante_:
* $cmp reg8/16/32, reg8/16/32$
* $cmp reg8/16/32, imm8/16/32$
Aceste instructiuni sunt folosite pentru generarea instructiunilor If /while do /do while /repeat /for.Sunt asemanatoare instructiunii goto din C/Pascal.
h5. Sintaxa
_Sintaxa_:
$instructiune label$
* $JNZ$ * "sare" cu executia programului la label daca flag-ul zero nu este setat;
* $JMP$ * "sare" cu executia programului la label;
h5. Exemplu
_Exemplu_:
== code(cpp) |mov ax, 1
@loop :
Instructiunea "loop" este folosita de obicei in transcrierea for-urilor si a buclelor.
h5. Sintaxa
_Sintaxa_:
* $loop label$
h5. Descriere
_Descriere_:
Echivalenta cu :
h4. Instructiunea INT
h5. Descriere
_Descriere_:
Instructiunea INT apealeaza o intrerupere.
h5. Sintaxa
_Sintaxa_:
* $INT nr_intrerupere$ (un numar cuprins intre 0 si 255);
Intreruperile opresc programul din rulare, executa un anumit cod si apoi permit continuarea rularii programului. Cu ajutorul apelului intreruperilor aplicatia poate sa comunice cu sistemul de operare, si cu unele componente hardware ale calculatorului (mouse-ul, tastatura, imprimanta, etc). Fiecare intrerupere are asociat un numar.
h5. Exemple
_Exemple_:
* $0x9$ : intreruperea pentru tastatura;
* $0x10$ : intreruperea care ofera serviciile BIOS pentru accesul la placa video;
==
Output program pascal (pe pc-ul meu: Duron $750$ Mhz):
$100$ rulari ale bsort in asamblare au rulat in : $1.263$ secunde
$100$ rulari ale bsort obisnuit au rulat in : $4.614$ secunde
De precizat este ca nu am optimizat programul aproape deloc (am transcris codul din pascal in asm). Cu optimizari "hardcore" se pot obtine timpi mult mai buni. Diferenta dintre varianta asm si varianta high level language este mai mica pe compilatoarele mai noi, cum ar fi GCC sau FreePascal deoarece acestea stiu genera un cod mai optimizat. Totusi, nici un compilator nu poate bate creierul uman.
 
h2. Linkuri
* $100$ rulari ale bsort in asamblare au rulat in : $1.263$ secunde
* $100$ rulari ale bsort obisnuit au rulat in : $4.614$ secunde
"Link #1":http://www.arl.wustl.edu/~lockwood/class/cs306/books/
"Link #2":http://artofasm/toc.html
 
Cartea "The Art of Assembly Language Programming". Este detaliata. Foarte buna atat pentru incepatori cat si pentru avansati.
De precizat este ca nu am optimizat programul aproape deloc (am transcris codul din pascal in asm). Cu optimizari "hardcore" se pot obtine timpi mult mai buni. Diferenta dintre varianta asm si varianta high level language este mai mica pe compilatoarele mai noi, cum ar fi GCC sau FreePascal deoarece acestea stiu genera un cod mai optimizat. Totusi, nici un compilator nu poate bate creierul uman.
"Link #3":http://www.goof.com/pcg/doc/pentopt.txt
h2(#linkuri). Linkuri
Un tutorial bun pentru optimizarea programelor in asamblare pentru procesoarele din familia Pentium. Tutorialul este pentru avansati.
* '_The Art of Assembly Language_':http://www.scribd.com/doc/6498072/Art-of-Assembly. O carte detaliata si foarte buna atat pentru incepatori cat si pentru avansati.
"Link #4":http://www.techtutorials.info/assembly.html
* '_How to optimize for the Pentium processor_':http://www.goof.com/pcg/doc/pentopt.txt. Un tutorial bun pentru optimizarea programelor in asamblare pentru procesoarele din familia Pentium. Tutorialul este pentru avansati.
Mai multe tutoriale despre assembly language.
* '_Assembly Tutorials_':http://www.techtutorials.info/assembly.html. Mai multe tutoriale despre assembly language.
h2. Doua cuvinte conclusive...
Acest articol trateaza "bazele" programarii in asamblare, dupa cum ii zice numele este doar o introducere. Pentru a sti sa programezi in asm, trebuie invatate mult mai multe lucruri. Scopul articolului este de a starni interesul cititorilor si de a le oferi o imagine asupra acestui limbaj. Cei ce doresc sa invete mai multe despre assembly language sunt invitati sa citeasca cartile / tutorialele din sectiunea linkuri.
 
Acest articol trateaza "bazele" programarii in asamblare, dupa cum ii zice numele este doar o introducere. Pentru a sti sa programezi in _asm_, trebuie invatate mult mai multe lucruri. Scopul articolului este de a starni interesul cititorilor si de a le oferi o imagine asupra acestui limbaj. Cei ce doresc sa invete mai multe despre _assembly language_ sunt invitati sa citeasca cartile / tutorialele din sectiunea 'linkuri':introducere-in-asamblare#linkuri.

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.