CATEGORII DOCUMENTE |
Subprogramele reentrante contin cod pur care nu se modifica in timpul rularii:
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:
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 |
Vizualizari: 1670
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved