BluePink BluePink
XHost
Oferim servicii de instalare, configurare si monitorizare servere linux (router, firewall, dns, web, email, baze de date, aplicatii, server de backup, domain controller, share de retea) de la 50 eur / instalare. Pentru detalii accesati site-ul BluePink.

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