Odbijająca się piłka

BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Witam,
Mam narysowaną piłkę w asemblerze i chcę aby się odbijała.
Ustawiam w zmiennej wartość w którym kierunku ma się poruszać, i w pętli sprawdzam wartość zmiennej i chcę wykonać skok do danej procedury. Wygląda to mniej więcej tak:

Kopiuj
 
	; 1 kieruek w lewo
        mov al,1
	mov [direction],al
	                                 
moveball:	
        ; tak nie wykonuje skoku                          
	mov bx,[direction]
	cmp bx,1
	je inLeft
	
        ; tak działa
	;call inLeft
	
	loop moveball

I przy sprawdzaniu wartości zmiennej powinno wykonać skok do funkcji ale go nie wykonuje co jest nie tak?

edytowany 1x, ostatnio: Bohun
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Zgaduje że twoje porównanie jest błędne. Domyślam sie nawet dlaczego. Najpierw do [direction] wrzucasz zawartość al więc zgaduje że direction to jest db czyli 1 bajt. A potem wczytujesz z [direction] do bx czyli czytasz 2 bajty! Więc jak to wreszcie jest? Albo w jednym albo w drugim miejscu jest błąd.

Na przyszłość: emu8086 do debugowania...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Ale nawet jak dam tak:

Kopiuj
 moveball:	                          
	mov bl,1
	cmp bl,1
	je inRight
	
	loop moveball

To mi nie działa a tu chyba porównanie jest dobre?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie wierzę. Ale nie ważne. Odpal to pod emu8086 i zobacz jak się ustawiają flagi po tym cmp i potem zobacz czy faktycznie ci nie skacze.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Jak dam skok do innej procedury to mi skacze, a do tej procedury inRight mi nie skacze

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

To pokaż więcej kodu. Co to jest ten inRight? Zwykła etykieta w kodzie? Jak daleko jest (bo skoki mają ograniczoną odległość...)?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0
Kopiuj
moveball:	                          
	mov al,1
	cmp al,1
	;je inLeft
	
	call inRight
	loop moveball
		
inLeft:	
	mov ax,[centerX]
	sub ax,10
	mov [centerX],ax
		
	mov ah, 0
	mov al, 13h
	int 10h
	
	call draw_ball
	ret

inRight:
	mov ax,[centerX]
	add ax,10
	mov [centerX],ax
		
	mov ah, 0
	mov al, 13h
	int 10h
	
	call draw_ball
	ret	
	
draw_ball:	
okrag:	
	push cx		; zachowanie licznika pętli w CX 
	;zmiana kąta
	fld qword [angle]
	fadd qword [angleDelta]
	fst qword [angle]
	
	; obliczenie współrzędnych odpowiedniego punktu
	fsincos
	fimul word [radius]
	fiadd word [centerX]
	fistp word [pointX]
	
	fimul word [radius]
	fiadd word [centerY]
	fistp word [pointY]	
	
	; wyświetlenie punktu	
	mov ah, 0Ch
	mov al, 2	; kolor
	mov bh, 0	; strona wideo
	mov cx, [pointX]
	mov dx, [pointY]
	int 10h
	
	pop cx
	loop okrag
	ret
 
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Tragedia! Jak robisz skoki za pomocą jmp to NIE wolno ci robić ret na końcu bo psujesz sobie stos. Jak chcesz robić ret to wołaj ZAWSZE przez call.
ret zdejmuje ze stosu adres powrotny ale jeśli skakałeś a nie robileś call na na stosie wcale tego adresu nie ma więc zdejmujesz losową wartość i potem tam skaczesz. To ci w ogóle działa?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

jak w moveball dam

Kopiuj
 call inRight 

to działa

edytowany 1x, ostatnio: Bohun
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No to teraz doczytaj sobie czym się różni call of skoków i czemu NIE WOLNO tego tak mieszać jak to własnie próbowałeś zrobić.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

to jak mam to zrobić?
Albo jak mam sprawdzić warunek i wykonać skok przez call?

edytowany 1x, ostatnio: Bohun
Akasei
wyślij mi cały kod, poprawie jak będę miał chęć, wklej tu lub do jakiegoś paste np. http://paste.wataha.net/
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Za pomocą etykietek oczywiście ;] Musisz zmontować takiego asemblerowego ifa

Kopiuj
cmp cośtam,cośtam
jne brak_calla
call cośtam
brak_calla:

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Dobra działa, a jak zrobić opóźnienie a raczej w tym wypadku przyśpieszenie bo w tej chwili zmieniam pozycje o 10 pixeli ale piłka porusza się dość wolno i nie płynnie czym to jest spowodowane bo przecież pętle powinny się wykonywać bardzo szybko?

edytowany 1x, ostatnio: Bohun
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A pod co to piszesz? Bo dużo szybciej byłoby zapalać punkty pisząc po pamięci a nie wołając przerwania.

edit: Jak sobie włączysz tryb graficzny

Kopiuj
	mov	al,13h  ;320x200 punktow 256 kolorow
	mov	ah,0
	int	10h

To mozesz malować tak:

Kopiuj
zapal_punkt:
	mov	ax,0a000h  ; pamięć obrazu
	mov	es,ax
	mov	ax,word ptr [y]
	mov	bx,320
	mul	bx	;dx:ax = ax * bx
	add	ax,word ptr [x]   ;ax = 320*y +x
	mov	bx,ax
	mov	al,byte ptr [kolor]
	mov	byte ptr es:[bx],al

i namalujesz punkt w (x,y) o kolorze kolor.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Pisze pod emulator Dosa

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No to pod dosboxem spokojnie możesz sobie malować pisząc po pamięci.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Dałem ten kod co napisałeś i wywala takie błedy w tych linijkach co jest "ptr":

Kopiuj
 comma colon decorator or end of line expected after operand
edytowany 1x, ostatnio: Bohun
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie napisałeś jaki to asembler... Wyrzuć te word ptr / byte ptr i tyle (tylko te słowa kluczowe! nie całe linijki)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

No wywaliłem ale w ostatniej linii dalej jest błąd

Kopiuj
 mov es:[bx],al 

invalid combination of opcode and operands

edytowany 1x, ostatnio: Bohun
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

To napiszesz łaskawie JAKI to asembler? Czy liczysz na to ze napisze ci kod pod wszystkie możliwe? Jeśli to NASM to zamiast byte ptr daj byte


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Tak to NASM, dałem tak

Kopiuj
  mov    byte es:[bx],al 

i dalej ten sam błąd

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A jak dasz

Kopiuj
 mov    byte [es:bx],al 

?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Tak działa.

A da się bardziej przyśpieszyć bo dalej troch za wolno się porusza piłka?
Bo teraz w pętli wykonuje ten kod i zapalam po jednym pixelu.

edytowany 2x, ostatnio: Bohun
Shalom
Uwielbiam takie głupie różnice pomiędzy różnymi asemblerami ;] Jakby nie mogli się dogadać i zrobić jednakowo, szczególnie że to są kosmetyczne różnice...
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ja bym w takim razie sprawdził co w tym kodzie się tak długo wykonuje pod jakimś debugerem / profilerem. Przypuszczam że to nie rysowanie jest problemem tylko jakieś inne operacje które wykonujesz.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 9 lat
  • Postów:99
0

Wydaje mi się ze rysowanie okręgu, czyli wyliczanie współrzędnych punktów na podstawie środka okręgu czyli jakieś 150 punktów. A jak modę to sprawdzić w turbo debugerze?

edytowany 1x, ostatnio: Bohun
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Pogooglaj za jakimś profilerem. Ja zgaduje że to wyliczanie współrzednych każdego punktu od początku może stanowić problem. Nie da się prościej - tak wektorowo? Liczysz współrzędne raz a potem przesuwasz sobie każdy piksel o 1 w lewo / prawo zamiast obliczać wszystko znowu od zera. Nie da rady tak?

Trochę tak jak @cepa zrobił tutaj: http://lukasz.cepowski.com/projects/snake chociaż on sobie to juz całkiem ułatwił bo "namalował" sobie cały segment i potem tylko wrzuca go na ekran.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)