Post on 26-Jul-2015
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 anti-virus 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 – “Practicadezvoltarii 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 UNUIPROGRAM ASSEMBLER - EXEMPLU
#include<stdio.h>
void main(){
char a = 7, b = 9;short int c;c = a+b;
}
.model small
.stack 16
.dataa db 7b db 9c dw ?
.codestart:
mov AX, @datamov DS, AX
mov AL,aadd AL,bmov c,AX
mov AX, 4C00hint 21h
end start
MicroProcessor RAM
BUS
Paşi în dezvoltare unui program ASM 8086
1. Editare D:\CursV\P1ASM\P1.asm2. Compilare: D:\CursV\ P1ASM \TASM\TASM.exe P1.asm3. Link-editare:
D:\Temp\ CursV\ P1ASM\TASM\TLINK.exe Ex1.objD:\Temp\ CursV\ P1ASM \TASM\TLINK.exe /Tdc Ex1.obj
4. Depanare: D:\Temp\ CursV\ P1ASM\TASM\TD.exe Ex1.exeD:\Temp\ CursV\ P1ASM\TASM\TD.exe Ex1.com
I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE
a) Întregi� Fără semn� Cu semn� BCD (Binary Code Decimal)
� Împachetat� Despachetat
b) Reale� Virgula fixă� Virgula mobilă
c) Alfanumerice
0010 000020h32
BINARHEXAZECIMAL
a)NUMERE ÎNTREGI
- Cu semn
1110 0000FFE0h-32
BINARHEXAZECIMAL
- BCD (Binary Code Decimal)
- Făra semn
- Împachetat
0011 001032h32
BINARHEXAZECIMAL
- Despachetat
0000 0011 0000 00100302h32
BINARHEXAZECIMAL
I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE
b)NUMERE REALE
-1.11101*2101 semn
parte întreagă parte zecimală
exponent
- Forma binara
- 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 maireprezinta intern primul bit egal cu 1E – 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
- Dubla precizie
- Precizie extinsa
parte zecimalăexponentsemn
22 030 2331
parte zecimalăparte zecimalăexponentsemn
31 051 3262 5263
parte zecimalăparte zecimalăîntregexponentsemn
31 062 326378 6479
Bias = 127
Bias = 1023
Bias = 16383
I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE
b)NUMERE REALE (continuare-exemplu)
00000000000000100110000011000011
MANTISAEXPONENTS
-134,25 formă zecimală
bit semn = 1
10000110,01
formă binară
1.000011001 x 27
formă binară normalizată
7 + 127 = 134
exponent = 10000110 mantisă = 000011001
I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE
c)CARACTERE ALFA-NUMERICE- ASCII
6 cifra
6 + 30h = 36h
cod ASCII
cod ASCII caracter ’0’
formă binară
0 0 1 1 0 1 1 0
I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE
a) Byte (1 octet) - DBb) Word (2 octeti) - DWc) Double-Word (4 octeti) - DDd) Quad-Word (8 octeti) - DQe) Ten-Bytes (10 octeti) - DT
I.2 REPREZENTARE INTERNĂ şi TIPURI de DATE
a)BYTE- Spatiu ocupat: 1 octet- Definire: a DB 10- Interpretare:
- Intreg pe 8 biti cu sau fara semn- Caracter ASCII
a DB 10 7 6 5 4 3 2 1 0
0 0 0 0 1 0 1 0
8 biŃi
b)WORD
- Spatiu ocupat: 2 octeti- Definire: a DW 1234h- Interpretare:
- Intreg pe 16 biti cu sau fara semn- Secventa de 2 caractere ASCII- Adresa de memorie pe 16 biti
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
16 biŃi * partea cea mai putin semnificativa este stocata la adrese mari
adrese
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
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 1001h 1002h 1003h
h
32 biŃi
* partea cea mai puŃin semnificativa este stocata la adrese mari
adrese
12 34 56 78 A DD
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 1002h 1003h 1004h 1005h 1006h 1007h
64 biŃi
* partea cea mai putin semnificativa este stocata la adrese mari
adrese
In hexa a are valoarea 1CBE991A83h
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
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.2 REPREZENTARE INTERNĂ şi TIPURI de DATE
4h9h
202122232425262700101001
01234567
I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL
Mod de adresare real
Mod de adresare protejat implementat de la 80386
DI
SI
SP
BP
DLDH
CLCH
BLBH
ALAH
7 015 8
ES
SS
DS
CS
15 0
IP
Flag
15 0
TOATE PROCESOARELE80286-80486
CPAZSTIDOIOPN
0123456789101112131415
Procesor 8088 - 80286
DATE
COD
STIVA
RAMAX:
BX:
CX:
DX:
I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL
MICROPROCESOR 8086
MEMORIE
1 MByte
SEGMENTE cu dimensiune = 64KB
…
…
…
ADRESE 20 biti
Spaţţţţiu de 64 KB
0FFFFh…0000
OFFSET SEGMENT
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.
:OFFSET16 biti
SEGMENT16 biti
0FFFFh…18A3h…0000h
64KB…64KB…64KB
…0FFFFh…05B27h…0001h0000h…0FFFFh…0000h
3hAh8h1h
1100010100011000
0123456789101112131415Formarea adresei fizice pe 20 biti se realizeaza automat prin hardware de catre o componenta a procesorului:
I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL
0h3hAh8h1h
00001100010100011000
012345678910111213141516171819
←←←← 4 biti
7h2hBh5h
1110010011011010
0123456789101112131415
7h5h5hEh1h
11101010101001111000
012345678910111213141516171819
+: OFFSETSEGMENT
ADRESA FIZICA
Utilizat in operaŃiile cu şiruri pentru a parcurge sursa.Destination IndexDI
Utilizat in operaŃiile cu şiruri pentru a parcurge sursa.Source IndexSI
REGISTRE INDEX
OperaŃii de intrare/ieşire, înmulŃire/împărŃire.Data RegisterDX
Utilizat in instrucŃiunile de ciclareCount RegisterCX
Utilizat ca indexBase RegisterBX
Calcule şi operaŃii de intrare/ieşireAccumulator RegisterAX
REGISTRE DE BAZĂ
I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL
Utilizat pentru a transfera în/din stivă date.Base PointerBP
Număr pe 16-biŃi ce reprezintă offeset-ul din cadrul stivei.Stack PointerSP
Număr pe 16-biŃi ce reprezintă offeset-ul instrucŃiunii următoare de executat în cadrul segmentului de cod.
InstructionPointerIP
REGISTRE INDEX
Număr pe 16-biŃi ce reprezintă adresa segmentului suplimentar activ.Extra SegmentES
Număr pe 16-biŃi ce reprezintă adresa segmentului de stivă activ.Stack SegmentSS
Număr pe 16-biŃi ce reprezintă adresa segmentului de date activ. Data SegmentDS
Număr pe 16-biŃi ce reprezintă adresa segmentului de cod activ. Code SegmentCS
REGISTRE DE SEGMENT
I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL
0Carry FlagCF
2Parity FlagPF
4Auxiliary CarryAF
6Zero FlagZF
7Sign FlagSF
8Trap FlagTF
9Interrupt FlagIF
10Direction FlagDF
11Overflow FlagOF
Nr. bitNumeAbr.
Registru de FLAG-uri
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).
I.3 REGIŞTRII MICROPROCESOR 8086 şi MOD de ADRESARE REAL
Categorii de instructiuni:a) De transferb) Aritmetico-logicec) De deplasare si rotatied) De salt neconditionat si conditionate) Sir de caractere
Tipuri de adresare:a) Imediatab) Directac) Indirectad) Bazat sau indexatae) Bazat si indexata
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
a)INSTRUCTIUNI DE TRANSFER
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
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
Procesor 8088 - 80286
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
CODSTIVĂDATE
DS:0000 :SPSS :IPCS
valoare adrese valoare adresevaloare adrese
EXEMPLU:
MOV AX, 1234hMOV BX, 5678hMOV CX, 9ABCh
PUSH AX (I)PUSH BX (II)PUSH CX (III)POP CX (IV)POP AX (V)POP BX (VI)
----
SS:1288SS:1286SS:1284SS:1282
CX
BX
AX
9ABCh
5678h
1234h
15 0
Procesor 8088 - 80286
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
CODSTIVĂDATE
DS:0000 :SPSS :IPCS
valoare adrese valoare adresevaloare adrese
EXEMPLU:
MOV AX, 1234hMOV BX, 5678hMOV CX, 9ABCh
PUSH AX (I)PUSH BX (II)PUSH CX (III)POP CX (IV)POP AX (V)POP BX (VI)
-3412h--
SS:1288SS:1286SS:1284SS:1282
CX
BX
AX
9ABCh
5678h
1234h
15 0
Procesor 8088 - 80286
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
CODSTIVĂDATE
DS:0000 :SPSS :IPCS
valoare adrese valoare adresevaloare adrese
EXEMPLU:
MOV AX, 1234hMOV BX, 5678hMOV CX, 9ABCh
PUSH AX (I)PUSH BX (II)PUSH CX (III)POP CX (IV)POP AX (V)POP BX (VI)
-1234h7856hBC9Ah
SS:1288SS:1286SS:1284SS:1282
CX
BX
AX
9ABCh
5678h
1234h
15 0
Procesor 8088 - 80286
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
CODSTIVĂDATE
DS:0000 :SPSS :IPCS
valoare adrese valoare adresevaloare adrese
EXEMPLU:
MOV AX, 1234hMOV BX, 5678hMOV CX, 9ABCh
PUSH AX (I)PUSH BX (II)PUSH CX (III)POP CX (IV)POP AX (V)POP BX (VI)
-3412h7856h-
SS:1288SS:1286SS:1284SS:1282
CX
BX
AX
9ABCh
5678h
1234h
15 0
Procesor 8088 - 80286
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
CODSTIVĂDATE
DS:0000 :SPSS :IPCS
valoare adrese valoare adresevaloare adrese
EXEMPLU:
MOV AX, 1234hMOV BX, 5678hMOV CX, 9ABCh
PUSH AX (I)PUSH BX (II)PUSH CX (III)POP CX (IV)POP AX (V)POP BX (VI)
-3412h--
SS:1288SS:1286SS:1284SS:1282
CX
BX
AX
9ABCh
5678h
5678h
15 0
Procesor 8088 - 80286
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
CODSTIVĂDATE
DS:0000 :SPSS :IPCS
valoare adrese valoare adresevaloare adrese
EXEMPLU:
MOV AX, 1234hMOV BX, 5678hMOV CX, 9ABCh
PUSH AX (I)PUSH BX (II)PUSH CX (III)POP CX (IV)POP AX (V)POP BX (VI)
----
SS:1288SS:1286SS:1284SS:1282
CX
BX
AX
9ABCh
1234h
5678h
15 0
a)INSTRUCTIUNI DE TRANSFER
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
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);
a)INSTRUCTIUNI DE TRANSFER
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
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;
a)INSTRUCTIUNI DE TRANSFER
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
LAHF•transfera valoarea flag-urilor de la 0 la 7 in AH;
SAHF•transfera valoarea registrului AH in registrul de flag-uri pestebitii 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… ;copiază în AX valoarea variabilei vbMOV AX,vb ;la asamblare vb este inlocuit de deplasament
Valoarea offset-ului este utilizată pentru a citi date direct din segmentul de date.
.dataVB 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
.dataVB dw 10
.code…MOV SI,offset VB ;initializez SI cu adresa lui vbMOV AX,[SI] ;copiază în AX valoarea variabilei vb
sau
…MOV BX,offset VB ;initializez BX cu adresa lui vbMOV AX,[BX] ;copiază în AX valoarea variabilei vb
d)ADRESARE BAZATA sau INDEXATAUtilizare registru baza sau index si a unui deplasament pentru a accesazone de memorie aflate la o anumita distanta fata de un reper
.datavector dw 10,11,12
.code…MOV SI,offset vector ;initializez SI cu adresa vectoruluiMOV AX,[SI+2] ;copiază în AX valoarea 11
sau
…MOV BX,4 ;initializez BX cu valoarea 4 MOV AX,val[BX] ;copiază în AX valoarea 12
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
e)ADRESARE BAZATA si INDEXATAUtilizare registru baza si index pentru a accesa zone de memorie aflate la o anumita distanta fata de un reper
.datavector dw 10,11,12,13,14
.code…MOV BX,offset vector ;initializez BX cu adresa vectoruluiMOV SI, 2 ;initializez SI cu valoarea 2MOV AX,[BX][SI] ;copiază în AX valoarea 11
sau
…MOV SI,4 ;initializez SI cu valoarea 4MOV BX,offset vector ;initializez BX cu adresa vectoruluiMOV AX,[BX][SI][2] ;copiază în AX valoarea 13
b)INSTRUCTIUNI ARITMETICO-LOGICE
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
Instructiunile aritmetice modifica registrul de flag•CF = 1 daca e transport/imprumut din/in bitul cel maisemnificativ (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 pentruWORD) este 1;•PF = 1 daca suma modulo 2 a celor 8 biti mai putinisemnificativi ai rezultatului este 0;•OF = 1 daca rezultatul operatiei este prea mare sau prea micpentru a fi stocat in destinatie;
DacaDaca sumasuma dintredintre 2 2 operanzioperanzi cu cu semnsemn de tip BYTE de tip BYTE depasestedepaseste 127 127 sausau esteeste maimai mica mica decatdecat --127 127 procesorulprocesorul seteazaseteaza OF. OF. DacaDaca sumasumadepasestedepaseste 255 255 procesorulprocesorul seteazaseteaza CF.CF.
b)INSTRUCTIUNI ARITMETICO-LOGICE
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
AL = 28 şi CF=1
AH = 142
AL = 142AL = -114 si OF=1
AL = 103AL = 103
AL = 27AL = 27
AL = 26AL = 26
Interpretare f ără semnInterpretare cu semn
REZULTAT.dataVb DB 39.code
…
MOV AL,26
INC AL
ADD AL,76
ADD AL, vb
MOV AH,AL
ADD AL,AH
AL = 86 si OF = 1
AH = 119
AL = 205 si SF=1AL = -51
AL = 71AL = 71
AL = 94AL = 94
AL = 95AL = 95
Interpretare f ără semnInterpretare cu semn
REZULTAT.dataVb DB 122.code
…
MOV AL,95
DEC AL
SUB AL,23
SUB AL, vb
MOV AH,119
SUB AL,AH
b)INSTRUCTIUNI ARITMETICO-LOGICE
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
b)INSTRUCTIUNI ARITMETICO-LOGICE
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
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 atuncieste setat CF; valoarea acestuia este preluata prin utilizarea instructiuniiADC (Add with carry).
b)INSTRUCTIUNI ARITMETICO-LOGICE
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
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 atuncieste setat CF; valoarea acestuia este preluata prin utilizarea instructiuniiSBC (Substract with carry).
b)INSTRUCTIUNI ARITMETICO-LOGICE
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
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;
b)INSTRUCTIUNI ARITMETICO-LOGICE
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
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
DXAX16 bi ŃiDX:AX32 bi Ńi
AHAL8 bi ŃiAX16 bi Ńi
RestCâtImpartitorDeîmpartitTip operanzi
CBWCWD
b)INSTRUCTIUNI ARITMETICO-LOGICE
I.4 CATEGORII de INSTRUCłIUNI, TIPURI de ADRESĂRI
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
deplasament sau adresă directă
octet superior octet inferior
0, 1 sau 2 bytes
date imediate
octet superioroctet inferior
0, 1 sau 2 bytes
codul unei instrucŃiuni are minim 1 octet si maxim 6 octeŃi
identific ă al doilea operand de tip registru sau un registru care particip ă la formarea adresei efective
register/memoryr/m
identific ă registrul utilizat în instruc Ńiuneregisterreg
codific ă modul de adresaremodemod
pt. w = 1 operanzii sunt de tip wordpt. w = 0 operanzii sunt de tip byte
word/byte bitw
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)
direction bitd
are valoare predefinit ăcod
r/mregmodwdcod instrucŃiune
1 sau 2 bytes
I.5 CODIFICAREA INSTRUCTIUNILOR
r/mregmodwdcod instrucŃiune
1 sau 2 bytes
deplasament sau adresă directă
octet superior octet inferior
0, 1 sau 2 bytes
date imediate
octet superioroctet inferior
0, 1 sau 2 bytes
codul unei instrucŃiuni are minim 1 octet si maxim 6 octeŃi
BHDIDS:[BX+deplas16]DS:[BX+deplas8]DS:[BX]111
DHSISS:[BP+deplas16]SS:[BP+deplas8]SS:[BP]110
CHBPDS:[DI+deplas16]DS:[DI+deplas8]DS:[DI]101
AHSPDS:[SI+deplas16]DS:[SI+deplas8]DS:[SI]100
BLBXSS:[BP+DI+deplas16]SS:[BP+DI+deplas8]SS:[BP+DI]011
DLDXSS:[BP+SI+deplas16]SS:[BP+SI+deplas8]SS:[BP+SI]010
CLCXDS:[BX+DI+deplas16]DS:[BX+DI+deplas8]DS:[BX+DI]001
ALAXDS:[BX+SI+deplas16]DS:[BX+SI+deplas8]DS:[BX+SI]000
w = 0w =1r/m
11*100100
mod
BHDI111
DHSI110
CHBP101
AHSP100
BLBX011
DLDX010
CLCX001
ALAX000
w = 0w =1reg
*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
•RCR – Rotate through Carry Right
←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
07
← 0CF
•SHL/SAL – Shift Left/Shift Arithmetic Left •SHR – Shift Right
→→→→→→→→
07
0 →CF
•SAR – Shift Arithmetic Right
→→→→→→→→
07
CF
•ROL – Rotate Left •ROR – Rotate Right
←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
07
CF→→→→→→→→
07
CF
•RCL – Rotate through Carry Left
←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
07
CF→→→→→→→→
07
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
Exemple instrucŃiunea CMP
AX = 10, BX = -12
• CMP AX, BX– AX – BX = +22
• CMP BX, AX– BX – AX = -22
• CMP AX, AX– AX – AX = 0
Stare flag-uri:
• SF=0, CF=1, OF=0, ZF=0
• SF=1, CF=0, OF=0, ZF=0
• SF=0, CF=0, OF=0, ZF=1
I.7 STRUCTURI DE CONTROL
b)Salturi condiŃionate
JNGE or JLJNAE<
JNGJNA<=
JNLE ori JGJNBE ori JA>
JNLJNB>=
JE ori JZJE or JZ= ori ==
JNE ori JNZJNE or JNZ<> ori !=
Unul dintre operanzi este cu semn
Ambii operanzi sunt consideraŃi fără semn
OperaŃie
I.7 STRUCTURI DE CONTROL
c)Tipuri de structuri logice
• IF-THEN• IF-THE-ELSE• REPEAT• DO-WHILE• WHILE-DO• CASE
In assembler se implementează utilizând instrucŃiunea CMP si salturi condiŃionate
I.7 STRUCTURI DE CONTROL
Structura de control IF-THEN
LIMBAJ EVOLUAT
if (op1 == op2) {
< expresie 1 >< expresie 2 >
}
ASSEMBLER
cmp op1, op2jne false<expresie 1><expresie 2>
false: <restul programului>
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, op2jle 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)
{<expresie 1><expresie 2>
}
ASSEMBLER
<initializare>repeat:
cmp op1,op2jae final<expresie 1><expresie 2><iteratie>jmp repeat
final:
I.7 STRUCTURI DE CONTROL
Structura de control DO-WHILE
LIMBAJ EVOLUAT
do{
<expresie 1><expresie 2>
} while (op1 != op2)
ASSEMBLER
do:<expresie 1><expresie 2>cmp op1,op2jnz do
I.7 STRUCTURI DE CONTROL
Structura de control DO-WHILE particulara
LIMBAJ EVOLUAT
i=n;do{
<expresie 1><expresie 2>i=i-1;
} while (i>=0)
ASSEMBLER
mov cx,nrepeat:
<expresie 1><expresie 2>loop repeat
I.7 STRUCTURI DE CONTROL
Loop trebuie să specifice un short jump (între -127 şi +127 bytes de la poziŃia curentă)
Structura de control CASE (SWITCH)
LIMBAJ EVOLUAT
switch (valoare) {case constanta1:
<expresie 1>break;
case constanta2:<expresie 2>break;
…default:
<expresie>
ASSEMBLER
cmp valoare,constanta1je case1cmp valoare,constanta2je case2…jmp default
case1:<expresie 1>jmp final
case2:<expresie 2>Jmp final
…default:
<expresie>final:
I.7 STRUCTURI DE CONTROL
DS
IP
DI
SI
SP
BP
DX
CX
BX
AX
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DS
0003hIP
DI
SI
SP
BP
DX
CX
BX
AX
0010h
0000h
DF32h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0005hIP
DI
SI
SP
BP
DX
CX
BX
AX
0010h
0000h
DF32h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0007hIP
DI
SI
SP
BP
DX
CX
BX
AX
0010h
0000h
0h
DF32h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
000BhIP
DI
SI
SP
BP
DX
CX
BX
AX
0010h
0000h
0004h
DF32h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
000EhIP
DI
SI
SP
BP
DX
CX
BX
AX
0010h
0000h
0004h
0002h
DF32h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0010hIP
DI
SI
SP
BP
DX
CX
BX
AX
0010h
0000h
0004h
0002h
0h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0012hIP
DI
SI
SP
BP
DX
CX
BX
AX
0h
0010h
0000h
0004h
0002h
0h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0014hIP
DI
SI
SP
BP
DX
CX
BX
AX
0h
0010h
0000h
0004h
0002h
0017h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0015hIP
DI
SI
SP
BP
DX
CX
BX
AX
0001h
0010h
0000h
0004h
0002h
0017h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0016hIP
DI
SI
SP
BP
DX
CX
BX
AX
0002h
0010h
0000h
0004h
0002h
0017h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0012hIP
DI
SI
SP
BP
DX
CX
BX
AX
0002h
0010h
0000h
0003h
0002h
0017h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0012hIP
DI
SI
SP
BP
DX
CX
BX
AX
0002h
0010h
0000h
0003h
0002h
0027h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0012hIP
DI
SI
SP
BP
DX
CX
BX
AX
0004h
0010h
0000h
0002h
0002h
0027h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0014hIP
DI
SI
SP
BP
DX
CX
BX
AX
0004h
0010h
0000h
0002h
0002h
004Ah
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0012hIP
DI
SI
SP
BP
DX
CX
BX
AX
0006h
0010h
0000h
0001h
0002h
004Ah
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0014hIP
DI
SI
SP
BP
DX
CX
BX
AX
0006h
0010h
0000h
0001h
0002h
0056h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
0018hIP
DI
SI
SP
BP
DX
CX
BX
AX
0008h
0010h
0000h
0000h
0002h
0056h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
001BhIP
DI
SI
SP
BP
DX
CX
BX
AX
0008h
0010h
0000h
0000h
0002h
0056h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h56h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DF32hDS
001EhIP
DI
SI
SP
BP
DX
CX
BX
AX
0008h
0010h
0000h
0000h
0002h
4C00h
15 0
Procesor 8088 - 80286
.model small
.stack 10h
.datan dw 4vector dw 23,16,35,12suma dw ?
.codeSTART:
0000 B8 0000s mov AX,@data0003 8E D8 mov DS,AX
0005 33 C9 xor CX,CX0007 8B 0E 0000r mov CX, n000B BB 0002r mov BX, offset vector000E 33 C0 xor AX,AX0010 33 F6 xor SI,SI
0012 REPETA:
0012 03 00 add AX, [BX][SI]0014 46 inc SI0015 46 inc SI0016 E2 FA loop REPETA
0018 A3 000Ar mov suma, AX001B B8 4C00 mov ax, 4C00h001E CD 21 int 21h
end START---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h56h00h
0D0C0B0ADS:09
Zona de stiva
Zonade date
DUMINICA
I.8 PROCEDURI
mov AX,4C00hint 21h
end START
InstrucŃiuni
secvenŃă de cod - SC
InstrucŃiuni
secvenŃă de cod - SC
InstrucŃiuni
secvenŃă de cod - SC
InstrucŃiuni
START:mov AX,@datamov DS,AX
Secventede cod identice
PROC rutinasecvenŃă de cod-SCEND PROC
mov AX,4C00hint 21h
end START
InstrucŃiuni
CALL rutina
InstrucŃiuni
CALL rutina
InstrucŃiuni
CALL rutina
InstrucŃiuni
START:mov AX,@datamov DS,AX
SEGMENT DE COD
Apelprocedura
IMPLEMENTARE PROCEDURI
I.8 PROCEDURI
SINTAXA DECLARĂRII UNEI PROCEDURI:
Nume_procedură PROC [FAR | NEAR]
..............
[Nume_procedura] ENDP
[Nume_procedură] ENDP
RET [nr_octeŃi]
Restaurarea registre
Stocare rezultate
Bloc prelucrare date cu referirea parametrilor formalii
Salvare registre
Nume_procedură PROC [FAR | NEAR]
Structura generală a unei proceduri scrisă în limbaje de asamblare este:
PUSH IPJMP rutina
PROC rutinapush BPmov BP,SP…pop BPret
End PROC
mov AX,4C00hint 21h
end START
InstrucŃiuni
CALL rutina
InstrucŃiuni
START:mov AX,@datamov DS,AX
I.8 PROCEDURI
-IP-------
SS:0010SS:000E000C000A00080006000400020000
ZONA DE STIVA DE 10 OCTETI
SEGMENT DE COD
APEL PROCEDURA DE TIP NEAR
---------
SS:0010SS:000E000C000A00080006000400020000
ZONA DE STIVA DE 10 OCTETI
salvare adresa instrucŃiunii următoare lui CALL
reprezintă un offsetpe 16 biti
PUSH CSPUSH IPJMP rutinamov AX,4C00h
int 21hend START
InstrucŃiuni
CALL rutina
InstrucŃiuni
START:mov AX,@datamov DS,AX
I.8 PROCEDURI
-CSIP------
SS:0010SS:000E000C000A00080006000400020000
ZONA DE STIVA DE 10 OCTETI
SEGMENT DE COD
APEL PROCEDURA DE TIP FAR
---------
SS:0010SS:000E000C000A00080006000400020000
ZONA DE STIVA DE 10 OCTETI
salvare adresa instrucŃiunii următoare lui CALL
reprezintă o adresade tip segment:offset pe 20 biti
PROC rutinapush BPmov BP,SP…pop BPret
End PROC SEGMENT DE COD
salvare adresa segment de cod curent
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].
CALL DWORD PTR adresă
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 [WORD|DOUBLE] PTR 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 registru sau variabilă
Eticheta este în alt segment. Înlocuieşte CS şi IP cu segmentul şi offsetul etichetei.
CALL FAR PTR eticheta
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 etichetă
Numele procedurii apelate reprezintă în esenŃă o etichetă.CALL nume_procedură
DESCRIERETIP OPERAND
I.8 PROCEDURI
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;
IP
DI
SI
SP
BP
DX
CX
BX
AX
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0006IP
DI
SI
SP
BP
DX
CX
BX
AX
0010
0000
0002
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
---------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0009IP
DI
SI
SP
BP
DX
CX
BX
AX
000E
0000
0002
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-0200-------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
000CIP
DI
SI
SP
BP
DX
CX
BX
AX
000E
0000
0004
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-0200-------
SS:0010SS:000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
000DIP
DI
SI
SP
BP
DX
CX
BX
AX
000C
0000
0004
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-02000400------
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0010IP
DI
SI
SP
BP
DX
CX
BX
AX
000C
0000
000A
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-02000400------
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0011IP
DI
SI
SP
BP
DX
CX
BX
AX
000A
0000
000A
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A00-----
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0019IP
DI
SI
SP
BP
DX
CX
BX
AX
0008
0000
000A
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A001400----
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
001AIP
DI
SI
SP
BP
DX
CX
BX
AX
0006
0000
000A
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
001CIP
DI
SI
SP
BP
DX
CX
BX
AX
0006
0006
000A
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
001EIP
DI
SI
SP
BP
DX
CX
BX
AX
0006
0006
0000
000A
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0021IP
DI
SI
SP
BP
DX
CX
BX
AX
0006
0006
0004
000A
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0024IP
DI
SI
SP
BP
DX
CX
BX
AX
0006
0006
0004
0002
000A
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0026IP
DI
SI
SP
BP
DX
CX
BX
AX
0006
0006
0004
0002
0000
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0028IP
DI
SI
SP
BP
DX
CX
BX
AX
0000
0006
0006
0004
0002
0000
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
002AIP
DI
SI
SP
BP
DX
CX
BX
AX
0000
0006
0006
0004
0002
0017
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
002CIP
DI
SI
SP
BP
DX
CX
BX
AX
0002
0006
0006
0004
0002
0017
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0028IP
DI
SI
SP
BP
DX
CX
BX
AX
0002
0006
0006
0003
0002
0017
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
002AIP
DI
SI
SP
BP
DX
CX
BX
AX
0002
0006
0006
0003
0002
0027
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
002CIP
DI
SI
SP
BP
DX
CX
BX
AX
0004
0006
0006
0003
0002
0027
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0028IP
DI
SI
SP
BP
DX
CX
BX
AX
0004
0006
0006
0002
0002
0027
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
002EIP
DI
SI
SP
BP
DX
CX
BX
AX
0004
0006
0006
0000
0002
0056
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0031IP
DI
SI
SP
BP
DX
CX
BX
AX
0004
0006
0006
0000
000A
0056
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h00h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0033IP
DI
SI
SP
BP
DX
CX
BX
AX
0004
0006
0006
0000
000A
0056
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h56h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0034IP
DI
SI
SP
BP
DX
CX
BX
AX
0004
0008
0000
0000
000A
0056
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A0014000000---
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h56h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0014IP
DI
SI
SP
BP
DX
CX
BX
AX
0004
0010
0000
0000
000A
0056
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
-020004000A001400----
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h56h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
0017IP
DI
SI
SP
BP
DX
CX
BX
AX
0004
0010
0000
0000
000A
4C00
15 0
Procesor 8088 - 80286.model small.stack 10h.data
n dw 4vector dw 23,16,35,12suma dw ?
.code0000 START:0000 mov ax,@data0003 mov ds,ax0005 mov AX, offset vector0008 push AX0009 mov AX,n000C push AX000D mov AX, offset suma0010 push AX
0011 CALL addv0014 mov ax, 4C00h0017 int 21h0019 addv PROC NEAR0019 push BP001A mov BP, SP001C xor CX,CX001E mov CX, [BP+6]0021 mov BX, [BP+8]0024 xor AX,AX0026 xor SI,SI0028 repeta:0028 add AX, [BX][SI]002A inc SI002B inc SI002C loop repeta002E mov BX, [BP+4]0031 mov [BX],AX0033 pop BP0034 ret 60037 addv ENDPend START
---------
SS:0010000E000C000A00080006000400020000
0Ch00h23h00h10h00h17h00h04h
0807060504030201DS:00
00h00h00h56h00h
0D0C0B0ADS:09Zona de date
Zona de stiva
I.9 MACRODEFINITII
a)DEFINIRE SI EXPANDARE
SecvenSecvenŃŃa de program scris in limbaj de asamblare care a de program scris in limbaj de asamblare care corespunde unei secvencorespunde unei secvenŃŃe cu caracter repetat.e cu caracter repetat.
Forma generala este:Forma generala este:
nume_macronume_macro MACROMACRO;Corp instruc;Corp instrucŃŃiuniiuni
ENDMENDM
DiferenDiferenŃŃa fata de proceduri => procesul de a fata de proceduri => procesul de macroexpandaremacroexpandare ––la asamblare apelul la asamblare apelul macrodefinitieimacrodefinitiei este este îînlocuit cu secvennlocuit cu secvenŃŃa a de cod din corpul acesteia.de cod din corpul acesteia.
I.9 MACRODEFINITII
Salvare registri generali:savereg MACRO
push AXpush BXpush CXpush DXpush SIpush DI
ENDM
Restaurare registri generali:restreg MACRO
pop DIpop SIpop DXpop CXpop BXpop AX
ENDM
Procedura1 PROC NEARsavereg…restregRET
Procedura1 ENDP
Procedura1 PROC NEARpush AXpush BX…pop BXpop AXRET
Procedura1 ENDP
Apel si macroexpandare:
b)b)MACRODEFINITII FARA PARAMETRIMACRODEFINITII FARA PARAMETRI
I.9 MACRODEFINITII
c)c)MACRODEFINITII MACRODEFINITII CUCU PARAMETRIPARAMETRI
nume_macronume_macro MACROMACRO P1, P2,P1, P2,……, , PnPn;Corp ;Corp instructiuniinstructiuni
ENDMENDM
add02 add02 MACROMACRO a, b, sa, b, spush AXpush AX
movmov AX, aAX, aadd AX, badd AX, bmovmov s, AXs, AX
pop AXpop AXENDMENDM
EvaluareaEvaluarea expresieiexpresiei::e = a + b + c + de = a + b + c + d
add02 a, b, eadd02 a, b, eadd02 e, c, eadd02 e, c, eadd02 e, d, eadd02 e, d, e
I.9 MACRODEFINITII
c)c)MACRODEFINITII CU PARAMETRIMACRODEFINITII CU PARAMETRI
swap01 swap01 MACROMACRO X, YX, Ypushpush AXAXpushpush BXBXmov BX, Xmov BX, Xmov AX, Ymov AX, Ymov X, AXmov X, AXmov Y, BXmov Y, BXpop BXpop BXpop AXpop AX
ENDMENDM
swap01 AX, SIswap01 AX, SI ; ; InterschimbaInterschimba AX cu SI ? AX cu SI ? pushpush AXAXpushpush BXBXmov BX, AXmov BX, AXmov AX, SImov AX, SImov AX, mov AX, AXAXmov SI, BXmov SI, BXpop BXpop BXpop AXpop AX
swap01 SP, DIswap01 SP, DI ; ; InterschimbaInterschimba SP cu DI ? SP cu DI ? pushpush AXAXpushpush BXBXmov BX, SPmov BX, SPmov AX, DImov AX, DI
mov SP, AX mov SP, AX ; Aici se modifica SP; Aici se modifica SPmov DI, BX mov DI, BX ; si ; si POPPOP--urileurilepop BX pop BX ; sunt; suntpop AX pop AX ; compromise (XCHG rezolvare); compromise (XCHG rezolvare)
Trebuie acordata atenŃie la modificarea conŃinutului registrului SP care controlează accesul la zona de date a stivei
I.9 MACRODEFINITII
d)d)ETICHETE SI VARIABILE LOCALEETICHETE SI VARIABILE LOCALE
EticheteEtichete locale (la locale (la macroexpandaremacroexpandare maxim maxim 10000)10000)
minim minim MACRO MACRO a, b, c, mina, b, c, minlocal local et1et1,, et2et2pushpush AXAXmovmov AXAX, a, acmpcmp AXAX, b, bjlzjlz et1et1movmov AXAX, b, b
et1et1::cmpcmp AXAX, c, cjlzjlz et2et2movmov AXAX, c, c
et2et2::movmov min, min, AXAXpoppop AXAX
ENDMENDM
VariabileVariabile localelocale
mask mask MACRO MACRO XXlocal local mascamasca.data.datamascamasca equequ 00001111b00001111b.code.codepushpush AXAXmovmov ALAL, X, Xand and ALAL, , mascamascamovmov X, X, ALALpoppop AXAX
ENDMENDM
I.9 MACRODEFINITII
d)d)ETICHETE SI VARIABILE LOCALEETICHETE SI VARIABILE LOCALE
Program principal:Program principal:……minim x, y, z, min1minim x, y, z, min1minim w, v, u, min2minim w, v, u, min2minim i, j, k, min3minim i, j, k, min3minim min1, min2, min3, minminim min1, min2, min3, min……
……pushpush AXAXmovmov AXAX, x, xcmpcmp AXAX, y, yjlzjlz et10000et10000movmov AXAX, y, y
et10000et10000::cmpcmp AXAX, z, zjlzjlz et20000et20000movmov AXAX, z, z
et20000et20000::movmov min1, min1, AXAXpoppop AXAXpushpush AX AX
movmov AXAX, w, wcmpcmp AXAX, v, vjlzjlz et10001et10001movmov AXAX, v, v
et10001et10001::cmpcmp AXAX, u, ujlzjlz et20001et20001movmov AXAX, u, u
et20001et20001::movmov min2, min2, AXAXpoppop AXAX
……
MACROEXPANDARE MACROEXPANDARE 1
MACROEXPANDARE 2
I.9 MACRODEFINITII
e)e)MACRODEFINITII REPETITIVE SI MACRODEFINITII REPETITIVE SI OPERATORI SPECIFICIOPERATORI SPECIFICI
REPT nREPT n;;corpcorp macroinstructiunimacroinstructiuni
ENDMENDM
IRP IRP p_formalp_formal, <, <lista_par_actualilista_par_actuali>>;;corpcorp macroinstructiunimacroinstructiuni
ENDMENDM
REPTREPT 33m_mesajm_mesaj
;;macroinstructiunemacroinstructiuneENDMENDM
m_mesajm_mesajm_mesajm_mesajm_mesajm_mesaj
IRPIRP x, <x, <‘‘aa’’, , ‘‘bb’’, , ‘‘cc’’>>db xdb x
ENDMENDM
db db ‘‘aa’’db db ‘‘bb’’db db ‘‘cc’’
EXEMPLU EXEMPLU
I.9 MACRODEFINITII
f)f)MACRODEFINITII DERIVATEMACRODEFINITII DERIVATE
add04 add04 MACRO MACRO a1, a2, a3, a4, sa1, a2, a3, a4, spushpush AXAXmovmov AXAX, a1, a1add add AXAX, a2, a2add add AXAX, a3, a3add add AXAX, a4, a4movmov s, s, AXAXpoppop AXAX
ENDMENDM
add02 add02 MACRO MACRO a1, a2, suma1, a2, sumpushpush AXAXmovmov AXAX, a1, a1add add AXAX, a2, a2
movmov sum, sum, AXAXpoppop AXAX
ENDMENDMSoluŃie iniŃiala
add04 add04 MACRO MACRO a1, a2, a3, a4, sa1, a2, a3, a4, sadd02 a1, a2, sadd02 a1, a2, sadd02 s, a3, sadd02 s, a3, sadd02 s, a4, sadd02 s, a4, s
ENDMENDM
add04 add04 MACRO MACRO a1, a2, a3, a4, sa1, a2, a3, a4, slocal t1, t2local t1, t2.data.datat1 t1 dwdw ??t2 t2 dwdw ??.code.code
add02 a1, a2, t1add02 a1, a2, t1add02 a3, a4, t2add02 a3, a4, t2add02 t1, t2, sadd02 t1, t2, s
ENDMENDM
DERIVARE
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, @dataMOV DS,AXMOV DX, offset mesajMOV AH,09hINT 21h
Afiseaza mesaj la consola
I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL
a)ÎNTRERUPERI
PROCESOR
RAM
apelintrerupere
0000:0000h
CF
PF
AF
ZF
SF
TF = 0
IF = 0
DF
OF
-CSIP-
SS:0010000E000C000A……
INT 21h
SEG:OFF
0084
INT 255 INT2INT1INT0
SEG:OFFSEG:OFFSEG:OFFSEG:OFF
03FC……000800040000
00000h FFFFFh
RO
M-B
IOS
ST
IVA
…MOV DX, offset mesajMOV AH,09hINT 21h…
DA
TE
KE
RN
EL-O
S
CO
D
INT
RE
RU
PE
I
FA
T
RO
M-B
IOS
D
AT
A
Tabela V
ectoriîntrerupere
I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL
a)ÎNTRERUPERILa 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:
Imprimantă standardstdprn4
Dispozitiv auxiliarstdaux3
Ieşire standard pentru mesaje de eroarestderr2
Ieşire standardstdout1
Intrare standardstdin0
DescriereDenumire
Valoare
I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL
b)FIŞIERE
PRINCIPALELE FUNCłII DOS PENTRU LUCRUL CU FIŞIERE SUNT:
Redenumire fi şier56h
Pozi Ńionare în fi şier42h
Ştergere în fi şier41h
Scriere în fi şier40h
Citire din fi şier3Fh
Închidere fi şier3Eh
Deschidere fi şier3Dh
Creare fi şier3Ch
Opera ŃieCod func Ńie (AH)
în funcŃie de carry flag- rezultat operaŃie
AX- handler
Parametrii returnaŃi:
CX- atribut fişier
DX- nume fişier
3Ch → AH- cod funcŃie
Registru corespondentParametrii intrare:
La momentul creării, tipul fişierul poate fi:•read-only (1)•hidden (2)•system (4)•normal (0)
I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL
b)FIŞIERE.datahandler dw ? ;handler la fişieratribut dw ? ;atribut creare fişiertipDeschid dw ? ;modul de deschidere a fişieruluirez db ? ;variabilă verificare reuşită operaŃienumeFis db ’fisier.dat’,0 ;nume fişierNrOctetideScris dw ? ;numărul de octeŃi de scris în fişierNrOctetiScrisi dw ? ;numărul de octeŃi scrişi efectiv în fişier.codeCreare MACRO numeFis, atribut, handler, rezlocal eroare, final
push AXpush CXpush DXmov AH,3Ch ;încarc codul funcŃieimov CX,atribut ;pun atributul fişieruluilea DX,numeFis ;încarcă în DX adresa şirului de caractere asociat numeluiINT 21h ;apelez întreruperea 21hjc eroare ;dacă operaŃia nu a avut loc cu succes CF este setat
;verific reuşita operaŃieimov handler,AX ;dacă fişierul a fost creat iniŃializez handler-ulmov rez,0 ;iniŃializez variabila rez cu 0jmp final ;salt la sfârşit macro
eroare: ;în caz de eroaremov 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 DXpop CXpop AX
ENDM
I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL
b)FIŞIERE
în funcŃie de carry flag- rezultat operaŃie
AX- handler
Parametrii returnaŃi:
AL- tip acces
DX- nume fişier
3Dh → AH- cod funcŃie
Registru corespondentParametrii intrare:
în funcŃie de carry flag- rezultat operaŃie
AX- număr octeŃi scrişi efectiv în fişier
Parametrii returnaŃi:
CX- număr octeŃi de scris în fişier
DX- buffer din care se citesc datele pentru a fi scrise in fişier
BX- handler fişier
40h → AH- cod funcŃie
Registru corespondentParametrii intrare:
SCRIERE în FIŞIER
DECHIDERE FIŞIER
I.10 ÎNTRERUPERI SI LUCRUL CU CONSOLA SI DISCUL
b)FIŞIERE
în funcŃie de carry flag- rezultat operaŃie
AX- număr octeŃi citiŃi efectiv din fişier
Parametrii returnaŃi:
CX- număr octeŃi de citit din fişier
DX- buffer în care se scriu datele citite din fişier
BX- handler fişier
3Fh → AH- cod funcŃie
Registru corespondentParametrii intrare:
în funcŃie de carry flag- rezultat operaŃie
cuv. inferior → AXcuv. superior → DX
- noua poziŃie în fişier (un double)
Parametrii returnaŃi:
cuv. inferior → DX cuv. superior → CX
- număr octeŃi faŃă de punctul de referinŃă ai saltului (e un double)
AL- punct de referinŃă
BX- handler fişier
42h → AH- cod funcŃie
Registru corespondentParametrii intrare:
POZIłIONARE în FIŞIER
CITIRE din FIŞIER
I.11 LUCRU CU SIRURI DE CARACTERE
I.11.1 Etape pentru lucru cu siruri de caractere
1. Se initializeaza DS:SI cu deplasament SRS2. Se initializeaza ES:DI cu deplasament DST3. Se initializeaza CX cu lungimea memoriei supusaprelucrarii. Preferabil minim dintre lungimesirsursa – 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 movsw2. cmpsb si cmpsw3. lodsb si loadsw4. stosb si stosw5. scasb si scasw
• movsb
• movsw
I.11.2 Instructiuni pentru siruri de caractere
1. Muta sir sursa in sir destinatie
• 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
• cmpsb
• cmpsw
I.11.2 Instructiuni pentru siruri de caractere
2. Compara prin scadere temporara dst vs srs
• 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
• lodsb
• lodsw
I.11.2 Instructiuni pentru siruri de caractere
3. Incarcarea srs in registrul acumulator al microprocesorului
• DF=0 (CLD)• (AL)=((SI))• (SI)=(SI)+1
• DF=0 (CLD)• (AX)=((SI))• (SI)=(SI)+2
• DF=1 (STD)• (AL)=((SI))• (SI)=(SI)-1
• DF=1 (STD)• (AX)=((SI))• (SI)=(SI)-2
I.11 LUCRU CU SIRURI DE CARACTERE
• stosb
• stosw
I.11.2 Instructiuni pentru siruri de caractere
4. Inregistrarea registrului acumulator al microprocesorului in dst
• DF=0 (CLD)• ((DI))=(AL)• (DI)=(DI)+1
• DF=0 (CLD)• ((DI))=(AX)• (DI)=(DI)+2
• DF=1 (STD)• ((DI))=(AL)• (DI)=(DI)-1
• DF=1 (STD)• ((DI))=(AX)• (DI)=(DI)-2
I.11 LUCRU CU SIRURI DE CARACTERE
• scasb
• scasw
I.11.2 Instructiuni pentru siruri de caractere
5. Scanare zona de memorie prin scaderea temporara a sursei din registrului acumulator
• DF=0 (CLD)• (AL)-((SI))• (SI)=(SI)+1
• DF=0 (CLD)• (AX)-((SI))• (SI)=(SI)+2
• DF=1 (STD)• (AL)-((SI))• (SI)=(SI)-1
• 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 sir2. Compararea daca 2 siruri sunt echivalente (procedura)
I.11 LUCRU CU SIRURI DE CARACTERE
I.11.3 Exemple
1. Copierea unui sir in alt sir2. Compararea daca 2 siruri sunt echivalente (procedura)
ciclu:mov AL, [SI]mov [DI], ALINC SIINC DIloop ciclu
movsb rep movsb
I.11 LUCRU CU SIRURI DE CARACTERE
I.11 LUCRU CU SIRURI DE CARACTERE
I.11.3 Exemple
1. Copierea unui sir in alt sir2. Compararea daca 2 siruri sunt echivalente (procedura)
rep repe sau repz
CX!=0 CX!=0si
ZF!=0
NUNU
DA
movsb, lodsb, stosbmovsw, lodsw, stosw
cmpsb, scasbcmpsw, scasw
I.11.3 Exemple1. Copierea unui sir in alt sir
.model large
exit_dos MACROmov ax,4c00hint 21hENDM
DATEprog SEGMENTsrc db 'Sirul meu sursa$'dimsrc dw $-srcdst db '111111111111111$'dimdst dw $-dstDATEprog ENDS
;nu vreau stiva momentanSEGProg SEGMENTASSUME DS:DATEProg,ES:DATEProg,CS:SEGProg
start:mov AX, SEG srcmov DS,AXmov ES,AXcldmov SI, offset srcmov DI, offset dstmov cx, dimsrcrep movsb
; ciclu:;;movsb;lodsb;stosb
; loop cicluexit_dos
SEGProg ENDSend start
I.11 LUCRU CU SIRURI DE CARACTERE
I.11 LUCRU CU SIRURI DE CARACTEREI.11.3 Exemple2. Compararea daca 2 siruri sunt echivalente (procedura)
.model large
exit_dos MACROmov ax,4c00hint 21hENDM
DATEprog SEGMENTsrc db 'Sirul meu sursa$',0dimsrc dw $-srcdst db 'Sirul1111111111$',0dimdst dw $-dstDATEprog ENDS
Stiva SEGMENTdw 10 dup(?)varf label word
Stiva ENDS
SEGProg SEGMENTASSUME DS:DATEProg,ES:DATEProg,SS:Stiva,CS:SEGProg
start:mov AX, SEG srcmov DS,AXmov ES,AXmov ax, Stivamov ss,axmov sp,varf
;procedura far da rezultatul in DX=pozitia pt prima d iferenta;int compara1(char* s,char* d, short int length);
mov ax, dimsrcpush axmov ax, offset dstpush axmov ax, offset srcpush ax;apel proceduraCALL FAR PTR compara1exit_dos
SEGProg ENDS**aici e segmentul de proceduriend start
I.11 LUCRU CU SIRURI DE CARACTERE
I.11.3 Exemple2. Compararea daca 2 siruri sunt echivalente (procedura)
;**continuareProceduri SEGMENTASSUME CS:Proceduri
compara1 PROC FARpush bpmov bp, sp;se deseneaza stiva;bp;IP;CS;adr-offset src;adr-offset dst;dimsrc; ;[bp+4] ;[bp+8] ;[bp+10]
cldmov SI, [bp+6]mov DI, [bp+8]mov cx, [bp+10]
ciclu_i:cmpsbjnz not_eq
loop ciclu_i eqq:mov DX,0jmp sfarsitproc
not_eq:mov DX,CX
sfarsitproc:pop bpret 6h
compara1 ENDPProceduri ENDS