Curs Virusologie - Part I

November 6, 2016 | Author: Cookie503 | Category: N/A
Share Embed Donate


Short Description

Download Curs Virusologie - Part I...

Description

TEHNOLOGII VIRUS SI ANTI-VIRUS

Forma de organizare: Activitate didactica: Curs 50% + Laborator 50% 15 ore 15 ore Limba de predare: Romana Modalitate evaluare: Examen scris in sesiune (3 ore) Obiectiv: Însuşirea elementelor teoretice si principiilor practice privind dezvoltarea tehnologiilor virus si antivirus utilizând limbajul de asamblare 8086 si limbajul C

TEHNOLOGII VIRUS SI ANTI-VIRUS SecŃiunea I – Limbaj de asamblare •Introducere in structura unui program assembler - Exemplu •Reprezentare interna si tipuri de date •Registrii microprocesor 8086 si mod de adresare real •Categorii de instrucŃiuni, tipuri de adresari •Codificarea instrucŃiunilor •InstrucŃiuni 8086 •Structuri fundamentale de control •Proceduri •Macrodefinitii •Întreruperi si lucrul cu consola si discul •OperaŃii cu şiruri de caractere •(Coprocesorul matematic)

SecŃiunea II – Viruşi •Principii de dezvoltare virusi informatici •Virusi de fisiere: –Fisiere sursa –Fisiere executabile – pe diferite platforme (DOS, Windows, Linux) •Virusi de Boot •Tehnici avansate de construire virusi informatici (polimorfi, mecanisme anti anti-virus)

SecŃiunea III – Anti-Virus •Model de dezvoltare

BIBLIOGRAFIE SecŃiunea I – Limbaj de asamblare • Microsoft MASM – Programmer’s Guide, Microsoft Corporation, 1992. • Ion IVAN, Doru CAZAN, Paul POCATILU – “Practica dezvoltarii in limbaje de asamblare”, Editura Economica, 2004. • Gheorghe MUSCA – “Programare în limbaj de Asamblare”, Editura Teora, Bucureti 1997.

SecŃiunea II – Viruşi • Mark LUDWIG – The Giant Black Book of Computer Viruses, Editura American Eagle Publications, 1995. • Mark LUDWIG - The Little Black Book of Computer Viruses, Editura American Eagle Publications, 1994.

SecŃiunea III – Anti-Virus • Mark LUDWIG – The Giant Black Book of Computer Viruses, Editura American Eagle Publications, 1995.

I.1 INTRODUCERE IN STRUCTURA UNUI PROGRAM ASSEMBLER - EXEMPLU #include void main() { char a = 7, b = 9; short int c; c = a+b; }

RAM

MicroProcessor

BUS

Paşi în dezvoltare unui program ASM 8086 1. Editare D:\CursV\P1ASM\P1.asm 2. Compilare: D:\CursV\ P1ASM \TASM\TASM.exe P1.asm 3. Link-editare: D:\Temp\ CursV\ P1ASM\TASM\TLINK.exe Ex1.obj D:\Temp\ CursV\ P1ASM \TASM\TLINK.exe /Tdc Ex1.obj 4. Depanare: D:\Temp\ CursV\ P1ASM\TASM\TD.exe Ex1.exe D:\Temp\ CursV\ P1ASM\TASM\TD.exe Ex1.com

.model small .stack 16 .data a db 7 b db 9 c dw ? .code start: mov AX, @data mov DS, AX mov AL,a add AL,b mov c,AX mov AX, 4C00h int 21h end start

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE

a)

Întregi   

Fără semn Cu semn BCD (Binary Code Decimal)  

b)

Reale  

c)

Împachetat Despachetat

Virgula fixă Virgula mobilă

Alfanumerice

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE a)NUMERE ÎNTREGI -

-

Făra semn ZECIMAL

HEXA

BINAR

32

20h

0010 0000

ZECIMAL

HEXA

BINAR

-32

FFE0h

1110 0000

ZECIMAL

HEXA

BINAR

32

32h

0011 0010

Cu semn

BCD (Binary Code Decimal) -

-

Împachetat

Despachetat ZECIMAL

HEXA

BINAR

32

0302h

0000 0011 0000 0010

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE b)NUMERE REALE -

parte întreagă parte zecimală

Forma binara

-1.11101*2101 semn

-

exponent

Forma generala (-1)S*M*2(E-Bias)

S – Bit de semn; are valoarea 0 pentru pozitiv si 1 pentru negativ; M – Mantisa; este normalizata; are valori cuprinse in intervalul [1.00…0 , 1.11…1]; primele 2 formate nu mai reprezinta intern primul bit egal cu 1 E – Exponent; reprezinta forma binara a exponentului; utilizat pentru a reface forma zecimala a numarului; Bias – permite reprezentarea valorilor negative ale exponentului; faciliteaza comparatia intre numere reale.

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE b)NUMERE REALE (continuare) -

Simpla precizie 31

Bias = 127

-

semn

63 semn

79

semn

23

22

exponent

0 parte zecimală

Dubla precizie Bias = 1023

-

30

62

52

exponent

51

32

parte zecimală

31

0 parte zecimală

Precizie extinsa 78

64

exponent Bias = 16383

63

întreg

62

32

parte zecimală

31

0

parte zecimală

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE b)NUMERE REALE (continuare-exemplu) formă binară

-134,25

10000110,01

formă zecimală formă binară normalizată

1.000011001 x 27 7 + 127 = 134

bit semn = 1

exponent = 10000110

mantisă = 000011001

S 1

EXPONENT 1

0

0

0

0

1

MANTISA 1

0

0

0

0

0

1

1

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE c)CARACTERE ALFA-NUMERICE -

ASCII cod ASCII

6

6 + 30h = 36h

cifra

cod ASCII caracter ’0’ 0

0

1

1

0

1

1

formă binară

0

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE a) b) c) d) e)

Byte (1 octet) - DB Word (2 octeti) - DW Double-Word (4 octeti) - DD Quad-Word (8 octeti) - DQ Ten-Bytes (10 octeti) - DT

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE a)BYTE -

Spatiu ocupat: 1 octet

-

Definire: a DB 10 Interpretare:

-

a DB 10

7

6

5

4

3

2

1

0

0

0

0

0

1

0

1

0

8 biŃi

Intreg pe 8 biti cu sau fara semn Caracter ASCII

b)WORD

a DW 1234h

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

0

0

1

1

0

1

0

0

0

0

0

1

0

0

1

0

1000h

1001h

adrese

-

Spatiu ocupat: 2 octeti

-

Definire: a DW 1234h Interpretare:

-

16 biŃi * partea cea mai putin semnificativa este stocata la adrese mari

Intreg pe 16 biti cu sau fara semn Secventa de 2 caractere ASCII Adresa de memorie pe 16 biti

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE c)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

A DD 12 34 56 78 h 32↔29

28↔25

24↔21

20↔17

16↔13

12↔9

8↔5

4↔0

7

8

5

6

3

4

1

2

1000h adrese

1001h

1002h

1003h

32 biŃi * partea cea mai puŃin semnificativa este stocata la adrese mari

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE d)QUAD-WORD -

Spatiu ocupat: 8 octeti

-

Definire: a DQ 123456789123 Interpretare:

Intreg pe 64 biti cu sau fara semn Numar real dubla precizie

-

a DW 123456789123 64? 61

60? 57

56? 53

52? 49

48? 45



20? 17

16? 13

12? 9

8? 5

4? 0

8

3

1

A

9

9 B E 1 C 0

0

0

0

0

0

1000h

1001h adrese

1002h

1003h

1004h

1005h

1006h

1007h

64 biŃi

In hexa a are valoarea 1C BE991A 83 h * partea cea mai putin semnificativa este stocata la adrese mari

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE e)TEN-BYTES -

Spatiu ocupat: 10 octeti

-

Definire: a DT 1547.213 Interpretare:

-

Intreg pe 80 biti cu sau fara semn Numar real precizie extinsa Valoare din registrul coprocesorului (ST)

I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE

7

6

5

4

3

2

1

0

1

0

0

1

0

1

0

0

27

26

25

24

23

22

21

20

9h

4h

Pentru octetul 10010100 o aplicaŃie îl poate interpreta ca: - Număr zecimal pozitiv: 148 - Număr zecimal negativ: -108 - BCD împachetat: 94h - Codul ASCII: 64h – ‘A’

I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL Procesor 8088 - 80286 15

8

7

0

AX:

AH

AL

BX:

BH

BL

CX:

CH

CL

DX:

DH

DL

15

0

RAM

CS DS

DATE

SS

Mod de adresare real

ES

BP SP SI

COD STIVA

DI

15

0 Flag IP

Mod de adresare protejat implementat de la 80386 15

14

N

13

12

IOP

80286-80486

11

10

9

8

7

6

O

D

I

T

S

Z

5

4

A

TOATE PROCESOARELE

3

2

P

1

0

C

I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL

MEMORIE

SEGMENTE cu dimensiune = 64KB

… ADRESE 20 biti

MICROPROCESOR 8086

OFFSET

0000

SEGMENT



0FFFFh

Spaţţiu de 64 KB



1 MByte



Microprocesorul 8086 are regiştrii pe 16 biŃi > poate codifica adrese în domeniul 0000h : 0FFFFh ->poate gestiona zone de memorie de maxim 64 KB

I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL Pentru adresarea unui octet de memorie sunt necesare 2 informaŃii pe 16 biŃi:  adresa segmentului, conŃinuta intr-un registru de segment;  deplasamentul in cadrul segmentului, offset.

SEGMENT :OFFSET 16 biti

16 biti 0000h

… 64KB

0000h

0FFFFh



0000h

… …

0001h



05B27h

64KB 18A3h



0FFFFh

… …

64KB



0FFFFh

I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL Formarea adresei fizice pe 20 biti se realizeaza automat prin hardware de catre o componenta a procesorului:

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

0

0

0

1

1

0

0

0

1

0

1

0

0

0

1

1

1h

8h

Ah

3h

← 4 biti 19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

0

0

0

1

1

0

0

0

1

0

1

0

0

0

1

1

0

0

0

0

1h

8h

Ah

3h

0h

+ SEGMENT : OFFSET

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

0

1

0

1

1

0

1

1

0

0

1

0

0

1

1

1

5h

ADRESA FIZICA

Bh

2h

7h

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

0

0

0

1

1

1

1

0

0

1

0

1

0

1

0

1

0

1

1

1

1h

Eh

5h

5h

7h

I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL

REGISTRE DE BAZĂ AX Accumulator Register Calcule şi operaŃii de intrare/ieşire BX Base Register

Utilizat ca index

CX

Utilizat in instrucŃiunile de ciclare

Count Register

DX Data Register

OperaŃii de intrare/ieşire, înmulŃire/împărŃire.

REGISTRE INDEX SI

Source Index

Utilizat in operaŃiile cu şiruri pentru a parcurge sursa.

DI

Destination Index

Utilizat in operaŃiile cu şiruri pentru a parcurge sursa.

I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL REGISTRE DE SEGMENT CS

Code Segment

Număr pe 16-biŃi ce reprezintă adresa segmentului de cod activ.

DS

Data Segment

Număr pe 16-biŃi ce reprezintă adresa segmentului de date activ.

SS

Stack Segment

Număr pe 16-biŃi ce reprezintă adresa segmentului de stivă activ.

ES

Extra Segment

Număr pe 16-biŃi ce reprezintă adresa segmentului suplimentar activ.

REGISTRE INDEX IP

Instruction Pointer

Număr pe 16-biŃi ce reprezintă offeset-ul instrucŃiunii următoare de executat în cadrul segmentului de cod.

SP

Stack Pointer

Număr pe 16-biŃi ce reprezintă offeset-ul din cadrul stivei.

BP

Base Pointer

Utilizat pentru a transfera în/din stivă date.

I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL Un registru pe 16 biŃi numit registru FLAG este utilizat pentru a controla execuŃia instrucŃiunilor. Flag-urile reprezintă biŃi 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

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI

Categorii de instructiuni: a) De transfer b) Aritmetico-logice c) De deplasare si rotatie d) De salt neconditionat si conditionat e) Sir de caractere Tipuri de adresare: a) Imediata b) Directa c) Indirecta d) Bazat sau indexata e) Bazat si indexata

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI a)INSTRUCTIUNI DE TRANSFER MOV destinaŃie, sursa •copiază valoarea de la sursă la destinaŃie •sursa si destinaŃia nu sunt •ambele operanzi in memorie •registrul de flag sau registrul IP •de dimensiuni diferite •registrul CS nu poate apărea în destinaŃie

PUSH sursa •copiază valoarea pe stivă •sursa are valoare pe 16 biŃi

POP destinaŃie •extrage valoarea de pe stivă şi o salvează în destinaŃie •destinaŃia are valoare pe 16 biŃi

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI EXEMPLU: MOV AX, 1234h MOV BX, 5678h MOV CX, 9ABCh PUSH AX PUSH BX PUSH CX POP CX POP AX POP BX

Procesor 8088 - 80286

15

(I) (II) (III) (IV) (V) (VI)

0

AX

1234h

BX

5678h

CX

9ABCh

SS:1282

SS:1284

SS:1286

SS:1288

-

-

-

-

valoare adrese

DATE

DS:0000

valoare adrese

STIVĂ

SS :SP

valoare adrese

COD

CS :IP

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI EXEMPLU: MOV AX, 1234h MOV BX, 5678h MOV CX, 9ABCh PUSH AX PUSH BX PUSH CX POP CX POP AX POP BX

Procesor 8088 - 80286

15

(I) (II) (III) (IV) (V) (VI)

0

AX

1234h

BX

5678h

CX

9ABCh

SS:1282

SS:1284

SS:1286

SS:1288

-

-

3412h

-

valoare adrese

DATE

DS:0000

valoare adrese

STIVĂ

SS :SP

valoare adrese

COD

CS :IP

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI EXEMPLU: MOV AX, 1234h MOV BX, 5678h MOV CX, 9ABCh PUSH AX PUSH BX PUSH CX POP CX POP AX POP BX

Procesor 8088 - 80286

15

(I) (II) (III) (IV) (V) (VI)

0

AX

1234h

BX

5678h

CX

9ABCh

SS:1282

SS:1284

SS:1286

SS:1288

BC9Ah

7856h

1234h

-

valoare adrese

DATE

DS:0000

valoare adrese

STIVĂ

SS :SP

valoare adrese

COD

CS :IP

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI EXEMPLU: MOV AX, 1234h MOV BX, 5678h MOV CX, 9ABCh PUSH AX PUSH BX PUSH CX POP CX POP AX POP BX

Procesor 8088 - 80286

15

(I) (II) (III) (IV) (V) (VI)

0

AX

1234h

BX

5678h

CX

9ABCh

SS:1282

SS:1284

SS:1286

SS:1288

-

7856h

3412h

-

valoare adrese

DATE

DS:0000

valoare adrese

STIVĂ

SS :SP

valoare adrese

COD

CS :IP

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI EXEMPLU: MOV AX, 1234h MOV BX, 5678h MOV CX, 9ABCh PUSH AX PUSH BX PUSH CX POP CX POP AX POP BX

Procesor 8088 - 80286

15

(I) (II) (III) (IV) (V) (VI)

0

AX

5678h

BX

5678h

CX

9ABCh

SS:1282

SS:1284

SS:1286

SS:1288

-

-

3412h

-

valoare adrese

DATE

DS:0000

valoare adrese

STIVĂ

SS :SP

valoare adrese

COD

CS :IP

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI EXEMPLU: MOV AX, 1234h MOV BX, 5678h MOV CX, 9ABCh PUSH AX PUSH BX PUSH CX POP CX POP AX POP BX

Procesor 8088 - 80286

15

(I) (II) (III) (IV) (V) (VI)

0

AX

5678h

BX

1234h

CX

9ABCh

SS:1282

SS:1284

SS:1286

SS:1288

-

-

-

-

valoare adrese

DATE

DS:0000

valoare adrese

STIVĂ

SS :SP

valoare adrese

COD

CS :IP

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI a)INSTRUCTIUNI DE TRANSFER XCHG destinaŃie, sursa •interschimbă valorile; •sursa si destinatia nu sunt registre de segment; •cel putin unul dintre operanzi trebuie sa fie registru;

IN registru acumulator, sursa •transferă un byte sau un word de la un port la registrul acumulator (AX, AL sau AH); •sursa este DX sau o constantă pe 8 biŃi (pentru porturi mai mici de 255);

OUT destinaŃie, registru acumulator •transferă un byte sau un word de la registrul acumulator (AX, AL sau AH) la un port; •portul destinaŃie este indicat de DX sau o constantă pe 8 biŃi (pentru porturi mai mici de 255);

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI a)INSTRUCTIUNI DE TRANSFER LEA destinaŃie, sursa •transferă offset-ul sursei în destinaŃie; •destinaŃia trebuie sa fie registru; •este echivalenta cu instrucŃiunea: MOV destinaŃie, offset sursa;

LDS/LES destinaŃie, sursa •transferă offset-ul sursei în destinaŃie; adresa segmentului este salvată în registrul segment asociat (DS pentru LDS, ES pentru LES) •destinaŃia trebuie sa fie registru;

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI a)INSTRUCTIUNI DE TRANSFER LAHF •transfera valoarea flag-urilor de la 0 la 7 in AH;

SAHF •transfera valoarea registrului AH in registrul de flag-uri peste bitii de la 0 la 7;

PUSHF •transfera valoarea registrului de flag-uri pe stiva;

POPF •transfera valoarea din varful stivei in registrului de flag-uri;

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI a)ADRESARE IMEDIATĂ Registrele sunt iniŃializate cu valori constante MOV AX,1

;copiază în AX valoarea 1

b)ADRESARE DIRECTĂ Numele variabilei este utilizat ca operand în instrucŃiune. VB dw 10 … MOV AX,vb

;copiază în AX valoarea variabilei vb ;la asamblare vb este inlocuit de deplasament

Valoarea offset-ului este utilizată pentru a citi date direct din segmentul de date. .data VB dw 10 .code … MOV AX,DS:[0000] ;copiază în AX valoarea 10

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI c)ADRESARE INDIRECTA Utilizare registru baza sau index pentru a retine adresa zonei de date .data VB dw 10 .code … MOV SI,offset VB ;initializez SI cu adresa lui vb MOV AX,[SI] ;copiază în AX valoarea variabilei vb sau … MOV BX,offset VB ;initializez BX cu adresa lui vb MOV AX,[BX] ;copiază în AX valoarea variabilei vb

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI d)ADRESARE BAZATA sau INDEXATA Utilizare registru baza sau index si a unui deplasament pentru a accesa zone de memorie aflate la o anumita distanta fata de un reper .data vector dw 10,11,12 .code … MOV SI,offset vector ;initializez SI cu adresa vectorului MOV AX,[SI+2] ;copiază în AX valoarea 11 sau … MOV BX,4 MOV AX,val[BX]

;initializez BX cu valoarea 4 ;copiază în AX valoarea 12

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI e)ADRESARE BAZATA si INDEXATA Utilizare registru baza si index pentru a accesa zone de memorie aflate la o anumita distanta fata de un reper .data vector dw 10,11,12,13,14 .code … MOV BX,offset vector MOV SI, 2 MOV AX,[BX][SI]

;initializez BX cu adresa vectorului ;initializez SI cu valoarea 2 ;copiază în AX valoarea 11

MOV SI,4 MOV BX,offset vector MOV AX,[BX][SI][2]

;initializez SI cu valoarea 4 ;initializez BX cu adresa vectorului ;copiază în AX valoarea 13

sau …

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI b)INSTRUCTIUNI ARITMETICO-LOGICE Instructiunile aritmetice modifica registrul de flag •CF = 1 daca e transport/imprumut din/in bitul cel mai semnificativ (bit 7 pentru BYTE sau 15 pentru WORD) al rezultatului; •AF =1 daca e transport/imprumut din/in bitul 4 al rezultatului (valabil pentru BCD); •ZF = 1 daca rezultatul operatiei este nul; •SF = 1 daca bitul de semn (bit 7 pentru BYTE sau 15 pentru WORD) este 1; •PF = 1 daca suma modulo 2 a celor 8 biti mai putini semnificativi ai rezultatului este 0; •OF = 1 daca rezultatul operatiei este prea mare sau prea mic pentru a fi stocat in destinatie; Daca suma dintre 2 operanzi cu semn de tip BYTE depaseste 127 sau este mai mica decat -127 procesorul seteaza OF. Daca suma depaseste 255 procesorul seteaza CF.

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI b)INSTRUCTIUNI ARITMETICO-LOGICE

.data Vb DB 39 .code … MOV AL,26

AL = 26

AL = 26

INC AL

AL = 27

AL = 27

ADD AL,76

AL = 103

AL = 103

ADD AL, vb

AL = -114 si OF=1

AL = 142

REZULTAT Interpretare cu semn Interpretare fără semn

MOV AH,AL

AH = 142

ADD AL,AH

AL = 28 şi CF=1

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI b)INSTRUCTIUNI ARITMETICO-LOGICE

.data Vb DB 122 .code … MOV AL,95

REZULTAT Interpretare cu semn Interpretare fără semn AL = 95

AL = 95

DEC AL

AL = 94

AL = 94

SUB AL,23

AL = 71

AL = 71

SUB AL, vb

AL = -51

AL = 205 si SF=1

MOV AH,119

AH = 119

SUB AL,AH

AL = 86 si OF = 1

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI b)INSTRUCTIUNI ARITMETICO-LOGICE ADD destinaŃie, sursă •adună la operandul destinaŃie valoarea operandului sursă; •adunarea se realizează pe 16 biŃi; •operanzii sunt considerati fara semn; •permite multiple combinaŃii de tipuri ale sursei şi destinaŃiei (registru, valoare imediată, locaŃie de memorie) însă exclude situaŃiile: •destinaŃia nu poate fi segmentul CS; •destinaŃia şi sursa nu pot fi în acelaşi timp operanzi din memorie (variabile definite în segmentul de date); •dacă sursa este o valoare imediată (constantă valorică), destinaŃia nu poate fi unul dintre registrele de segment (CS, DS, ES, SS); •destinaŃia nu poate fi un operand imediat (constantă valorică); •daca rezultatul sumei este mai mare decat capacitatea destinatiei atunci este setat CF; valoarea acestuia este preluata prin utilizarea instructiunii ADC (Add with carry).

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI b)INSTRUCTIUNI ARITMETICO-LOGICE SUB destinaŃie, sursă •scade din operandul destinaŃie valoarea operandului sursă; •adunarea se realizează pe 16 biŃi; •operanzii sunt considerati fara semn; •permite multiple combinaŃii de tipuri ale sursei şi destinaŃiei (registru, valoare imediată, locaŃie de memorie) însă exclude situaŃiile: •destinaŃia nu poate fi segmentul CS; •destinaŃia şi sursa nu pot fi în acelaşi timp operanzi din memorie (variabile definite în segmentul de date); •dacă sursa este o valoare imediată (constantă valorică), destinaŃia nu poate fi unul dintre registrele de segment (CS, DS, ES, SS); •destinaŃia nu poate fi un operand imediat (constantă valorică); •daca rezultatul sumei este mai mare decat capacitatea destinatiei atunci este setat CF; valoarea acestuia este preluata prin utilizarea instructiunii SBC (Substract with carry).

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI b)INSTRUCTIUNI ARITMETICO-LOGICE MUL operand

•multiplică o valoare unsigned din AL (când operandul este de tip byte) sau din AX (când operandul este de tip word) cu valoarea operandului specificat; •rezultatul este returnat în AX când operandul este de tip byte şi în DX:AX (cei 2 octeŃi superiori în DX) când acesta este de tip word; •registru FLAG modificat: OF şi CF sunt setaŃi dacă partea superioară a rezultatului (DX dacă operandul este de tip word, sau AH este de tip byte) este diferită de 0;alte flag-uri SF, ZF, AF, PF; •operandul poate fi alt registru sau o variabilă; •dacă valoarea înmulŃită are semn atunci se utilizează IMUL;

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI b)INSTRUCTIUNI ARITMETICO-LOGICE DIV impartitor •realizeaza impartire cu rest valoarea de la sursă la destinaŃie; •impartitorul poate fi alt registru sau o variabilă; •operanzii sunt considerati fara semn •pentru a realiza impartire cu operanzi cu semn se utilizeaza IDIV Tip operanzi Deîmpartit Impartitor

Cât

Rest

16 biŃi

AX

8 biŃi

AL

AH

32 biŃi

DX:AX

16 biŃi

AX

DX

CBW CWD

I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI b)INSTRUCTIUNI ARITMETICO-LOGICE NEG operand •utilizat pentru a nega operandul, scăzând-ul din valoarea 0; •operandul trebuie să fie registru sau variabilă;

I.5 CODIFICAREA INSTRUCTIUNILOR codul unei instrucŃiuni are minim 1 octet si maxim 6 octeŃi

1 sau 2 bytes

0, 1 sau 2 bytes octet inferior

cod instrucŃiune

d

w

mod

reg

cod

r/m

octet superior

deplasament sau adresă directă

0, 1 sau 2 bytes octet inferior

octet superior

date imediate

are valoare predefinită

d

direction bit

pt. d = 1 sensul operaŃiei este memorie → registru (identificat de reg) pt. d = 0 sensul operaŃiei este registru → memorie sau registru → registru (sursa este indicata de reg)

w

word/byte bit

pt. w = 1 operanzii sunt de tip word pt. w = 0 operanzii sunt de tip byte

mod

mode

codifică modul de adresare

reg

register

identifică registrul utilizat în instrucŃiune

r/m

register/memory

identifică al doilea operand de tip registru sau un registru care participă la formarea adresei efective

I.5 CODIFICAREA INSTRUCTIUNILOR codul unei instrucŃiuni are minim 1 octet si maxim 6 octeŃi

1 sau 2 bytes

0, 1 sau 2 bytes octet inferior

cod instrucŃiune

d

w

mod

reg

r/m

0, 1 sau 2 bytes

octet superior

octet inferior

deplasament sau adresă directă

reg

w =1

w=0

000

AX

AL

001

CX

CL

r/m

010

DX

DL

000

DS:[BX+SI]

DS:[BX+SI+deplas8]

011

BX

BL

001

DS:[BX+DI]

100

SP

AH

010

101

BP

CH

110

SI

DH

111

DI

BH

octet superior

date imediate

mod 00

01

10

11* w =1

w=0

DS:[BX+SI+deplas16]

AX

AL

DS:[BX+DI+deplas8]

DS:[BX+DI+deplas16]

CX

CL

SS:[BP+SI]

SS:[BP+SI+deplas8]

SS:[BP+SI+deplas16]

DX

DL

011

SS:[BP+DI]

SS:[BP+DI+deplas8]

SS:[BP+DI+deplas16]

BX

BL

100

DS:[SI]

DS:[SI+deplas8]

DS:[SI+deplas16]

SP

AH

101

DS:[DI]

DS:[DI+deplas8]

DS:[DI+deplas16]

BP

CH

110

SS:[BP]

SS:[BP+deplas8]

SS:[BP+deplas16]

SI

DH

111

DS:[BX]

DS:[BX+deplas8]

DS:[BX+deplas16]

DI

BH

*pentru mod = 11, instrucŃiunea are doi operanzi de tip registru, iar r/m specifică registrul sursă.

I.6 CATEGORII de INSTRUCłIUNI c)INSTRUCTIUNI de ROTATIE •SHL/SAL – Shift Left/Shift Arithmetic Left 7

CF

•SHR – Shift Right

0















7



←0

0→



0 →













CF

•SAR – Shift Arithmetic Right 7 →

7 ←













0

7





•RCL – Rotate through Carry Left 7

CF





















CF

•ROR – Rotate Right

•ROL – Rotate Left CF

0









0 →













CF

•RCR – Rotate through Carry Right

0

7





0 →













CF

I.7 STRUCTURI DE CONTROL a)InstrucŃiunea CMP – – –

Compara doua valori prin intermediul unei scăderi virtuale; Operanzii nu isi modifica valorile; Flag-urile (din registrul de flag-uri) sunt setaŃi pentru a reflecta rezultatul operaŃiei de scădere.

BiŃi de flag afectaŃi: – OF (overflow) – SF (sign) – ZF (zero) – PF (parity) – CF (carry)

Tipul – – – –

operanzilor register / register register / memory register / immediate memory / register

I.7 STRUCTURI DE CONTROL Exemple instrucŃiunea CMP AX = 10, BX = -12

Stare flag-uri:

• CMP AX, BX – AX – BX = +22

• SF=0, CF=1, OF=0, ZF=0

• CMP BX, AX – BX – AX = -22

• SF=1, CF=0, OF=0, ZF=0

• CMP AX, AX – AX – AX = 0

• SF=0, CF=0, OF=0, ZF=1

I.7 STRUCTURI DE CONTROL b)Salturi condiŃionate OperaŃie

Ambii operanzi sunt consideraŃi fără semn

Unul dintre operanzi este cu semn

ori !=

JNE or JNZ

JNE ori JNZ

= ori ==

JE or JZ

JE ori JZ

>=

JNB

JNL

>

JNBE ori JA

JNLE ori JG

< expresie 2 > }

ASSEMBLER cmp op1, op2 jne false false:

I.7 STRUCTURI DE CONTROL Structura de control IF-THEN-ELSE LIMBAJ EVOLUAT if (op1 > op2) { < expresie 1 < expresie 2 } else { < expresie 3 < expresie 4 }

> >

> >

ASSEMBLER cmp op1, op2 jle else < expresie 1 > < expresie 2 > jmp done else: < expresie 3 > < expresie 4 > done:

I.7 STRUCTURI DE CONTROL Structura de control REPEAT LIMBAJ EVOLUAT for(initializare;op1< op2; iteratie) { }

ASSEMBLER repeat: cmp op1,op2 jae final jmp repeat final:

I.7 STRUCTURI DE CONTROL Structura de control DO-WHILE LIMBAJ EVOLUAT do { } while (op1 != op2)

ASSEMBLER do: cmp op1,op2 jnz do

I.7 STRUCTURI DE CONTROL Structura de control DO-WHILE particulara LIMBAJ EVOLUAT i=n; do { i=i-1; } while (i>=0)

ASSEMBLER mov cx,n repeat: loop repeat Loop trebuie să specifice un short jump (între -127 şi +127 bytes de la poziŃia curentă)

I.7 STRUCTURI DE CONTROL Structura de control CASE (SWITCH) LIMBAJ EVOLUAT switch (valoare) { case constanta1: break; case constanta2: break; … default:

ASSEMBLER cmp valoare,constanta1 je case1 cmp valoare,constanta2 je case2 … jmp default case1: jmp final case2: Jmp final … default: final:

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

0

AX BX CX DX BP

0000 B8 0000s 0003 8E D8

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

SI DI IP DS

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

SP

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15 AX

CX DX

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

BP

0000h

SP

0010h

SI DI IP

0003h

DS

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

DF32h

BX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15 AX

CX DX

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

BP

0000h

SP

0010h

SI DI IP

0005h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

DF32h

BX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15 AX

CX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

BP

0000h

SP

0010h

SI DI IP

0007h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012 0014 0015 0016

0h

DX

mov AX,@data mov DS,AX

0012

DF32h

BX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15 AX

CX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

BP

0000h

SP

0010h

SI DI IP

000Bh

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012 0014 0015 0016

0004h

DX

mov AX,@data mov DS,AX

0012

DF32h

BX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

DF32h

BX

0002h

CX

0004h

BP

0000h

SP

0010h

SI DI IP

000Eh

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0h

BX

0002h

CX

0004h

BP

0000h

SP

0010h

SI DI IP

0010h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0h

BX

0002h

CX

0004h

BP

0000h

SP

0010h

SI

0h

DI IP

0012h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0017h

BX

0002h

CX

0004h

BP

0000h

SP

0010h

SI

0h

DI IP

0014h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0017h

BX

0002h

CX

0004h

BP

0000h

SP

0010h

SI

0001h

DI IP

0015h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0017h

BX

0002h

CX

0004h

BP

0000h

SP

0010h

SI

0002h

DI IP

0016h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0017h

BX

0002h

CX

0003h

BP

0000h

SP

0010h

SI

0002h

DI IP

0012h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0027h

BX

0002h

CX

0003h

BP

0000h

SP

0010h

SI

0002h

DI IP

0012h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0027h

BX

0002h

CX

0002h

BP

0000h

SP

0010h

SI

0004h

DI IP

0012h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

004Ah

BX

0002h

CX

0002h

BP

0000h

SP

0010h

SI

0004h

DI IP

0014h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

004Ah

BX

0002h

CX

0001h

BP

0000h

SP

0010h

SI

0006h

DI IP

0012h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0056h

BX

0002h

CX

0001h

BP

0000h

SP

0010h

SI

0006h

DI IP

0014h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0056h

BX

0002h

CX

0000h

BP

0000h

SP

0010h

SI

0008h

DI IP

0018h

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

0056h

BX

0002h

CX

0000h

BP

0000h

SP

0010h

SI

0008h

DI IP

001Bh

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

56h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

Procesor 8088 - 80286

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code START:

15

mov AX,@data mov DS,AX

0005 0007 000B 000E 0010

xor CX,CX mov CX, n mov BX, offset vector xor AX,AX xor SI,SI

0012 0014 0015 0016

4C00h

BX

0002h

CX

0000h

BP

0000h

SP

0010h

SI

0008h

DI IP

001Eh

DS

DF32h

REPETA: 03 00 46 46 E2 FA

0018 A3 000Ar 001B B8 4C00 001E CD 21

end START

add AX, [BX][SI] inc SI inc SI loop REPETA mov suma, AX mov ax, 4C00h int 21h

Zona de date

0012

AX

DX

0000 B8 0000s 0003 8E D8 33 C9 8B 0E 0000r BB 0002r 33 C0 33 F6

0

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

56h

00h

00h

00h

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

DUMINICA

I.8 PROCEDURI START: mov AX,@data mov DS,AX

START: mov AX,@data mov DS,AX

InstrucŃiuni

InstrucŃiuni CALL rutina

secvenŃă de cod - SC InstrucŃiuni InstrucŃiuni

secvenŃă de cod - SC

InstrucŃiuni

SEGMENT DE COD

Secvente de cod identice

CALL rutina

Apel procedura

InstrucŃiuni CALL rutina

InstrucŃiuni

secvenŃă de cod - SC

InstrucŃiuni

mov AX,4C00h int 21h end START PROC rutina secvenŃă de cod-SC END PROC

mov AX,4C00h int 21h end START

IMPLEMENTARE PROCEDURI

I.8 PROCEDURI SINTAXA DECLARĂRII UNEI PROCEDURI: Nume_procedură PROC [FAR | NEAR] .............. [Nume_procedura] ENDP

Nume_procedură PROC [FAR | NEAR] Salvare registre

Structura generală a unei proceduri scrisă în limbaje de asamblare este:

Bloc prelucrare date cu referirea parametrilor formalii Stocare rezultate Restaurarea registre RET [nr_octeŃi] [Nume_procedură] ENDP

I.8 PROCEDURI START: mov AX,@data mov DS,AX

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

SEGMENT DE COD

InstrucŃiuni

ZONA DE STIVA DE 10 OCTETI

CALL rutina

APEL PROCEDURA DE TIP NEAR

PUSH IP JMP rutina

InstrucŃiuni

salvare adresa instrucŃiunii următoare lui CALL

reprezintă un offset pe 16 biti

mov AX,4C00h int 21h end START PROC rutina push BP mov BP,SP … pop BP ret End PROC

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

IP

-

ZONA DE STIVA DE 10 OCTETI

I.8 PROCEDURI SEGMENT DE COD

START: mov AX,@data mov DS,AX

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

InstrucŃiuni ZONA DE STIVA DE 10 OCTETI CALL rutina salvare adresa segment de cod curent

APEL PROCEDURA DE TIP FAR InstrucŃiuni

PUSH CS PUSH IP JMP rutina

mov AX,4C00h int 21h end START

salvare adresa instrucŃiunii următoare lui CALL reprezintă o adresa de tip segment:offset pe 20 biti

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

IP

CS

-

SEGMENT DE COD

ZONA DE STIVA DE 10 OCTETI PROC rutina push BP mov BP,SP … pop BP ret End PROC

I.8 PROCEDURI TIP OPERAND

DESCRIERE

CALL nume_procedură

Numele procedurii apelate reprezintă în esenŃă o etichetă.

CALL etichetă

Procesorul presupune în această situaŃi că eticheta este locală şi atunci face un salt de tip NEAR. Aceasta trebuie să fie la o distanŃă cuprinsă în intervalul [-32768,32676] de bytes.

CALL FAR PTR eticheta

Eticheta este în alt segment. Înlocuieşte CS şi IP cu segmentul şi offsetul etichetei.

CALL registru sau variabilă

ConŃinutul din registru sau variabilă este copiat în IP după ce acesta a fost salvat pe stivă. Deci variabila sau registrul respectiv reprezintă un pointer near (Ńine doar offsetul unei proceduri sau etichete)

CALL [WORD|DOUBLE] PTR variabilă

ConŃinutul variabilei reprezintă un offset şi are loc un salt de tip NEAR. De obicei variabila este reprezentată de o adresare indirectă cu registru index (SI,DI), [SI] sau registru de bază (BX). [BX] şi trebuie specificat câti bytes trebuie citiŃi (trebuie indicat procesorului tipul de salt – near, se citesc 2 octeŃi; far se citesc 4 octeŃi).

CALL DWORD PTR adresă

ConŃinutul variabilei reprezintă un segment + offset şi are loc un salt de tip FAR. De obicei variabila este reprezentată de o adresare indirectă cu registru index (SI,DI), [SI] sau registru de bază (BX). [BX].

I.8 PROCEDURI Transmiterea parametrilor de intrare/ieşire în proceduri •VARIABILE DECLARATE ÎN MEMORIE în segmentul de date; •REGISTRELE •STIVA pe post de zonă de transfer a datelor către proceduri;

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX BX CX DX BP SP SI DI IP

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 0002

BX CX DX BP

0000

SP

0010

SI DI IP

0006

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 0002

BX CX DX BP

0000

SP

000E

SI DI IP

0009

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 0004

BX CX DX BP

0000

SP

000E

SI DI IP

000C

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

SS:000E

SS:0010

-

-

-

-

-

-

-

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 0004

BX CX DX BP

0000

SP

000C

SI DI IP

000D

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

-

-

-

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 000A

BX CX DX BP

0000

SP

000C

SI DI IP

0010

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

-

-

-

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 000A

BX CX DX BP

0000

SP

000A

SI DI IP

0011

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

-

-

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 000A

BX CX DX BP

0000

SP

0008

SI DI IP

0019

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

-

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 000A

BX CX DX BP

0000

SP

0006

SI DI IP

001A

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 000A

BX CX DX BP

0006

SP

0006

SI DI IP

001C

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 000A

BX CX

0000

DX BP

0006

SP

0006

SI DI IP

001E

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15 AX

0 000A

BX CX

0004

DX BP

0006

SP

0006

SI DI IP

0021

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

000A

BX

0002

CX

0004

DX BP

0006

SP

0006

SI DI IP

0024

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0000

BX

0002

CX

0004

DX BP

0006

SP

0006

SI DI IP

0026

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0000

BX

0002

CX

0004

DX BP

0006

SP

0006

SI

0000

DI IP

0028

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0017

BX

0002

CX

0004

DX BP

0006

SP

0006

SI

0000

DI IP

002A

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0017

BX

0002

CX

0004

DX BP

0006

SP

0006

SI

0002

DI IP

002C

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0017

BX

0002

CX

0003

DX BP

0006

SP

0006

SI

0002

DI IP

0028

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0027

BX

0002

CX

0003

DX BP

0006

SP

0006

SI

0002

DI IP

002A

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0027

BX

0002

CX

0003

DX BP

0006

SP

0006

SI

0004

DI IP

002C

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0027

BX

0002

CX

0002

DX BP

0006

SP

0006

SI

0004

DI IP

0028

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0056

BX

0002

CX

0000

DX BP

0006

SP

0006

SI

0004

DI IP

002E

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0056

BX

000A

CX

0000

DX BP

0006

SP

0006

SI

0004

DI IP

0031

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

00h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0056

BX

000A

CX

0000

DX BP

0006

SP

0006

SI

0004

DI IP

0033

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

56h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0056

BX

000A

CX

0000

DX BP

0000

SP

0008

SI

0004

DI IP

0034

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

56h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

0000

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

0056

BX

000A

CX

0000

DX BP

0000

SP

0010

SI

0004

DI IP

0014

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

56h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

-

1400

0A00

0400

0200

-

Zona de stiva

.model small .stack 10h .data n dw 4 vector dw 23,16,35,12 suma dw ? .code 0000 START: 0000 mov ax,@data 0003 mov ds,ax 0005 mov AX, offset vector 0008 push AX 0009 mov AX,n 000C push AX 000D mov AX, offset suma 0010 push AX 0011 CALL addv 0014 mov ax, 4C00h 0017 int 21h 0019 addv PROC NEAR 0019 push BP 001A mov BP, SP 001C xor CX,CX 001E mov CX, [BP+6] 0021 mov BX, [BP+8] 0024 xor AX,AX 0026 xor SI,SI 0028 repeta: 0028 add AX, [BX][SI] 002A inc SI 002B inc SI 002C loop repeta 002E mov BX, [BP+4] 0031 mov [BX],AX 0033 pop BP 0034 ret 6 0037 addv ENDP end START

Procesor 8088 - 80286 15

0

AX

4C00

BX

000A

CX

0000

DX BP

0000

SP

0010

SI

0004

DI IP

0017

DS:00

01

02

03

04

05

06

07

08

04h

00h

17h

00h

10h

00h

23h

00h

0Ch

DS:09

0A

0B

0C

0D

00h

56h

00h

00h

00h

Zona de date

0000

0002

0004

0006

0008

000A

000C

000E

SS:0010

-

-

-

-

-

-

-

-

-

Zona de stiva

I.9 MACRODEFINITII a)DEFINIRE SI EXPANDARE SecvenŃa de program scris in limbaj de asamblare care corespunde unei secvenŃe cu caracter repetat. Forma generala este: nume_macro MACRO ;Corp instrucŃiuni ENDM DiferenŃa fata de proceduri => procesul de macroexpandare – la asamblare apelul macrodefinitiei este înlocuit cu secvenŃa de cod din corpul acesteia.

I.9 MACRODEFINITII b)MACRODEFINITII FARA PARAMETRI Salvare registri generali: savereg MACRO push AX push BX push CX push DX push SI push DI ENDM

Restaurare registri generali: restreg MACRO pop DI pop SI pop DX pop CX pop BX pop AX ENDM

Apel si macroexpandare: Procedura1 PROC NEAR savereg … restreg RET Procedura1 ENDP

Procedura1 PROC NEAR push AX push BX … pop BX pop AX RET Procedura1 ENDP

I.9 MACRODEFINITII c)MACRODEFINITII CU PARAMETRI

nume_macro MACRO P1, P2,… P2,…, Pn ;Corp instructiuni ENDM

Evaluarea expresiei: expresiei: e=a+b+c+d

add02 MACRO a, b, s push AX mov AX, a add AX, b mov s, AX pop AX ENDM

add02 a, b, e add02 e, c, e add02 e, d, e

I.9 MACRODEFINITII c)MACRODEFINITII CU PARAMETRI Trebuie acordata atenŃie la modificarea conŃinutului registrului SP care controlează accesul la zona de date a stivei

swap01 MACRO X, Y push AX push BX mov BX, X mov AX, Y mov X, AX mov Y, BX pop BX pop AX ENDM

swap01 AX, SI ; Interschimba AX cu SI ? push AX push BX mov BX, AX mov AX, SI mov AX, AX mov SI, BX pop BX pop AX swap01 SP, DI ; Interschimba SP cu DI ? push AX push BX mov BX, SP mov AX, DI mov SP, AX ; Aici se modifica SP mov DI, BX ; si POPPOP-urile pop BX ; sunt pop AX ; compromise (XCHG rezolvare)

I.9 MACRODEFINITII d)ETICHETE SI VARIABILE LOCALE Etichete locale (la macroexpandare maxim 10000) minim MACRO a, b, c, min local et1, et1, et2 push AX mov AX, AX, a cmp AX, AX, b jlz et1 mov AX, AX, b et1: et1: cmp AX, AX, c jlz et2 mov AX, AX, c et2: et2: mov min, AX pop AX ENDM

Variabile locale mask MACRO X local masca .data masca equ 00001111b .code push AX mov AL, AL, X and AL, AL, masca mov X, AL pop AX ENDM

I.9 MACRODEFINITII

Program principal: … minim x, y, z, min1 minim w, v, u, min2 minim i, j, k, min3 minim min1, min2, min3, min …

MACROEXPANDARE

d)ETICHETE SI VARIABILE LOCALE … push AX mov AX, AX, x cmp AX, AX, y jlz et10000 mov AX, AX, y et10000: et10000: cmp AX, AX, z jlz et20000 mov AX, AX, z et20000: et20000: mov min1, AX pop AX push AX mov AX, AX, w cmp AX, AX, v jlz et10001 mov AX, AX, v et10001: et10001: cmp AX, AX, u jlz et20001 mov AX, AX, u et20001: et20001: mov min2, AX pop AX …

MACROEXPANDARE 1

MACROEXPANDARE 2

I.9 MACRODEFINITII e)MACRODEFINITII REPETITIVE SI OPERATORI SPECIFICI REPT n ;corp macroinstructiuni ENDM

IRP p_formal, ;corp macroinstructiuni ENDM

EXEMPLU

REPT 3 m_mesaj ;macroinstructiune ENDM

m_mesaj m_mesaj m_mesaj

EXEMPLU

IRP x, db x ENDM

db ‘a’ db ‘b’ db ‘c’

I.9 MACRODEFINITII

SoluŃie iniŃiala

f) MACRODEFINITII DERIVATE add04 MACRO a1, a2, a3, a4, s push AX mov AX, AX, a1 add AX, AX, a2 add AX, AX, a3 add AX, AX, a4 mov s, AX pop AX ENDM

DERIVARE add04 MACRO a1, a2, a3, a4, s add02 a1, a2, s add02 s, a3, s add02 s, a4, s ENDM

add02 MACRO a1, a2, sum push AX mov AX, AX, a1 add AX, AX, a2

mov sum, AX pop AX ENDM

add04 MACRO a1, a2, a3, a4, s local t1, t2 .data t1 dw ? t2 dw ? .code add02 a1, a2, t1 add02 a3, a4, t2 add02 t1, t2, s ENDM

I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL a)ÎNTRERUPERI Utilizarea intreruperilor permite: •transferul executiei catre o alta locatie (rutine de intrerupere) •accesul functiilor MS-DOS si a ROM-BIOS-ului din limbajele de asamblare Caracteristici: •se apeleaza cu insructiunea INT urmata de o valore cuprinsa intre 0 si 255; •rutinele de intrerupere MS-DOS si BIOS accepta parametrii prin registre; •majoritatea rutinelor MS-DOS primesc codul functiei in registrul AH

mesaj DB “Exemplu apel intreruperi !”,’$’ .code MOV AX, @data MOV DS,AX MOV DX, offset mesaj MOV AH,09h INT 21h

Afiseaza mesaj la consola

I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL a)ÎNTRERUPERI

OF DF IF = 0 TF = 0

PROCESOR

SF ZF AF

apel intrerupere

PF CF

00000h

FFFFFh

RAM

……

0004

0008

03FC

SEG:OFF

SEG:OFF

SEG:OFF

SEG:OFF

SEG:OFF

INT0

INT1

INT2

INT 21h

INT 255

ROM-BIOS

0084

0000

STIVA

DATE

……

KERNEL-OS

COD INTRERUPEI

FAT

ROM-BIOS DATA

Tabela Vectori întrerupere

0000:0000h

… MOV DX, offset mesaj MOV AH,09h INT 21h …

000A

000C

000E

SS:0010

-

IP

CS

-

I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL a)ÎNTRERUPERI La executia intreruperii procesorul: • cauta adresa rutinei de intrerupere in Tabela Vectorilor de Intrerupere; aceasta se gaseste la baza memoriei (segment 0, offset 0) si contine pointeri de tip far (segment:offset) catre handlerul rutinei de intrerupere; pozitia in vectorul de intreruperi defineste numarul intreruperii (int 21h  0000h:(0021*4)h); • pune 0 in bitii de flag TF (trap flag) si IF (interrupt enable flag); • salveaza registrul indicatorilor de stare (registru de flag – ZF, PF, CF, etc) • salveaza pe stiva CS si IP; • face salt la adresa rutinei de intrerupere; • executa codul rutinei pana gand intalneste IRET; • restaureaza IP, CS • restaureaza registrul indicatorilor de stare (flag – ZF, PF, CF, etc) • seteaza bitii de flag.

I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL b)FIŞIERE Este identificat prin: •nume (şir de caractere), la operaŃiile de deschidere şi creare •handler (valoare pozitivă pe 16 biŃi ce identifică în mod unic fişierul pe disc sau alte dispozitive), la operaŃiile de închidere, citire, scriere, poziŃionare

HANDLER-E ASOCIATE UNOR DISPOZITIVE STANDARD: Valoare

Denu mire

Descriere

0

stdin

Intrare standard

1

stdout

Ieşire standard

2

stderr

Ieşire standard pentru mesaje de eroare

3

stdaux

Dispozitiv auxiliar

4

stdprn

Imprimantă standard

I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL b)FIŞIERE PRINCIPALELE FUNCłII DOS PENTRU LUCRUL CU FIŞIERE SUNT: Cod funcŃie (AH)

OperaŃie

3Ch

Creare fişier

3Dh

Deschidere fişier

3Eh

Închidere fişier

3Fh

Citire din fişier

40h

Scriere în fişier

41h

Ştergere în fişier

42h

PoziŃionare în fişier

- handler

56h

Redenumire fişier

- rezultat operaŃie

Parametrii intrare:

Registru corespondent

- cod funcŃie

3Ch → AH

- nume fişier

DX

- atribut fişier

CX

Parametrii returnaŃi:

La momentul creării, tipul fişierul poate fi: •read-only (1) •hidden (2) •system (4) •normal (0)

AX în funcŃie de carry flag

I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL b)FIŞIERE .data handler dw ? ;handler la fişier atribut dw ? ;atribut creare fişier tipDeschid dw ? ;modul de deschidere a fişierului rez db ? ;variabilă verificare reuşită operaŃie numeFis db ’fisier.dat’,0 ;nume fişier NrOctetideScris dw ? ;numărul de octeŃi de scris în fişier NrOctetiScrisi dw ? ;numărul de octeŃi scrişi efectiv în fişier .code Creare MACRO numeFis, atribut, handler, rez local eroare, final push AX push CX push DX mov AH,3Ch ;încarc codul funcŃiei mov CX,atribut ;pun atributul fişierului lea DX,numeFis ;încarcă în DX adresa şirului de caractere asociat numelui INT 21h ;apelez întreruperea 21h jc eroare ;dacă operaŃia nu a avut loc cu succes CF este setat ;verific reuşita operaŃiei mov handler,AX ;dacă fişierul a fost creat iniŃializez handler-ul mov rez,0 ;iniŃializez variabila rez cu 0 jmp final ;salt la sfârşit macro eroare: ;în caz de eroare mov handler,-1 ;iniŃializez handler-ul cu o valoare negativă mov rez,AX ;reŃin in rez codul erorii (este diferit de 0) final: pop DX pop CX pop AX ENDM

I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL b)FIŞIERE DECHIDERE FIŞIER Parametrii intrare:

Registru corespondent

- cod funcŃie

3Dh → AH

- nume fişier

DX

- tip acces

AL

Parametrii returnaŃi: - handler - rezultat operaŃie

AX în funcŃie de carry flag

SCRIERE în FIŞIER Parametrii intrare: - cod funcŃie

Registru corespondent 40h → AH

- handler fişier

BX

- buffer din care se citesc datele pentru a fi scrise in fişier

DX

- număr octeŃi de scris în fişier

CX

Parametrii returnaŃi: - număr octeŃi scrişi efectiv în fişier - rezultat operaŃie

AX în funcŃie de carry flag

I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL b)FIŞIERE

CITIRE din FIŞIER

Parametrii intrare:

Registru corespondent

- cod funcŃie

3Fh → AH

- handler fişier

BX

- buffer în care se scriu datele citite din fişier

DX

- număr octeŃi de citit din fişier

CX

Parametrii returnaŃi: - număr octeŃi citiŃi efectiv din fişier - rezultat operaŃie

AX în funcŃie de carry flag

POZIłIONARE în FIŞIER Parametrii intrare: - cod funcŃie

Registru corespondent 42h → AH

- handler fişier

BX

- punct de referinŃă

AL

- număr octeŃi faŃă de punctul de referinŃă ai saltului (e un double)

cuv. inferior → DX cuv. superior → CX

Parametrii returnaŃi: - noua poziŃie în fişier (un double) - rezultat operaŃie

cuv. inferior → AX cuv. superior → DX în funcŃie de carry flag

I.11 LUCRU CU SIRURI DE CARACTERE I.11.1 Etape pentru lucru cu siruri de caractere 1. Se initializeaza DS:SI cu deplasament SRS 2. Se initializeaza ES:DI cu deplasament DST 3. Se initializeaza CX cu lungimea memoriei supusa prelucrarii. Preferabil minim dintre lungime sirsursa – SRS si destinatie – DST. 4. DF – Direction flag • 0 (CLD) – parcurgerea sirurilor de la stanga la dreapta • 1 (STD) – parcurgerea sirurilor de la stanga la dreapta

I.11 LUCRU CU SIRURI DE CARACTERE I.11.2 Instructiuni pentru siruri de caractere 1. movsb si movsw 2. cmpsb si cmpsw 3. lodsb si loadsw 4. stosb si stosw 5. scasb si scasw

I.11 LUCRU CU SIRURI DE CARACTERE I.11.2 Instructiuni pentru siruri de caractere 1. Muta sir sursa in sir destinatie

• movsb

• movsw

• • • • • • • •

DF=0 (CLD) ((SI))=((DI)) (SI)=(SI)+1 (DI)=(DI)+1 DF=0 (CLD) ((SI))=((DI)) (SI)=(SI)+2 (DI)=(DI)+2

• • • • • • • •

DF=1 (STD) ((SI))=((DI)) (SI)=(SI)-1 (DI)=(DI)-1 DF=1 (STD) ((SI))=((DI)) (SI)=(SI)-2 (DI)=(DI)-2

I.11 LUCRU CU SIRURI DE CARACTERE I.11.2 Instructiuni pentru siruri de caractere 2. Compara prin scadere temporara dst vs srs

• cmpsb

• cmpsw

• • • • • • • •

DF=0 (CLD) ((DI))-((SI)) (SI)=(SI)+1 (DI)=(DI)+1 DF=0 (CLD) ((DI))-((SI)) (SI)=(SI)+2 (DI)=(DI)+2

• • • • • • • •

DF=1 (STD) ((DI))-((SI)) (SI)=(SI)-1 (DI)=(DI)-1 DF=1 (STD) ((DI))-((SI)) (SI)=(SI)-2 (DI)=(DI)-2

I.11 LUCRU CU SIRURI DE CARACTERE I.11.2 Instructiuni pentru siruri de caractere 3. Incarcarea srs in registrul acumulator al microprocesorului

• lodsb

• DF=0 (CLD) • (AL)=((SI)) • (SI)=(SI)+1

• DF=1 (STD) • (AL)=((SI)) • (SI)=(SI)-1

• lodsw

• DF=0 (CLD) • (AX)=((SI)) • (SI)=(SI)+2

• DF=1 (STD) • (AX)=((SI)) • (SI)=(SI)-2

I.11 LUCRU CU SIRURI DE CARACTERE I.11.2 Instructiuni pentru siruri de caractere 4. Inregistrarea registrului acumulator al microprocesorului in dst

• stosb

• DF=0 (CLD) • ((DI))=(AL) • (DI)=(DI)+1

• DF=1 (STD) • ((DI))=(AL) • (DI)=(DI)-1

• stosw

• DF=0 (CLD) • ((DI))=(AX) • (DI)=(DI)+2

• DF=1 (STD) • ((DI))=(AX) • (DI)=(DI)-2

I.11 LUCRU CU SIRURI DE CARACTERE I.11.2 Instructiuni pentru siruri de caractere 5. Scanare zona de memorie prin scaderea temporara a sursei din registrului acumulator

• scasb

• DF=0 (CLD) • (AL)-((SI)) • (SI)=(SI)+1

• DF=1 (STD) • (AL)-((SI)) • (SI)=(SI)-1

• scasw

• DF=0 (CLD) • (AX)-((SI)) • (SI)=(SI)+2

• DF=1 (STD) • (AX)-((SI)) • (SI)=(SI)-2

I.11 LUCRU CU SIRURI DE CARACTERE I.11.3 Exemple 1. Copierea unui sir in alt sir 2. Compararea daca 2 siruri sunt echivalente (procedura)

I.11 LUCRU CU SIRURI DE CARACTERE I.11.3 Exemple 1. Copierea unui sir in alt sir 2. Compararea daca 2 siruri sunt echivalente (procedura) ciclu: mov AL, [SI] mov [DI], AL INC SI INC DI loop ciclu

movsb

rep movsb

I.11 LUCRU CU SIRURI DE CARACTERE I.11.3 Exemple 1. Copierea unui sir in alt sir 2. Compararea daca 2 siruri sunt echivalente (procedura) rep

repe sau repz

DA CX!=0 movsb, lodsb, stosb movsw, lodsw, stosw

NU

CX!=0 si ZF!=0

NU

cmpsb, scasb cmpsw, scasw

I.11 LUCRU CU SIRURI DE CARACTERE

I.11.3 Exemple 1. Copierea unui sir in alt sir .model large exit_dos MACRO mov ax,4c00h int 21h ENDM DATEprog SEGMENT src db 'Sirul meu sursa$' dimsrc dw $-src dst db '111111111111111$' dimdst dw $-dst DATEprog ENDS

;nu vreau stiva momentan SEGProg SEGMENT ASSUME DS:DATEProg,ES:DATEProg,CS:SEGProg start: mov AX, SEG src mov DS,AX mov ES,AX cld mov SI, offset src mov DI, offset dst mov cx, dimsrc rep movsb ; ciclu: ;;movsb ;lodsb ;stosb ; loop ciclu exit_dos SEGProg ENDS end start

I.11 LUCRU CU SIRURI DE CARACTERE I.11.3 Exemple 2. Compararea daca 2 siruri sunt echivalente (procedura) SEGProg SEGMENT .model large

ASSUME DS:DATEProg,ES:DATEProg,SS:Stiva,CS:SEGProg

start: mov AX, SEG src exit_dos MACRO mov DS,AX mov ax,4c00h mov ES,AX int 21h mov ax, Stiva ENDM mov ss,ax mov sp,varf DATEprog SEGMENT ;procedura far da rezultatul in DX=pozitia pt prima diferenta src db 'Sirul meu sursa$',0 ;int compara1(char* s,char* d, short int length); dimsrc dw $-src mov ax, dimsrc dst db 'Sirul1111111111$',0 push ax dimdst dw $-dst mov ax, offset dst DATEprog ENDS push ax mov ax, offset src Stiva SEGMENT push ax dw 10 dup(?) ;apel procedura varf label word CALL FAR PTR compara1 Stiva ENDS exit_dos SEGProg ENDS **aici e segmentul de proceduri end start

I.11 LUCRU CU SIRURI DE CARACTERE I.11.3 Exemple 2. Compararea daca 2 siruri sunt echivalente (procedura) ;**continuare Proceduri SEGMENT ASSUME CS:Proceduri compara1 PROC FAR push bp mov bp, sp ;se deseneaza stiva ;bp;IP;CS;adr-offset src;adr-offset dst;dimsrc ; ;[bp+4] ;[bp+8] ;[bp+10] cld mov SI, [bp+6] mov DI, [bp+8] mov cx, [bp+10]

ciclu_i: cmpsb jnz not_eq loop ciclu_i eqq: mov DX,0 jmp sfarsitproc not_eq: mov DX,CX sfarsitproc: pop bp ret 6h compara1 ENDP Proceduri ENDS

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF