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 microprocesoarelor 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:
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, transparenta 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 |
|
|
neconditionat | |
Descrierea formala a semanticii:
(CX) (CX) - 1
if (CX) 0 then (IP) (IP) + disp8.
Operanzi |
Exemple |
disp8 |
|
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 instructiunea 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 programului 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
xor al,al ;face
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 |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |