Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Subprograme reentrante

calculatoare



+ Font mai mare | - Font mai mic



Subprograme reentrante

Subprogramele reentrante contin cod pur care nu se modifica in timpul rularii:

  • Instructiuni
  • Constante, mesaje sau tabele

Nu se accepta ca un subprogram reentrant sa contina variabile care isi modifica valoarea in timpul prelucrarii. Starea lui nu depinde de "instoria sa". Programul poate fi memorat intr-o memorie de tip ROM (Read Only Memory).



Principalele caracteristici ale programelor reentrante sunt:

  1. Subprogramul reentrant poate fi folosit simultan de mai multi utilizatori.
  2. El poate fi intrerupt inainte de a se termina (asteptari de date sau intreruperi de timp).
  3. Pe perioada intreruperii poate fi folosit de un alt utilizator, care la randul lui poate fi intrerupt.
  4. Un program intrerupt continua la relansare din punctul din care a fost intrerupt.
  5. Fiecare utilizator va avea propria zona de memorie care are aceeasi structura pentru toti, in care sunt memorate toate variabilele din program pentru acel utilizator.
  6. Programul va lucra pe o structura de date virtuala declarata cu STRUC, care se aplica peste zona utilizatorului activ.
  7. Zona de lucru activa se specifica printr-un registru de segment care se incarca la activarea unui utilizator.
  8. La fiecare intrerupere de program starea programului intrerupt se memoreaza in zona de lucru a utilizatorului care a fost activ (registre, IP, Flag-uri).
  9. La activarea unui nou utilizator se va incarca din zona sa de lucru starea programului si se va continua din punctul in care a fost intrerupt.

In figura urmatoare se prezinta schematic modul de structurare a datelor la un program reentrant.

CS

Program reentrant

cod pur

DS

DS

Zona date user1

Zona date user2

Zona date user3

N

S

X-------

Stare registre

Program reentrant pentru introducere si afisare texte pe linii

Consideram mai multi utilizatori care lucreaza simultan de la 3 console si introduc fiecare cate un text si pot fi intrerupti dupa fiecare rand introdus.

Fiecare utilizator are o zona de date proprie de 10 linii x 40 caractere, dar cu aceeasi structura. Numarul de linii N introduse de fiecare utilizator este diferit si se tine la inceputul zonei. Prima adresa libera din text unde se va scrie urmatoarea linie este data in al 2-lea cuvint al zonei (N*40). Indexarea liniilor de text se face cu DI.

Structura Zona

Numar linii introduse

Index prima linie libera in zona

Linie 1

Linie 2

Linie 3

Deoarece folosim pentru simulare consola unui singur calculator vom stabili structura liniei de text care va contine:

NA - Numar de caractere asteptate

NR - Numar de caractere receptionate

NRT - Numar terminal 0,1,2 (numar user)

CDA - Comanda introdusa care poate fi A - afisare text introdus

Text - linie text de maxim 40 carctere I - introducere linie de text

S - Stop oprire lucru pentru utilizatorul curent

Structura liniei de la consola

BUF

NA

NR

NRT

CMD

Linie text (max 40 caractere)

Comanda (A-afisare,I-introducere,S- stop)

Numar terminal (nr user)

Numar caractere receptionate

Numar caractere asteptate

Deoarece liniile introduse sunt de lungime variabila, trebuie pastrata lungimea lor in zona de lucru. Pentru afisarea acestor linii s-a utilizat o macroinstructiune de afisare AFIS, care pune dupa ultimul caracter din fiecare linie semnul $, pentru ca restul de caractere pana la 40 sa nu se afiseze.

Pentru a putea calcula adresa fiecarei zone, care se va incarca in registru BX, s-a generat o tabela de adrese zone TZ. De aici adresa zonei se ia indexat cu numarul terminalului.

tz dd z1,z2,z3 ; adrese zone de date utilizator (far)

mov bh,0

mov bl,buf+2 ;nr terminal

and bl,0fh

shl bx,2 ;NT*4

lds ax,tz[bx] ;adresa zona

mov bx,ax

REENTR * Program reentrant de introducere si afisare texte (Lab8)

; structura buf NA - nr caractere asteptate

buf+1 NR - nr caractere receptionate

buf+2 TR - nr terminal

buf+3 c-da A-afisare, I-introducere, S-stop

buf+4 linie text, lung=40 caractere

.286

stiva SEGMENT stack ; segment stiva

dw 100

top equ $ ; virful stivei

stiva ENDS

Sd1 SEGMENT ; segment de date

tz dd z1,z2,z3 ; adrese zone de date utilizator (far)

mes db 10,13,'Introduceti nr utiliz,c-da (A,I),text ',10,13,'$'

db 10,13

buf db 40,0,45 DUP(0),'$' ; bufer receptie

z1 dw 0,4 ;nr linii si index

db 400 dup(0) ; max 10 linii*40 caractere

z2 dw 0,4

db 400 dup(0) ; zona date 2

z3 dw 0,4

db 400 dup(0) ; zona date 3

Sd1 ENDS

Z STRUC ;structura zona date utilizator

n dw 0 ;nr linii introduse

index dw 0 ;index linie libera

tx dw 40*10 dup(?) ;linii de text

Z ENDS

; Segment de code

prr  SEGMENT 'code'

assume cs:prr,ds:sd1,es:sd1,ss:stiva

afisare text cu lung pe octet 1 si urmat de CR,LF

afis MACRO buf1

pusha

mov ah,0

mov al,buf1 ;lungime

mov si,ax

mov word ptr buf1[si+1],0a0dh ;CR si LF

mov buf1[si+3],'$'

mov dx,offset buf1+1 ;inceput text

mov ah,9 ;afisare

int 21h

popa

ENDM

st1 label far

mov ax,sd1

mov ds,ax

mov es,ax

mov ax,stiva

mov ss,ax

mov sp,offset top

c1: mov ah,9

mov dx,offset mes ;afisare mesaj

int 21h

mov dx,offset buf ;asteptare mesaj

mov ah,10

int 21h

cmp buf+3,'s' ;terminat

jnz c2

mov ah,4ch ; sfarsit program

int 21h

c2: mov ch,0

mov cl,buf+1 ;nr caractere receptionate

inc cx ;se memoreaza si lungimea

mov bh,0

mov bl,buf+2 ;nr terminal

and bl,0fh

shl bx,2 ;NT*4

lds ax,tz[bx] ;adresa zona

mov bx,ax

cmp buf+3,'i' ;introducere

jnz c3

; Introducere rind text

mov di,bx ;inceput zona

add di,[bx+index] ;adresa rind liber

mov si,offset buf+1 ; adresa rind in bufer cu lung

rep movsb ;transfer rind in zona

inc [bx+n] ;nr inregistrari in zona

add [bx+index],40 ;index rind curent in zona

jmp c1

c3: cmp buf+3,'a' ; afisare text zona selectata

jnz c1

; Afisare text introdus

mov dx,[bx+n] ;nr linii text

mov si,bx ; SI=adresa zona

add si,4 ;prima linie

c4: mov cx,40 ;lungime

mov di,offset buf+1 ; adresa rind curent

rep movsb ; mutare rind in bufer

afis buf+1 ;afisare sir cu lung pe octet 1

dec dx ;contor linii

jnz c4 ;afisare rind urmator

jmp c1 ;dialog - Terminare prin S la dialog

prr  ENDS

END ST1



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1649
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved