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

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:
== code(cpp) |mov byte ptr [bx], 0
mov word ptr [bx], 0
mov dword ptr [bx], 0
==
* mov byte ptr [bx], 0
* mov word ptr [bx], 0
* mov dword ptr [bx], 0
h5. Exemplu
== code(cpp) |mov ax, 3 // ax = 3
== code(asm)|mov ax, 3 // ax = 3
mov bx, ax // bx = ax
==
h4. Instructiuni aritmetice. Instructiunile ADD, SUB, INC, DEC
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
h5. Sintaxa
Flagurile afectate de aceste instructiuni sunt :
* add dest, source // echivalenta cu dest+=source
* sub dest, source // echivalenta cu dest-=source
* inc dest // echivalenta cu dest++
* dec dest // echivalenta cu dest--
carry flag - pentru "signed overflow"
h5. Variante
overflow flag - pentru overflow
* 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
sign flag - activat daca rezultatul este negativ
h5. Descriere
zero flag - activat daca rezultatul operatiei a fost 0
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).
parity flag - este setat in functie de paritatea rezultatului
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
h5. Restrictii
Restrictii
Destinatia trebuie sa aiba aceeasi marime ca si sursa.
h5. Exemplu
Exemplu
== code(cpp) |mov ax, 3 // ax = 3
mov ax, 3 // ax = 3
add bx, ax // bx = ax+3
==
h4. Instructiuni pe biti. Instructiunile AND, TEST, OR, XOR, NOT
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
h5. Sintaxa
xor dest, source // echivalenta cu dest^=source
* 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 dest // ~dest
h5. Variante
Variante
Pentru "{$and$}", "{$or$}", "{$test$}", "{$xor$}" sunt ca si cele de la "{$add$}". Pentru "{$not$}" avem doua variante :
Pentru "and", "or", "test", "xor" sunt ca si cele de la add. Pentru "not" avem doua variante :
* not reg8/16/32
* not mem
not reg8/16/32
h5. Descriere
not mem
 
 
 
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
Instructiunea "{$not$}" nu afecteaza nici un flag.
 
Flaguri afectate
 
Instructiunea "not" nu afecteaza nici un flag.
 
Flagurile afectate de celalalte instructiuni sunt :
* 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
carry, overflow - le dezactiveaza
h5. Restrictii
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
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
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
h5. Descriere
Instructiunile PUSH/POP
 
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
push val
h5. Variante
pop val
* push reg8/16/32
* pop reg8/16/32
Variante
h5. Exemplu
push reg8/16/32
 
pop reg8/16/32
== code(cpp) |@lp:
Exemplu
 
@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
==
h4. Instructiunea CMP
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
cmp val1, val2
h5. Variante
Variante
* 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 reg8/16/32, reg8/16/32
h4. Jump-urile neconditionate (JMP) si jump-urile conditionate (JE, JNE, JB, JBE, JA, JAE, JZ, JNZ)
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.
cmp mem8/16/32, reg8/16/32
h5. Sintaxa
cmp mem8/16/32, imm8/16/32
$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;
h5. Exemplu
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 :
== code(cpp) |mov ax, 1
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
instr1
instr2
*
inc ax
 
// compara ax cu valoarea 10
 
// si seteaza flagurile
cmp ax, 10
 
// daca ax != 10 sari inapoi la @loop
jne @loop
== code(cpp) |instr1
Exemplul 2:
 
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".
h4. Instructiunea LOOP
 
 
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.