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

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:

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.

asamblare.

Registre de Segment

SCode SegmentNumar pe 16-biti ce reprezinta adresa segmentului de cod activ.
DSData SegmentNumar pe 16-biti ce reprezinta adresa segmentului de date activ.
SSStack SegmentNumar pe 16-biti ce reprezinta adresa segmentului de stiva activ.
ESExtra SegmentNumar pe 16-biti ce reprezinta adresa segmentului suplimentar activ.
Registre de Segment – Intel 8086

Registre Index

IPInstruction PointerNumar pe 16-biti ce reprezinta offeset-ul instructiunii urmatoare de executat în cadrul segmentului de cod.
SPStack PointerNumar pe 16-biti ce reprezinta offeset-ul din cadrul stivei.
BPBase PointerUtilizat pentru a transfera în/din stiva date.
SISource IndexUtilizat in operatiile cu siruri pentru a parcurge sursa.
DIDestination IndexUtilizat in operatiile cu siruri pentru a parcurge sursa.
Registre Index – Intel 8086

Registre de Bază

AXAccumulator RegisterCalcule si operatii de intrare/iesire
BXBase RegisterUtilizat ca index
CXCount RegisterUtilizat in instructiunile de ciclare
DXData RegisterOperatii de intrare/iesire, înmultire/împartire.
Registre de Bază – Intel 8086

Registrele de baza pot fi accesate si din punctul de vedere a primilor 8 biti de la stânga la dreapta (High) , respectiv a ultimilor 8 biti (Low).

AX
AHAL
BX
BHBL
CX
CHCL
DX
DHDL
Structura Registre de bază – Intel 8086

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

Registrul de FLAG-uri

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).

RegistruDenumireNr bit
OFOverflow Flag11
DFDirection Flag10
IFInterrupt Flag9
TFTrap Flag8
SFSign Flag7
ZFZero Flag6
AFAuxiliary Carry Flag4
PFParity Flag2
CFCarry Flag0
Registrul de FLAG-uri

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:
    • Întreg pe 32 biți cu sau fără semn
    • Număr 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