Pomocy, mam przerobić program z asemblera.

0

Witam wszystkich, mam duży problem. Dostałem program na zaliczenie (z asemblera), muszę go tak przerobić aby punkt poruszał się po prostokącie i mam dodać komentarze, gdzie co jest wykonywane, a ja nic nie wiem z asemblera, próbowałem się poduczyć ale tego nie chwytam, proszę pomóżcie.

Mam taki kod, tam punkcik porusza sie po trójkącie a ma być prostokąt:

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,321
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ę skośną skierowaną w lewo
push cx
mov cx, dlugosc_lini

call Przelicz_wsp
gg:
sub x,319
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

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,50
mov pocz_x,160
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

Bardzo proszę o pomoc, bo sam nie dam rady !!!

0

Co roku ten sam problem. Trzeba zaliczyć asemblera i nikt nie ma o tym pojęcia... Eh... 1 semestr to za mało na liźnięcie asemblera.

Tak na oko, bo nie mam dostępu do dosa:

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

Naprawdę wielkie dzięki, programik działa.

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