Creeaza.com - informatii profesionale despre


Simplitatea lucrurilor complicate - Referate profesionale unice
Acasa » scoala » informatica » calculatoare
INSTRUCTIUNI DE CONTROL AL PROGRAMULUI (CU EXCEPTIA SALTURILOR PROPRIU-ZISE) PENTRU MICROPROCESOARELE INTEL

INSTRUCTIUNI DE CONTROL AL PROGRAMULUI (CU EXCEPTIA SALTURILOR PROPRIU-ZISE) PENTRU MICROPROCESOARELE INTEL


INSTRUCTIUNI DE CONTROL AL PROGRAMULUI (CU EXCEPTIA SALTURILOR PROPRIU-ZISE) PENTRU MICROPROCESOARELE INTEL

1. Scopul lucrarii

Lucrarea de fata isi propune familiarizarea cu instructiunile de control al programului, exceptand salturile propriu-zise, precum si cu cateva tehnici de programare in asamblor specifice microprocesoa­relor Intel functionand "in modul real".

Subprogram. Definitie. Definirea unui subprogram se face formal pe baza unui algoritm care primeste variabile formale de intrare, acestea sunt prelucrate iar rezultatele prelucrarii sunt variabilele de iesire. La chemarea subprogramului sunt transmise valorilor parametrilor efectivi de intrare si prelucrate rezultatele transmise prin parametrii de iesire. Parametrii de intrare pot fi expresii de acelasi tip cu parametrii formali de intrare (in cazul parametrilor formali). NU este vizibil programatorului modul de trasfer al parametrilor intre program si subprograme. In limbaj de asamblare transmiterea parametrilor spre subprograme este mai complicata fiindca nu exista tipuri definite de date ci numai date de o anumita lungime. Tipul datelor este dat de instructiunile care se aplica asupra lor.



Subprogramele pot fi:

Normale pot chema alte subprograme dar nu se pot chema pe ele insele

Recursive care se pot chema pe ele insele direct sau indirect (N!=N*(N+1)!)

Reentrante care pot fi folosite simultan de mai multi utilizatori (editare texte)

Parametrii se pot transmite spre subprograme:

  • prin Valoare caz in care valoare parametrului se transmite subprogramului
  • prin Adresa cand sunt tabele cu multe elemente si adresa tabelului se transmite subprogramului, care va folosi metode de adresare indirecta sau/si indexata.

Transmiterea parametrilor spre subprograme se poate face prin: registre - cand sunt putini parametrii si de lungime redusa; zona de memorie cu structura cunoscuta si a carei adresa se da intr-un registru; stiva; tabela de adrese - metoda este cea mai eficienta dar nu poate fi folosita la procesoarele Intel care nu au adresare indirecta prin adresa de memorie.

2. Instructiuni de apelare si revenire de/din proceduri

In limbaj de asamblare chemarea unei proceduri se face cu instructiunea CALL. Parametrii procedurii se plaseaza inaintea chemarii in registre, intr-o zona de memorie sau in stiva. La scrierea procedurii se stabileste modul de transmitere a parametrilor. Parametrii pot fi transmisi prin valoare sau prin adresa.

Instructiunea CALL - cheama un subprogram. Pasii realizati la executia instructiunii sunt: se pune adresa de revenire (IP) in stiva si se sare la prima instructiune din procedura (IP=offset subprogram), in procedura se executa secventa de instructiuni pana la instructiunea RET, care incarca in IP adresa din varful stivei revenind la adresa instructiunii urmatoare dupa CALL (IP=osset program principal).

Instructiunea CALL se deosebeste de JMP prin faptul ca depune in stiva, registrul de instructiuni IP si eventual continutul registrului CS daca saltul este intr-un alt segment (salt de tip FAR).

La chemarea unei proceduri de tip FAR, care poate fi in alt segment, instructiunea CALL are adresa pe 4 octeti si depune in stiva atat IP cat si CS si incarca din adresa instructiunii noile valori pentru IP si CS.

O procedura de tip FAR se deosebeste de una de tip NEAR doar prin faptul ca instructiunea RET incarca din stiva atat adresa de revenire in IP cat si adresa segmentului in CS. Se recomanda ca procedurile sa fie globale (de tip FAR) pentru a putea fi pastrate in orice segment si sa poata fi apelate din oricare segment de program.

Apelarea unui

OF DF IF TF SF ZF AF PF CF

CALL adr

subprogram

Descrierea formala a semanticii, in functie de modul de adresare folosit:

a) Far CALL - pune in stiva IP si CS. Saltul se realizeaza in afara segmentului curent si trebuie modificat IP si reg. CS

Apel de subprogram cu adresare absoluta (directa) intersegment :

CALL adr32 ;

(SP) (SP) - 2

((SS)0H + (SP) +1) ((SS)0H + (SP)) (CS)

(CS) ((CS)0H + (IP) + 4) ((CS)0H+ (IP) + 3)

(SP) (SP) - 2

((SS)0H + (SP) + 1) ((SS)0H + (SP)) (IP)

(IP) ((CS)0H + (IP) + 2) ((CS)0H + (IP) + 1)

In descrierea formala a semanticii am tinut seama ca adresa completa adr32, care este o adresa logica, face parte din formatul instructiunii.

b) Apel de subprogram cu adresare relativa:

CALL disp16 ;

(SP) (SP) - 2

((SS)0H +(SP)+1) ((SS)0H +(SP)) (IP)

(IP) (IP) + disp16

Este un salt intrasegment, dar se observa ca, spre deosebire de salturile propriu-zise, deplasamentul este admis numai pe 16 biti (deci el va ocupa doi octeti in formatul instructiunii curente de apel).

c) Apel de subprogram cu adresare indirecta in memorie, intersegment:

CALL mem32 ;

(SP) (SP) - 2

((SS)0H +(SP)+1) ((SS)0H +(SP)) (CS)

(CS) (mem32)h

(SP) (SP) - 2

((SS)0H +(SP)+1) ((SS)0H +(SP)) (IP)

(IP) (mem32)l

d) Near CALL - pune in stiva IP. Saltul se realizeaza in segmentul curent cu -32K pana la +32K fata de IP.

Apel de subprogram cu adresare in registru sau indirecta in memorie, intrasegment:

CALL r16|mem16 ;

(SP) (SP) - 2

((SS)0H +(SP)+1) ((SS)0H +(SP)) (IP)

(IP) (r16) | (mem16) .

Operanzi

Exemple

Descrierea formala a semanticii

adr32

CALL PROCSEGM

(SP) (SP) - 2

((SS)0H+(SP)+1) ((SS)0H+(SP)) (CS)

(CS) ((CS) 0H+(IP)+4) ((CS) 0H+(IP)+3)

(SP) (SP) - 2

((SS) 0H+(SP) +1) ((SS) 0H+(SP)) (IP)

(IP) ((CS) 0H+(IP)+2) ((CS) 0H+(IP)+1)

disp16

CALL SORTARE

(SP) (SP) - 2

((SS)0H +(SP)+1) ((SS)0H +(SP)) (IP)

(IP) (IP) +

+ ((CS)0H+(IP)+2) ((CS)0H+(IP)+1)

r16

CALL BX

(SP) (SP) - 2

((SS)0H +(SP)+1) ((SS)0H +(SP)) (IP)

(IP) (BX)

mem*

CALL [BX]

(SP) (SP) - 2

((SS)0H +(SP)+1) ((SS)0H +(SP)) (IP)

(IP) ((DS) 0H+(BX)+1) ((DS) 0H+(BX))

mem**

CALL [DI]

(SP) (SP) - 2

((SS)0H+(SP)+1) ((SS)0H+(SP)) (CS)

(CS) ((DS)0H+(DI)+3) ((DS)0H+(DI)+2)

(SP) (SP) - 2

((SS)0H+(SP) +1) ((SS)0H+(SP)) (IP)

(IP) ((DS)0H+(DI)+1) ((DS)0H+(DI))

apelare de subprogram cu adresare indirecta definita cu directiva de asamblare ca

apelare intra-segment;

** apelare de subprogram cu adresare indirecta definita cu directiva de asamblare ca

apelare inter-segment.

Instructiunea RET N - instructiune de revenire din subprogram in programul principal, N este valoarea cu care se incrementeaza SP. La revenirea in programul principal trebuie ca stiva sa fie goala adica sa aiba aceeasi pozitie ca la apelul procedurii.

Reintoarcere din

OF DF IF TF SF ZF AF PF CF

RET [data16]

subprogram

Descrierea formala a semanticii, in functie de modul de adresare folosit:

RET [data16] ;

(IP) ((SS)0H +(SP)+1) ((SS)0H +(SP))

(SP) (SP) + 2

[(CS) ((SS)0H +(SP)+1) ((SS)0H +(SP))

(SP) (SP) + 2]

[(SP) (SP) + data16]


Se observa ca revenirea se poate face fie intersegment fie intrasegment; aceasta decizie, tran­s­pa­renta programatorului, este determinata de tipul apelului de subprogram folosit in prealabil. In plus, exista posibilitatea de a se rezerva, optional, un spatiu in stiva prin folosirea operandului data16.

Operanzi

Exemple

Descrierea formala a semanticii

RET  ;intra-segment

(IP) ((SS) 0H +(SP)+1) ((SS) 0H +(SP))

(SP) (SP) + 2

data16

RET  4 ;intra- segment

(IP) ((SS) 0H +(SP)+1) ((SS) 0H +(SP))

(SP) (SP) + 2

(SP) (SP) + 04H

RET  ;inter-segment

(IP) ((SS) 0H +(SP)+1) ((SS) 0H +(SP))

(SP) (SP) + 2

(CS) ((SS) 0H+(SP)+1) ((SS) 0H +(SP))

(SP) (SP) + 2

data16

RET  2 ;inter- segment

(IP) ((SS) 0H +(SP)+1) ((SS) 0H +(SP))

(SP) (SP) + 2

(CS) ((SS) 0H+(SP)+1) ((SS) 0H +(SP))

(SP) (SP) + 2

(SP) (SP) + 02H

3. Controlul iteratiilor

Instructiunea Loop - executa neconditionat un program atata timp cat continutul registrului CX este diferit de zero.

Cicleaza

OF DF IF TF SF ZF AF PF CF

LOOP disp8

neconditionat

Descrierea formala a semanticii:

(CX) (CX) - 1

if (CX) 0 then (IP) (IP) + disp8.

Operanzi

Exemple

disp8

LOOP BUCLA

Instructiunea LOOPE/LOOPZ - instructiune de ciclare pana cand este continutul registrului CX egal cu zero si cit timp flagul ZF este setat. Cand conditiile sunt indeplinitre, in registrul IP se va aduna adresa deplasamentului

Cicleaza cat timp

OF DF IF TF SF ZF AF PF CF

LOOPE|LOOPZ

'egal' sau 'zero'

disp8

Descrierea formala a semanticii:

(CX) (CX) - 1

if (ZF)=1 and (CX)0 then (IP)(IP)+disp8.

Aceasta instructiune permite un ciclu conditionat; ciclarea se realizeaza pana la epuizarea contorului numai daca in tot acest timp (ZF)=1 (cicleaza 'cat timp este zero' sau 'cat timp este egal', ceea ce inseamna ca se poate tine seama de egalitatea a doi operanzi sau de orice alta operatie care are drept urmare setarea fanionului ZF). Orice resetare a fanionului ZF duce la iesirea fortata din ciclu.

Operanzi

Exemple

disp8

LOOPE CICLU

Instructiunea LOOPNE/LOOPNZ - conditia este invers decat la instructiunea dinainte.

Cicleaza cat timp

OF DF IF TF SF ZF AF PF CF

LOOPNE|

'ne-egal' sau

| LOOPNZ disp8

'non-zero'

Descrierea formala a semanticii:

(CX) (CX) - 1

if (ZF)=0 and (CX)0 then (IP)(IP)+disp8 .

Conditia de mentinere a ciclului este inversa fata de instructiunea precedenta: cicleaza 'cat timp diferit de zero' sau 'cat timp nu e egal'.

Operanzi

Exemple

disp8

LOOPNZ REPETA

Instructiunea JCXZ disp8 - se sta in bucla cat timp continutul registrului CX este diferit de zero. Cand acesta devine zero se adauga la continutul registrului IP o valoare numita deplasament.

OF DF IF TF SF ZF AF PF CF

JCXZ disp8

Salt daca (CX) = 0

Descrierea formala a semanticii:

if (CX) = 0 then (IP) (IP) + disp8 .

Operanzi

Exemple

disp8

JCXZ STOP

4. Cateva elemente privind tehnica de utilizare a atributelor de arhitectura ale microprocesorului

Cand se proiecteaza un program in limbaj de asamblare, pentru a controla exact evolutia programului sau pentru a-l optimiza, trebuie avute in vedere atributele de arhitectura ale microprocesorului, cateva elemente care tin de modul sau de lucru, caracteristicile asamblorului sau sistemului de operare.

Astfel:

- Pe prima linie a programului se introduce directiva ORG 100h necesara deoarece sistemul de operare DOS incarca si executa programele executabile de tip COM de la adresa 100h.

- Se recomanda ca la inceputul programului sa se faca suprapunerea segmentului de date (definit cu DS) cu segmentul de cod (definit cu CS), de exemplu prin secventa de instructiuni:

mov ax,cs

mov ds,ax .

- Ultima instructiune pe care o executa programul trebuie sa fie INT 20h, daca se doreste revenirea in sistemul de operare DOS (sau in programul apelant).

- Se recomanda ca datele declarate prin directive DB (define byte), DW (define word), EQU (equality), sa fie plasate grupat la inceputul sau sfarsitul programului; daca declararea se face la inceputul programului, se va plasa inaintea zonei de date un salt neconditionat la prima instructiune a programului, iar daca declararea se face la sfarsitul programului, zona de date se va plasa dupa instructiu­nea de reintoarcere in sistemul de operare, INT 20h.

- Cand se folosesc subprograme (proceduri), trebuie avuta in vedere problema conservarii unor registre prin plasarea de instructiuni PUSH la inceputul subprogramului pentru salvarea in stiva a registrelor dorite, iar la sfarsitul subprogramului, instructiuni POP pentru refacerea acestora.

In corpul unui subprogram se pot face apelari de alte subprograme, insa trebuie observat ca pentru fiecare apel se face automat o salvare in stiva (poate aparea depasirea spatiului alocat pentru stiva).

Transferul de date catre subprograme se poate face:

. prin registre, daca numarul datelor este mic;

. in memorie, prin intermediul stivei; in programul apelant se plaseaza instructiuni PUSH iar in subrutina instructiuni POP;

. in memorie, sub forma unor tabele de date, prin transferarea adreselor acestora folosind registre.

Transferul de date de la subprograme se poate face:

. prin registre;

. prin stiva;

. prin tabele de date;

. prin intermediul fanioanelor.

5. Modul de lucru recomandat

In lucrare sunt prezentate trei programe de aplicatii care rezolva probleme reale, pentru care s-a specificat atat problema de rezolvat cat si algoritmul folosit.

Programele se vor edita, omitandu-se comentariile, si se vor executa pas cu pas, urmarindu-se modificarile in registre si memorie, conform comentariilor.

Desfasurarea lucrarii

5.1. Se lanseaza EMU8086 si se editeaza textul programu­lui nr.1, fara a scrie si comentariile.

5.2. Se emuleaza programul apasand pe butonul Eumulate.

5.3. Se vizualizeaza lista de simboluri (S) si se noteaza adresele simbolurilor folosite.

Se seteaza zona 2 de afisare a memoriei la adresa simbolului SIR .

5.5 Se executa programul pas cu pas, urmarindu-se in paralel registrele si memoria, conform comentariilor.

5.6 Se repeta punctele 5.1. - 5.5 pentru programele 2 si 3.

Programul 1

Utilizarea instructiunii CALL :

Problema 1

Sa se scrie o procedura de gasire a maximului intr-un sir de numere intregi cu semn, reprezentate pe cate un octet.

Se impun:

Date de intrare:

- registrul BX va contine adresa de inceput a sirului;

- registrul CX va contine lungimea sirului.

Date de iesire:

- registrul AL va contine octetul maxim din ]ir;

- registrul DX va contine adresa octetului maxim.

Registre afectate: AL si DX.

Pentru a verifica procedura, se va scrie un program in care se vor defini datele, se vor initializa registrele si se va apela procedura de gasire a maximului.

Algoritm:

Se initializeaza registrul AL cu cel mai mic intreg cu semn reprezentabil pe un octet (80h). Incepand cu primul octet din sir, se face o comparatie cu continutul registrului AL. Daca octetul din sir este mai mare decat continutul registrului AL, se face transferul octetului in AL si a adresei octetului in DX. Se continua parcurgerea sirului cu elementul urmator, pana la epuizarea tuturor octetilor din sir.

Textul programului:

org 100h

mov ax,cs

mov ds,ax

jmp start ;salt la prima instructiune

sir db 0f0h,0f3h,05h,76h,89h,76h,85h,93h

start mov bx,offset sir ;incarca in BX adresa sirului.

mov cx,offset start-offset sir

;incarca in CX lungimea

;sirului

call getmax ;apelare rutina de maxim.

int 20h ;revenire in DOS.

getmax push bx ;conserva registrele

push cx ;BX, CX si fanioanele.

pushf

mov al,80h ;incarca in AL cel mai mic numar

;cu semn de un octet

adr1 cmp al,[bx] ;compara AL cu un octet din sir

jl adr3 ;daca AL<octet salt la 'adr3'

adr2 inc bx ;trece la octetul urmator

;al sirului.

loop adr1 ;repeta de la adresa 'adr1'

;pana la sfirsitul sirului.

popf ;reface registrele BX, CX

pop cx ;si fanioanele.

pop bx

ret ;revenire in programul

;apelant.

adr3 mov al,[bx] ;inacarca in AL octetul cu

;adresa in BX.

mov dx,bx ;incarca in DX adresa octetului.

jmp adr2 ;salt la 'adr2'.

Programul 2

Problema:

Sa se ordoneze in ordine descrescatoare sau crescatoare un sir de cuvinte (de cate 2 octeti).

Algoritm:

Se parcurge sirul in ordine, comparandu-se elementul i cu elementul i+1. Daca cele doua elemente nu sunt in ordinea dorita, se vor inversa. Daca a avut loc o inversare de elemente, se reia parcurgerea sirului cu primul element, altfel se continua parcurgerea sirului cu elementul urmator.

Descriere program:

Se folosesc doua proceduri ORDON si GETORD.

Procedura ORDON ordoneaza sirul in ordinea dorita.

Date de intrare:

- registrul BX = 0 pentru ordonare descrescatoare;

BX = FF pentru ordonare crescatoare;

- registrul BP = adresa de inceput a sirului.

Date de iesire:

- zona de memorie de la adresa sirului.

Procedura GETORD gaseste relatia dintre doua elemente succesive ale sirului.

Date de intrare:

- registrul BX indica tipul ordonarii;

- registrul BP contine adresa de inceput a sirului;

- registrul SI contine indexul elementului curent.

Date de iesire:

- fanionul CF = 0 ordinea este buna;

CF = 1 ordinea este inversa.

Textul programului

org 100h

mov ax,cs

mov ds,ax

jmp start ;salt la prima instructiune

sir dw 2032h,2037h,2031h,2033h,2035h,2036h,2034h

lungsir dw ? ;lungimea sirului

start mov bp,offset sir

mov si,0

mov [lungsir],(offset lungsir)-(offset sir)-2

ror lungsir,1

desc mov bl,00 ;ordoneaza sirul in

call ordon ;ordine descrescatoare

cresc mov bl,0ffh ;ordoneaza sirul in

call ordon ;ordine crescatoare int 20h ;revenire in programul apelant

ordon mov si,0 ;seteaza SI la inceputul sirului

mov cx,lungsir ;incarca in CX nr. de iteratii

bucla call getord ;cheama procedura GETORD(seteaza sau nu CF)

jc invers ;daca ordinea nu este buna, salt

inc si ;seteaza SI pentru elementul

inc si ;urmator

loop bucla ;repeta de la BUCLA ret

invers mov ax,[bp+si] ;interschimb intre locatiile

xchg ax,[bp+si+2] ;de memorie BP+SI si BP+SI+2

xchg ax,[bp+si] ;folosind registrul AX ca ;registru temporar.

mov si,00 ;seteaza SI la inceputul sirului

mov cx,lungsir ;incarca CX cu nr. de iteratii

jmp bucla

getord mov ax,[bp+si] ;compara elementele succesive

;de index SI si SI+2

cmp ax,[bp+si+2]

lahf ;incarca fanioanele in

;registrul AH si seteaza

xor ah,bl ;conform lui BL

rol ah,1 ;pregateste continutul lui

;AH pentru tranfer

sahf ;in fanioane

ret

Programul 3

Problema:

Dandu-se 10 siruri de caractere, fiecare de maximum 255 octeti, avand ultimul octet 0, sa se ordoneze in ordine alfabetica, in aceeasi zona de memorie.

Algoritm:

Se considera sirurile pe rand, incepand cu primul, si se compara cu sirul urmator. Daca ordinea in care se afla nu este buna, sirul curent este mutat la sfarsitul zonei de date si se reia procesul de la primul sir. Altfel, se trece la urmatorul sir si se face o noua comparatie.

Descriere program:

Se folosesc trei proceduri: CALCAD, COMP si SCHIMB.

Procedura CALCAD calculeaza adresa sirului cu numarul dat de continutul registrului AL.

Date de intrare:

- registrul AL contine numarul sirului pentru care se calculeaza adresa;

- zona de memorie de la adresa SIR.

Date de iesire:

- registrul BX adresa irului specificat;

Registre afectate: BX.

Procedura COMP compar doua siruri.

Date de intrare:

- registrele BX si DX contin adresele celor doua siruri;

- zona de memorie de la adresele date de registrele BX si DX.

Date de iesire:

- fanionul SF = 1 daca ordinea nu corespunde.

Registre afectate: nici unul.

Procedura SCHIMB plaseaza sirul care incepe la adresa data de registrul BX la sfasitul zonei de date.

Date de intrare:

- registrul BX contine adresa sirului de transferat;

- zona de memorie de la adresa data de registrul BX pana la sfarsitul zonei de date.

Date de iesire:

- zona de memorie de la adresa specificata pana la sfarsitul zonei de date.

Registre afectate: SI si DI.

Textul programului

org 100h

mov ax,cs

mov ds,ax

jmp start ;salt la prima instructiune

nrsir dw 9 ;cuvant care contine numarul de

;siruri, incepand cu 0

sir db 'program',0 ;definire siruri alfanumerice

;terminate cu octet zero

db 'de',0

db 'ordonare',0

db 'pentru',0

db 'siruri',0

db 'alfanumerice',0

db 'terminate',0

db 'cu',0

db 'octet',0

db 'zero',0

start mov cx,nrsir ;aici incepe programul cu

;incarcarea in CX a numarului de

; siruri (numarul de iteratii).

bucla mov al,byte ptr nrsir

sub al,cl ;incarca in AL numarul sirului curent AL=NRSIR- CL.

call calcad ;calculeaza adresa de inceput

;a sirului curent (adresa in BX)

mov dx,bx ;si stocheaza adresa in DX

inc al

call calcad ;calculeaza adresa de inceput a

;sirului curent+1 (adresa in BX)

call comp ;compara sirurile de la adresele

;continute in BX si DX

jg adr1 ;daca ordinea este buna

;face salt la 'adr1'

call schimb ;altfel apeleaza SCHIMB

mov cx,nrsir ;si pregateste CX pentru

;reluare iteratii de la inceput

inc cx

adr1 loop bucla ;repeta programul pina la ultimul sir

int 20h ;revenire in DOS

calcad push cx ;conserva registrele CX

push ax ;si AX.

mov bx,offset sir ;incarca in BX adresa primului sir

and al,al ;daca AL este 0

jz adr4 ;salt la 'adr4' (in BX este adresa sirului 0).

mov cl,al ;pune in CX numarul sirului

mov ch,0 ;din AL

xor al,al ;face AL=0 (referinta de comparatie).

adr2 cmp [bx],al ;compara cu 0 continutul locatiei de

;memorie cu adresa data de BX.

je adr3 ;daca egalitate salt la 'adr3'

inc bx ;altfel trece la urmatorul

jmp adr2 ;element al sirului

adr3 inc bx ;in BX adresa de inceput a

;unui sir

loop adr2 ;daca nu este cel dorit repeta de la 'adr2'

adr4 pop ax ;reface registrele AX si CX

pop cx

ret ;revine in programul apelant

comp push ax ;conserva registrele AX si BX

push bx

mov si,dx ;pune in SI adresa de inceput

;a unui sir de comparat

reia lodsb ;pune in AL un octet al sirului

cmp [bx],al ;compara un octet al celui

;de-al doilea sir de comparat

;cu AL setand fanioanele

je egal ;daca egalitate salt la

;'egal'

pop bx ;reface registrele BX si AX

pop ax

ret ;revine in programul apelant

egal inc bx ;trece la elementul urmator

jmp reia ;al sirurilor.

schimb push ax ;conserva registrele AX si CX

push cx

reit mov si,dx ;incarca in SI si DI adresa

mov di,dx ;sirului de transferat

lodsb ;incarca in AL octetul

;de la adresa SI

mov cx,offset start-1

sub cx,dx ;incarca pe CX cu diferenta

;dintre inceputul sirului

;si sfarsitul zonei de date

repnz movsb ;transfera toti octetii din aceasta zona

stosb ;pune in ultima locatie a zonei

;de date octetul din AL

cmp al,0 ;compara daca s-a ajuns la sfarsitul sirului.

je ies ;daca da, salt la 'ies'

jmp reit ;altfel salt la 'reit' (reluare).

ies pop cx ;reface registrele CX si AX.

pop ax

ret ;revenire in programul apelant.





Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.