GarajScript - Cuvinte cheie
Acum asemanarea cu limbajul de asamblarea va fi acum evidenta.
Exista 5 variabile predefinite:
ax, bx, dx : fara un rol special special, stocheaza date
cx : este folosind de instructiunea LOOP
ip : contor care indica instructiunea actuala, are rol informativ.
Sa analizam acum cele 25 de cuvinte cheie:
mov var, var/valoare - atribuie variabilei o anumita valoare.
Exemplu:
; se atrbuie un sir de caracter
mov ax, "salutare" ; dupa rulare ax = "salutare"
; se atribuie lui bx, ax
mov bx, ax ; dupa rulare bx = "salutare"
|
push var/valoare - adauga in stiva o valoare
Exemplu:
mov ax, "salutare" ; atribuie un sir
push ax ; salveaza valoarea
push "adauga un text"
|
pop var - extrage ultima valoare introdusa in stiva
Exemplu:
mov ax, "salutare" ; atribuie un sir
push ax ; salveaza valoarea
push "un text" ; adauga un text
pop ax ; dupa executie ax = "un text"
|
add var, var/valoare - aduna sau concateneaza depunand rezultatul peste prima variabila
Exemplu:
mov ax, "salutare"
mov bx, " cititorule"
add ax, bx ; concateaneaza sirurile ax = "salutare cititorule"
mov ax,1
mov bx,2
add ax,bx ; aduna numere ax = 3
|
sub var, var/valoare - scade din primul numar pe al doilea, nu are nici un efect pentru string-uri
Exemplu:
mov ax,78
mov bx,2
sub ax,bx ; scade numerele ax = 76
|
mul var, var/valoare - inmulteste numerele
Exemplu:
mov ax,10
mov bx,2
mul ax,bx ; ax = 20
|
div var, var/valoare - imparte numerele
Exemplu:
mov ax,30
mov bx,2
div ax,bx ; ax = 15
|
cmp var, var/valoare - compara numerele si seteaza indicator intern pentru instructiuni de salt
Exemplu:
mov ax,78
mov bx,2
cmp ax,bx ; sunt diferite
|
inc var - incrementeaza
Exemplu:
mov ax,1
inc ax ; ax = 2
|
dec var - decrementeaza
Exemplu:
mov ax,5
dec ax ; ax = 4
|
jmp label_name - executa salt neconditionat
Exemplu:
jmp exit
mov ax," test" ; instructiunea este ignorata
label exit
|
ecall nume_functie - apeleaza o functie externa
Exemplu:
mov ax," test"
push ax ; paseaza parametru folosind stiva
ecall echo ; afiseaza mesaj
|
ja label_name - executa salt daca la ultima comparare primul parametru a fost mai mare decat cel de al doilea
Exemplu:
mov ax,10
mov bx,5
cmp ax, bx
ja undeva ; executa salt ax > bx
|
jae label_name - executa salt daca la ultima comparare primul parametru a fost mai mare sau egal decat cel de al doilea
Exemplu:
mov ax,10
mov bx,5
cmp ax, bx
jae undeva ; executa salt ax >= bx
|
jb label_name - executa salt daca la ultima comparare primul parametru a fost mai mic decat cel de al doilea
Exemplu:
mov ax,10
mov bx,50
cmp ax, bx
jb undeva ; executa salt ax < bx
|
jbe label_name - executa salt daca la ultima comparare primul parametru a fost mai mic sau egal decat cel de al doilea
Exemplu:
mov ax,10
mov bx,50
cmp ax, bx
jbe undeva ; executa salt ax <= bx
|
je label_name - executa salt daca la ultima comparare primul parametru a fost egal cu cel de al doilea
Exemplu:
mov ax,10
cmp ax, 10
je undeva ; executa salt ax = 10
|
jne label_name - executa salt daca la ultima comparare primul parametru nu a fost egal cu cel de al doilea
Exemplu:
mov ax,10
cmp ax, 15
jne undeva ; executa salt ax != 15
|
var name - aloca spatiu pentru o variabila
Exemplu:
var my_var
mov my_var, "my_text"
|
label name - asociaza un nume cu linia urmatoare
Exemplu:
mov ax,5
label start
inc ax
jmp start ; un loop infinit
|
loop label_name - executa salt cat timp cx!=0 si il decrementeaza
Exemplu:
mov cx,5
mov ax,20
label start
inc ax
loop start ; executa de 5 ori
|
call proc_name - ruleaza o functie definita in script
Exemplu:
proc test ; defineste o functie
mov ax," functie apelata"
push ax
ecall echo
ret ; revine la punctul in care a fost apelata functia
call test ; este apelata functia si dupa terminarea ei se revine aici
mov ax,20
|
ret - urmeaza dupa un proc si marchea sfarsitul codului pentru aceasta
Exemplu:
proc test ; defineste o functie
mov ax," functie apelata"
push ax
ecall echo
ret ; revine la punctul in care a fost apelata functia
call test ; este apelata functia si dupa terminarea ei se revine aici
mov ax,20
|
proc proc_name - defineste o functie codul fiind terminat cu un ret
Exemplu:
proc test ; defineste o functie
mov ax," functie apelata"
push ax
ecall echo
ret ; revine la punctul in care a fost apelata functia
call test ; este apelata functia si dupa terminarea ei se revine aici
mov ax,20
|
hlt - intrerupe executia scriptului
Exemplu:
mov ax,"un test"
hlt ; executia scriptului se incheie aici
push ax
ecall echo ; nu este executata
|
Acestea sunt toate cuvintele cheie suportate de aceasta versiune. Efectueaza
doar operatii de baza, operatii mai complexe putand fi realizate apeland
functii externe folosind ecall. Sa vedem un program care chiar
face ceva si foloseste cuvintele cheie prezentate aici. Vom calcula
factorialul unui numar prin doua metode: recursiv si iterativ.
Factorial:
; (c) GarajCode
; GS versiunea 0.0.1
# trece pe linie noua
proc endl
mov ax,"endl"
push ax
ecall echo
ret
# calculeaza factorial iterativ
proc fact_iterativ
mov bx,1
mov cx,2
inc ax
label factst
mul bx,cx
inc cx
cmp cx,ax
jne factst
mov ax,bx
ret
# calculeaza factorial recursiv
proc fact_rec
mul bx,ax
dec ax
cmp ax,1
je end
call fact_rec
label end
ret
#
# aici incepe executia codului
#
push "(c) GarajCode"
ecall echo
call endl
push "5 factorial : "
ecall echo
mov ax,5 ; calc 5!
mov bx,1
call fact_rec
push bx
ecall echo ; afiseaza rezultatul
call endl
ecall getch ; asteapta o tasta
|
Acestea fiind spuse putem trece la prezentarea functiilor standard incluse.
(c) GarajCode
|