opis programu ...

0

Sorry wszystkich za to że zwracam się do was z tak banalnym, a pracochłonnym problemem jakim jest opisanie linijka po linijce poniższego kodu programu w asemblerze. Ja nie mam pojęcia co tam się dzieje i nie potrafię tego opisać, a muszę oddać dokładnie opisany projekt. Jeżeli ktoś może mi pomóc, to z góry wielki dzięki i proszę nie odsyłajcie mnie do książek bo dużo mi to nie pomoże.

ASSUME CS:code, SS:DSTACK, DS:data

DSTACK segment stack
db 64 DUP ("stack")
DSTACK ENDS

data segment

    dlugosc_lini dw 0
    x dw 0
    kolor db 13

    pocz_x dw 0
    pocz_y dw 0

    szer_wyp dw 0
    wys_wyp dw 0

data ENDS

code segment

Punkt PROC ; Procedura rysuje punkt
push dx
push di

    mov dl, kolor
    mov di, x
    mov es:[di+bx],dl

    pop di
    pop dx
    ret

Punkt ENDP

Przelicz_wsp PROC ; Przelicza współrzędne punktu
push cx
push ax

    mov ax, pocz_x
    mov x,ax
    mov cx, pocz_y
    sss:
    add x, 320d
    loop sss

    pop ax
    pop cx
    ret

Przelicz_wsp ENDP

Plamka PROC ; procedura oczekująca na powrót plamki w pionie
mov dx,3dah
ram1:
in al,dx
test al,8
jnz ram1
ram2:
in al,dx
test al,8
jz ram2
ret
Plamka ENDP

Prawy_bok PROC ; Rysuje linię skośną skierowaną w prawo
push cx
mov cx, dlugosc_lini

    call Przelicz_wsp
    ff:
    add x,320 ;dodajemy 320 do x czyli jakby 1 do y, ze wzgledu na szerokosc ekranu rowna 320
    mov kolor, 10
    call Plamka
    call Punkt

    mov kolor,0
    call Plamka
    call Punkt

    loop ff
    pop cx
    ret

Prawy_bok ENDP

Lewy_bok PROC ; Rysuje linię skierowaną w gore
push cx
mov cx, dlugosc_lini

    call Przelicz_wsp
    gg:
    sub x, 320  ;ekran ma 320 punktow szerokosci, wiec jezeli odejmiemy 320 od x, to tak, jakbysmy odjeli 1 od y
    mov kolor,11
    call Plamka
    call Punkt

    mov kolor, 0
    call Plamka
    call Punkt

    loop gg
    pop cx
    ret

Lewy_bok ENDP

Podstawa PROC ; Rysuje linię poziomą skierowaną w lewo
mov cx, dlugosc_lini

    call Przelicz_wsp
    ee:
    dec x
    mov kolor, 12
    call Plamka
    call Punkt

    mov kolor, 0
    call Plamka
    call Punkt
    loop ee
    ret

Podstawa ENDP

Gora PROC ; Rysuje linię poziomą skierowaną w prawo
mov cx, dlugosc_lini

    call Przelicz_wsp
    ee:
    inc x
    mov kolor, 12
    call Plamka
    call Punkt

    mov kolor, 0
    call Plamka
    call Punkt
    loop ee
    ret

Gora ENDP

Start:
mov ax,data
mov ds,ax ; rejestr DS wskazuje nam segment z naszymi danymi

mov ax,0013h ;uruchamia tryb graficzny 320*240
int 10h
mov ax,0A000h
mov es,ax

pocz:
mov kolor,28

mov dlugosc_lini,100
mov pocz_x,110
mov pocz_y,100
call Gora

mov dlugosc_lini,50
mov pocz_x,210
mov pocz_y,100
call Prawy_bok

mov dlugosc_lini,100
mov pocz_x,210
mov pocz_y,150
call Podstawa

mov dlugosc_lini,50
mov pocz_x,110
mov pocz_y,150
call Lewy_bok

sprawdz_klawisz:
push es ;sprawdzamy czy nie został naciśnięty dowolny klawisz
xor ax,ax
mov es,ax
mov ax,es:[41Ah]
cmp ax,es:[41Ch]
pop es
jz pocz

mov ax,0003h ;jeżeli został naciśnięty klawisz to kończymy program
int 10h

mov ax,0003h ;wraca do trybu dosowego
int 10h

mov ax,4c00h ;zakończ
int 21h

code ENDS
end Start

0
ASSUME CS:code, SS:DSTACK, DS:data ; tworzy nazwy dla rejestrow segmentowych

DSTACK segment stack
db 64 DUP ("stack") ;tworzy stos o wielkosci 64 Kb
DSTACK ENDS

data segment        ;segment danych

        dlugosc_lini dw 0 ;rezerwacja zmiennych
        x dw 0
        kolor db 13

        pocz_x dw 0
        pocz_y dw 0

        szer_wyp dw 0
        wys_wyp dw 0
data ENDS

code segment

Punkt PROC                        ; Procedura rysuje punkt
        push dx  ;odloz na stos zawartosc rejestru dx
        push di ;pobierz ze stosu do rej di (czyli to co bylo w dx)

        mov dl, kolor ;do rej dl wartosc zmiennej kolor (czyli 13)
        mov di, x  ;do di wartosc zmiennej x
        mov es:[di+bx],dl  do komorki pamieci w segmencie w es, offsetu [di+si] 
        pop di ; di na stos
        pop dx ; pobierz ze stosu do dx
        ret  powrot z procedury
Punkt ENDP

Przelicz_wsp PROC                ; Przelicza współrzędne punktu
        push cx ; wartosc z CX na stos
        push ax ; ze stosu do ax

        mov ax, pocz_x  ;laduj do ax wartosc zmiennej pocz_x
        mov x,ax ;laduj do zmiennej x zawartosc rej ax
        mov cx, pocz_y  ; laduj do cx zaw zmiennej pocz_y
        sss:  ;nazwa etykiety
        add x, 320d  ; dodaj do x wartosc
        loop sss ;wroc do sss - petla sie zakonczy jezeli w CX bedzie wartosc zero

        pop ax ;zaw rej ax na stos
        pop cx ;pobierz ze stosu do cx
        ret ;powrot z procedury
Przelicz_wsp ENDP

Plamka PROC                        ; procedura oczekująca na powrót plamki w pionie
        mov dx,3dah  ;do dx wartosc
ram1: etykieta
        in al,dx  do danej al przekazana zostanie wartosc z poru o adresie w dx
        test al,8 sprawdza czy 8 bit jest ustawiony (czy jego wartosc =1)
        jnz ram1; jesli nie to skacze do etykiety ram1
ram2: ;etykieta
        in al,dx ; to samo co w ram1
        test al,8
        jz ram2 ; jezeli jest ustawiony to skacz do ram 2
        ret
Plamka ENDP

Prawy_bok PROC                        ; Rysuje linię skośną skierowaną w prawo
        push cx ;zaw rej cx na stos
        mov cx, dlugosc_lini ; do cx zmienna dlugosc_linii

        call Przelicz_wsp ;wywolanie procedury Przelicz_wsp
        ff: ;etykieta
        add x,320 ;dodajemy 320 do x czyli jakby 1 do y, ze wzgledu na szerokosc ekranu rowna 320
        mov kolor, 10 ;do zmiennej ladujemy 10
        call Plamka ; wywolanie procedury Plamka
        call Punkt ; wywolanie procedury

        mov kolor,0 ; do zmiennej kolor lad. 0
        call Plamka; wyw. proc.
        call Punkt ; to samo

        loop ff ;petla tak dlugo skacze do etykiety ff dopoki w CX nie pojawi sie zero
        pop cx ; zawartosc cx na stos
        ret ;powrot z procedury
Prawy_bok ENDP


Lewy_bok PROC       ;procedura                 ; Rysuje linię skierowaną w gore
        push cx  ;zaw cx na stos
        mov cx, dlugosc_lini ; do cx zaw zmiennej

        call Przelicz_wsp ;procedura
        gg: ;etykieta
        sub x, 320  ;ekran ma 320 punktow szerokosci, wiec jezeli odejmiemy 320 od x, to tak, jakbysmy odjeli 1 od y
        mov kolor,11 ;do zmiennej wartosc 11
        call Plamka ; wywolanie procedury
        call Punkt; wyw. proc.

        mov kolor, 0 ; do zmiennej 0
        call Plamka ; wyw. proc.
        call Punkt; wyw. proc

        loop gg ; petla
        pop cx ;pobierz ze stosdu do cx
        ret ; powrot z procedury
Lewy_bok ENDP

Podstawa PROC                        ; Rysuje linię poziomą skierowaną w lewo
        mov cx, dlugosc_lini ; do cx zaw zmiennej 

        call Przelicz_wsp ;wywolanie procedury
        ee: ;etykieta
        dec x ; zmniejsz x o jeden
        mov kolor, 12 ;do zmiennej kolor laduj 12
        call Plamka ;wywolanie procedury
        call Punkt ; wyw.proc.

        mov kolor, 0 ; do kolor laduj 0
        call Plamka ; wyw.proc.
        call Punkt; wyw.proc
        loop ee ;petla
        ret ;powrot
Podstawa ENDP

Gora PROC                        ; Rysuje linię poziomą skierowaną w prawo
        mov cx, dlugosc_lini ;do cx wartosc zmiennej dlugosc_linii

        call Przelicz_wsp ;wyw proc
        ee: ;etykieta
        inc x ;zmniejsz x o jeden
        mov kolor, 12; do kolor 12
        call Plamka; wyw. proc
        call Punkt; wyw. proc.

        mov kolor, 0 ;do zmiennej laduj zero
        call Plamka ;wyw. proc
        call Punkt;wyw proc
        loop ee
        ret ;powrot z proc
Gora ENDP




Start:
mov ax,data ; do ax segment danych
mov ds,ax   ;i to do ds                   ; rejestr DS wskazuje nam segment z naszymi danymi

mov ax,0013h                        ;uruchamia tryb graficzny 320*240
int 10h ;
mov ax,0A000h
mov es,ax; do es zawartosc ax

pocz:
mov kolor,28  ;do kolor 28

mov dlugosc_lini,100  ;do zmienne lad 10
mov pocz_x,110 ;laduj do zmiennej 110
mov pocz_y,100 ;jak powyzej
call Gora ;wywolanie procedury

mov dlugosc_lini,50 ; ladoanie do zmiennej wartosc
mov pocz_x,210; jak wyzej
mov pocz_y,100; jak wyzej
call Prawy_bok; wyw. proc.

mov dlugosc_lini,100 ;ladowanie do zmiennej
mov pocz_x,210;jak wyzej
mov pocz_y,150; jak wyzej
call Podstawa ;wyw. proc.

mov dlugosc_lini,50;wartosc do zmiennej
mov pocz_x,110 ; j.w.
mov pocz_y,150;j.w.
call Lewy_bok; wyw. proc


sprawdz_klawisz: ;etykieta
push es           ;sprawdzamy czy nie został naciśnięty dowolny klawisz
xor ax,ax ;zerowanie rej ax
mov es,ax ;do es wartosc 0
mov ax,es:[41Ah] ;do ax zawartosc komorki z segmentu o adrw es i offsecie 41AH
cmp ax,es:[41Ch] ;porownanie wartosc z rej i komorki pamieci
pop es; wes na stos
jz pocz ; jesli z=0  skocz do etykiety pocz


mov ax,0003h                        ;jeżeli został naciśnięty klawisz to kończymy program
int 10h


mov ax,0003h                        ;wraca do trybu dosowego
int 10h

mov ax,4c00h                        ;zakończ
int 21h


code ENDS
end Start

mam nadzieję, że nie zrobiłam żadnego błędu, bo pod koniec wszystko się niemalże powtarzało. Warto się tego nauczyć, to nie jest trudne :).
Pozdrawiam!

//polecam używać znaczników <asm> - M

0

Naprawdę ogromne dzięki za odpowiedź. pozdrawiam, Jarek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1