Tutorial Limbaj de Asamblare (Assembler) Intel 8086 – Partea 1 – Elemente de baza

3 comments -

Acest tutorial are ca scop descrierea cunostintelor teoretice si practice cu privire la programarea in limbaj de asamblare pentru procesoarele din familia Intel 8086 pe 16 biti. Folosind aceste elemente de baza se poate trece cu usurinta la o arhitectura superioara, 32 sau 64 de biti.

Inainte de a realiza o aplicatie in limbaj de asamblare, trebuie intelese o serie de elemente de baza cu privire la:

  • Registrele procesorului Intel 8086
  • Tipurile de date utilizate in limbaj de asamblare

Pentru a intelege exemplele si pentru a aprofunda aceste cunostinte, pot fi utilizate resursele:

  • [1] Microsoft Press – Programmer’s Guide, Microsoft® MASM, Assembly-Language Development System, Version 6.1, For MS-DOS® and Windows™ Operating Systems, Microsoft Press, 1992
  • [2] Randall Hyde – The Art of
    Assembly Language Programming
    , format electronic, 1996
  • [3] Dan Somnea, Vladut TEODOR – Programarea în Assembler, Ed. Tehnica, Bucuresti, 1992.
  • [4] Gheorghe Musca – Programare în limbaj de Asamblare, Ed. Teora, Bucuresti 1997.
  • [5] Vasile LUNGU – Procesoare INTEL Programare în Limbaj de asamblare, Editura TEORA, Bucuresti, 2000.
  • [6] Ion IVAN, Paul POCATIUL, Doru CAZAN – Limbaje de asamblare, Academia de Studii Economice Bucuresti, Centrul de Învatamant Economic deschis la Distanta, Bucuresti, 2002
  • [7] Ion IVAN, Paul POCATIUL, Doru CAZAN – Practica dezvotarii software in Limbaje de asamblare, Editura Economica, Bucuresti, 2002
  • [8] Laur IVAN – Programarea în limbaj de asamblare, Culegere de probleme, Editura ASE, Bucuresti, 1997.

Software necesar:

  • Editor: orice editor ASCII simplu (Microsoft Notepad, Notepad++, editor MS-DOS)
  • Turbo Assembler 2.5, Turbo Linker 4.0 si Turbo Debugger 2.5 (arhiva utilitare )

Set registre procesor Intel 8086


Procesorul Intel 8086 are 14 registre pe 16-biti, utilizati în diferite scopuri. Aceste registre pot fi vazute ca fiind zone de memorie de dimensiune fixa aflate in procesor si care pot fi accesate din aplicatiile scrise in limbaj de asamblare.

Registre de Segment
CS Code Segment Numar pe 16-biti ce reprezinta adresa segmentului de cod activ.
DS Data Segment Numar pe 16-biti ce reprezinta adresa segmentului de date activ.
SS Stack Segment Numar pe 16-biti ce reprezinta adresa segmentului de stiva activ.
ES Extra Segment Numar pe 16-biti ce reprezinta adresa segmentului suplimentar activ.
Registre index
IP Instruction Pointer Numar pe 16-biti ce reprezinta offeset-ul instructiunii urmatoare de executat în cadrul segmentului de cod.
SP Stack Pointer Numar pe 16-biti ce reprezinta offeset-ul din cadrul stivei.
BP Base Pointer Utilizat pentru a transfera în/din stiva date.
Registre de baza
AX Accumulator Register Calcule si operatii de intrare/iesire
BX Base Register Utilizat ca index
CX Count Register Utilizat in instructiunile de ciclare
DX Data Register Operatii de intrare/iesire, înmultire/împartire.
Registre index
SI Source Index Utilizat in operatiile cu siruri pentru a parcurge sursa.
DI Destination Index Utilizat in operatiile cu siruri pentru a parcurge sursa.

Registrele de baza pot fi accesate si din punctul de vedere a primilor 8 biti, respectiv a ultimilor 8 biti.

AX
AH AL
BX
BH BL
CX
CH CL
DX
DH DL

De exemplu, daca registrul AX contine valoarea 1234h atunci AH are valoarea 12h si AL are 34h.

Un registru pe 16 biti numit registru FLAG este utilizat pentru a controla executia instructiunilor. Flag-urile reprezinta biti ce pot avea valoarea 1 (SET) sau 0 (NOT SET).

Registru de FLAG-uri
Abr.

Nume

Nr. bit

OF Overflow Flag

11

DF Direction Flag

10

IF Interrupt Flag

9

TF Trap Flag

8

SF Sign Flag

7

ZF Zero Flag

6

AF Auxiliary Carry

4

PF Parity Flag

2

CF Carry Flag

0

Semnificatia indicatorilor de conditie este urmatoarea [6]:

  • CF (Carry Flag, indicator de transport) semnifica un transport sau un împrumut în, respectiv din bitul cel mai semnificativ al rezultatului.
  • PF (Parity Flag, indicator de paritate) este pozitionat dupa cum bitii din cel mai putin semnificativ octet al rezultatului sunt în numar par (pozitionare pe 1) sau impar (pozitionare pe 0).
  • AF (Adjust Flag, indicator de ajustare) este folosit în aritmetica zecimala si semnifica un transport sau un împrumut în, respectiv din bitul 4 (cel mai semnificativ bit al jumatatii celei mai putin semnificative) al rezultatului.
  • ZF (Zero Flag, indicator de zero) indica daca rezultatul unei operatii a fost sau nu zero.
  • SF (Sign Flag, indicator de semn) are aceeasi valoare ca bitul cel mai semnificativ al rezultatului (bitul de semn): 0 – pozitiv, 1 – negativ.
  • TF (Trap Flag, indicator de urmarire a executiei) este folosit la depanarea programelor prin executia lor pas cu pas – daca este setat, procesorul forteaza automat o exceptie dupa executia fiecarei instructiuni.
  • IF (Interrupt Flag, indicator de întreruperi) precizeaza daca procesorul ia în considerare sau nu întreruperile externe.
  • DF (Direction Flag, indicator de directie) precizeaza sensul (0 – crescator sau 1 -descrescator) în care este modificat contorul de adrese la operatiile cu siruri.
  • OF (Overflow Flag, indicator de depasire) semnifica depasirea domeniului admisibil la reprezentarea rezultatului unei operatii aritmetice cu sau fara semn. Practic, este pozitionat pe 1 daca apare un transport înspre bitul cel mai semnificativ al rezultatului din bitul vecin, dar nu si din bitul cel mai semnificativ spre CF sau invers, dinspre bitul cel mai semnificativ spre CF, dar nu si spre bitul cel mai semnificativ din bitul vecin. Similar, la împrumut, este pozitionat pe 1 daca apare un transport de la bitul cel mai semnificativ la bitul vecin, dar nu si înspre bitul cel mai semnificativ dinspre CF sau invers, dinspre CF spre b.c.m.s., dar nu si dinspre bitul cel mai semnificativ spre bitul vecin.

Tipuri de date in limbaj de asamblare


  1. Bit
  2. Nibble – grup de 4 biti; utilizat în codificarea numerelor în format BCD (Binary Coded Decima)
  3. Byte (octet) – grup de 8 biti; definire cu db;
  4. Word (cuvant) – grup de 16 biti sau 2 octeti; definire cu dw;
  5. Double (dublu cuvant) – grup de 32 biti sau 4 octeti; definire cu dd;
  6. Quad – grup de 64 biti sau 8 octeti; definire cu dq.

O descriere detaliata a tipurilor de date fundamentale ale limbajului de asamblare:

Tipul de data – BYTE

  • Spatiu ocupat: 1 octet
  • Definire: a DB 10
  • Interpretare:
    • Intreg pe 8 biti cu sau fara semn
    • Caracter ASCII
Tipul de date Byte - limbaj de asamblare

Tipul de date Byte - limbaj de asamblare

Tipul de data – WORD

  • Spatiu ocupat: 2 octeti
  • Definire: a DW 1234h
  • Interpretare:
    • Intreg pe 16 biti cu sau fara semn
    • Secventa de 2 caractere ASCII
    • Adresa de memorie pe 16 biti
Tipul de date Word - limbaj de asamblare

Tipul de date Word - limbaj de asamblare

Tipul de data – DOUBLE-WORD

  • Spatiu ocupat: 4 octeti
  • Definire: a DD 12345678h
  • Interpretare:
    • Intreg pe 32 biti cu sau fara semn
    • Numar real simpla precizie
    • Adresa de memorie pe 32 biti
Tipul de date Double - limbaj de asamblare

Tipul de date Double - limbaj de asamblare

Tipul de data QUAD-WORD

  • Spatiu ocupat: 8 octeti
  • Definire: a DQ 12345678
  • Interpretare:
    • Intreg pe 64 biti cu sau fara semn
    • Numar real dubla precizie

Tipul de date Quad - limbaj de asamblare

Tipul de date Quad - limbaj de asamblare

,