Diferente pentru introducere-in-asamblare intre reviziile #11 si #12

Nu exista diferente intre titluri.

Diferente intre continut:

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 byte ptr [bx], 0
* mov word ptr [bx], 0
* mov dword ptr [bx], 0
== code(cpp) |mov byte ptr [bx], 0
mov word ptr [bx], 0
mov dword ptr [bx], 0
==
h5. Exemplu
== code(asm)|mov ax, 3 // ax = 3
== code(cpp) |mov ax, 3 // ax = 3
mov bx, ax // bx = ax
==
Instructiuni aritmetice
 
Instructiunile ADD, SUB, INC, DEC
 
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*
 
 
 
Variante
 
add(sub) reg8/16/32, mem8/16/32
add(sub) reg8/16/32, reg8/16/32
add(sub) mem8/16/32, reg8/16/32
add(sub) reg8/16/32, imm8/16/32
add(sub) mem8/16/32, imm8/16/32
 
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).
 
 
 
Flaguri afectate
h4. Instructiuni aritmetice. Instructiunile ADD, SUB, INC, DEC
Flagurile afectate de aceste instructiuni sunt :
h5. Sintaxa
carry flag - pentru "signed overflow"
* add dest, source // echivalenta cu dest+=source
* sub dest, source // echivalenta cu dest-=source
* inc dest // echivalenta cu dest++
* dec dest // echivalenta cu dest--
overflow flag - pentru overflow
h5. Variante
sign flag - activat daca rezultatul este negativ
* add(sub) reg8/16/32, mem8/16/32
* add(sub) reg8/16/32, reg8/16/32
* add(sub) mem8/16/32, reg8/16/32
* add(sub) reg8/16/32, imm8/16/32
* add(sub) mem8/16/32, imm8/16/32
zero flag - activat daca rezultatul operatiei a fost 0
h5. Descriere
parity flag - este setat in functie de paritatea rezultatului
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
* carry flag - pentru "signed overflow"
* overflow flag - pentru overflow
* sign flag - activat daca rezultatul este negativ
* zero flag - activat daca rezultatul operatiei a fost 0
* parity flag - este setat in functie de paritatea rezultatului
Restrictii
h5. Restrictii
Destinatia trebuie sa aiba aceeasi marime ca si sursa.
Exemplu
h5. Exemplu
mov ax, 3 // ax = 3
== code(cpp) |mov ax, 3 // ax = 3
add bx, ax // bx = ax+3
==
Instructiuni pe biti
 
Instructiunile AND, TEST, OR, XOR, NOT
 
Sintaxa
 
and dest, source // echivalenta cu dest&=source
 
test dest, source // dest & source
 
or dest, source // echivalenta cu dest|=source
 
xor dest, source // echivalenta cu dest^=source
 
not dest // ~dest
 
Variante
h4. Instructiuni pe biti. Instructiunile AND, TEST, OR, XOR, NOT
Pentru "and", "or", "test", "xor" sunt ca si cele de la add. Pentru "not" avem doua variante :
h5. Sintaxa
not reg8/16/32
* and dest, source // echivalenta cu dest&=source
* test dest, source // dest & source
* or dest, source // echivalenta cu dest|=source
* xor dest, source // echivalenta cu dest^=source
* not dest // ~dest
not mem
h5. Variante
Pentru "{$and$}", "{$or$}", "{$test$}", "{$xor$}" sunt ca si cele de la "{$add$}". Pentru "{$not$}" avem doua variante :
* not reg8/16/32
* not mem
Descriere
h5. 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.
 
Instructiunea "{$not$}" nu afecteaza nici un flag.
Flagurile afectate de celalalte instructiuni sunt :
carry, overflow - le dezactiveaza
* carry, overflow - le dezactiveaza
* sign flag - este copiat bitul cel mai semnificativ din rezultat (semnul rezultatului, de fapt)
* zero flag - activat daca rezultatul operatiei a fost 0
* parity flag - este setat in functie de paritatea rezultatului
sign flag - este copiat bitul cel mai semnificativ din rezultat (semnul rezultatului, de fapt)
 
zero flag - activat daca rezultatul operatiei a fost 0
 
parity flag - este setat in functie de paritatea rezultatului
 
 
 
Restrictii
h5. 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.
Exemplu
h5. Exemplu
mov ax, 5 // ax = 3
== code(cpp) |mov ax, 5 // ax = 3
test ax, 1 // daca (ax & 1)
jz @skip // daca ax este nu este impar sari la @skip
// executa instructiuni
@skip
and bx, FFFEh // bx = bx & 0xFFFE (se sterge
// bitul cel mai nesemnificativ)
 
and bx, FFFEh // bx = bx & 0xFFFE (se sterge bitul cel mai nesemnificativ)
h4. Instructiunile PUSH/POP
Instructiunile PUSH/POP
 
Descriere
h5. 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.
Sintaxa
 
push val
 
pop val
h5. Sintaxa
Variante
* push val
* pop val
push reg8/16/32
h5. Variante
pop reg8/16/32
* push reg8/16/32
* pop reg8/16/32
Exemplu
h5. Exemplu
@lp:
== code(cpp) |@lp:
push cx // salvam valoarea cx
... // prelucreaza datele, se poate modifica cx
pop cx // scoate de pe stiva valoarea cx
dec cx
jnz @lp // daca (cx != 0) atunci sari inapoi la @lp
==
Instructiunea CMP
h4. Instructiunea CMP
Descriere
h5. 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).
Sintaxa
 
cmp val1, val2
h5. Sintaxa
Variante
* cmp val1, val2
cmp reg8/16/32, reg8/16/32
h5. Variante
cmp reg8/16/32, imm8/16/32
* cmp reg8/16/32, reg8/16/32
* cmp reg8/16/32, imm8/16/32
* cmp mem8/16/32, reg8/16/32
* cmp mem8/16/32, imm8/16/32
cmp mem8/16/32, reg8/16/32
 
cmp mem8/16/32, imm8/16/32
 
 
 
Jump-urile neconditionate (JMP) si jump-urile conditionate (JE, JNE, JB, JBE, JA, JAE, JZ, JNZ)
h4. Jump-urile neconditionate (JMP) si jump-urile conditionate (JE, JNE, JB, JBE, JA, JAE, JZ, JNZ)
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;
Exemplu :
h5. Sintaxa
mov ax, 1
@loop :
instr1
instr2
*
inc ax
$instructiune label$
// compara ax cu valoarea 10
* 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;
// si seteaza flagurile
cmp ax, 10
h5. Exemplu
// daca ax != 10 sari inapoi la @loop
== code(cpp) |mov ax, 1
@loop :
    instr1
    instr2
    *
    inc ax
    // compara ax cu valoarea 10 si seteaza flagurile
    cmp ax, 10
    // daca ax != 10 sari inapoi la @loop
jne @loop
Exemplul 2:
 
instr1
== code(cpp) |instr1
jmp @label1
instr2
instr3
    instr2
    instr3
@label1 :
 
 
==
In ultimul exemplu instr2 si instr3 nu vor fi executate deoarece inaintea lor se afla instructiunea jump care face ca programul sa sara cu executia la instructiunea imediat urmatoare etichetei "label1".
 
 
Instructiunea LOOP
h4. Instructiunea LOOP
Instructiunea "loop" este folosita de obicei in transcrierea for-urilor si a buclelor.

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.