Curs Virusologie - Part I
November 6, 2016 | Author: Cookie503 | Category: N/A
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