Instructiuni conditionale

In limbajul de asamblare nu avem instructiuni conditionale sau bucle structurate. Acestea trebuie deci simulate folosind instructiuni gen goto sau if ... goto.

Saltul neconditionat se face prin instructiunea jmp. Sintaxa este jmp eticheta. Efectul este ca urmatoarea instructiune executata este cea care urmeaza punctului marcat prin eticheta. Eticheta are sintaxa: eticheta: (numele urmat de caracterul doua-puncte).

Exista instructiuni de salt conditionat. Conditia este intotdeauna formulata in termeni de valorile bistabililor de conditie (flags).

Flagurile se comporta ca niste registrii de un bit. De regula, instructiunile aritmetice si logice le modifica; celelalte instructiuni nu le modifica. Atentie: instructiunile inc si dec, desi aritmetice, nu modifica flagurile.

Astfel, o instructiune de salt conditionat trebuie in principiu sa urmeze dupa o instructiune aritmetica sau logica care seteaza flag-urile.

Tipuri de teste:

  1. Test de zero: toate operatiile aritmetice si logice actualizeaza valoarea lui ZF (zero flag). Astfel, jz va efectua saltul daca rezultatul operatiei aritmetice anterioare a fost egal cu 0.
  2. Test de depasire: pentru adunare si scadere cu numere reprezentate fara semn, avem depasire daca si nuai daca avem transport/imprumut. Astfel, testul de depasire se va face cu instructiunea jc (negata jnc). La aritmetica in cod complementar, depasirea este semnalata de OF (Overflow Flag), instructiunea de salt fiind jo
  3. Comparatia: se incepe cu o operatie de scadere (sub) sau scaderea fara memorarea restului (cmp). Starea flagurilor CF si ZF (la operanzi fara semn) sau SF si ZF (la cele cu semn) permit sa aflam daca descazutul a fost mai mare, egal sau mai mic decat scazatorul.

    Pentru operanzi fara semn, instructiunile de salt conditionat folosite sunt jb, ja, je, jne, jbe, jae

    Pentru operanzi cu semn, instructiunile de salt conditionat folosite sunt jl, jg, je, jne, jle, jge.

Exercitii

  1. Calculati expresia r=a+b-c, numerele fiind reprezentate pe 16 biti fara semn, testand eventualele depasiri. Intr-o variabila de tip byte puneti 0 daca nu au fost depasiri si 1 daca au fost.

    Rezolvare

    Codul:

      mov ax, a
      add ax, b
      jc depasire
      sub ax, c
      jc depasire
      mov r, ax
      mov al, 0
      mov dep, 0
      jmp final
    depasire:
      mov al, 1
      mov dep, al
    final:
    
  2. Calculati cel mai mare divizor comun a doua numere date.
    Rezolvare
  3. Aflati numarul de divizori ai unui numar dat


Arhitectura calculatoarelor

14 Nov 2001
Radu-Lucian LUPSA