Komentowana treść: Kurs asemblera 68k - część 1
[#1] Re: Kurs asemblera 68k - część 1
dopiszcie ze chodzi o assemblera 68k bo asseblerów jak mrówków
[#2] Re: Kurs asemblera 68k - część 1
Bardzo fajne podejście i jak zawsze w przypadku Asmana - wiedza przekazana w ciekawy sposób. Nie wiedziałem m.in. o tym poleceniu "?" Asm-One, a wygląda na bardzo pożyteczne.

Ja pochodzę ze szkoły, która mówi, że praca kodera to niejako powołanie. Trzeba lubić matematykę, cyfry i mnemoniki.

Na koniec chciałem poinformować, że mój kurs asemblera w Amigazynie od nowego roku będzie kontynuowany w nieco luźniejszej formie jako "Kącik programistyczny" jako pogadanka na temat asemblera. Mam nadzieję, że będzie przez to łatwiejszy w odbiorze. Doszły mnie słuchy, że mój kurs jest zbyt trudny.

Ostatnia aktualizacja: 30.12.2015 12:13:18 przez Hexmage960
[#3] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #2

Skoro jest "zbyt trudny" to chyba się nim zainteresuję :)
[#4] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #2

Czy osoby zgłaszające uwagi do stopnia trudności kursu sprecyzowały co mają na myśli?

Kurs może być zbyt trudny, bo:
- porusza zbyt zaawansowane zagadnienia,
- porusza podstawy ale w zbyt trudnej do zrozumienia formie.

To jest różnica.

Ostatnia aktualizacja: 30.12.2015 13:09:33 przez MDW
[#5] Re: Kurs asemblera 68k - część 1

@MDW, post #4

@MDW

Raczej punkt drugi. Mój kurs opisuje podstawowe zagadnienia asemblera takie, jak: rejestry procesora, polecenia, tryby adresowania, znaczniki, operacje logiczne. Opisuję też program Asm-One i podaję trochę przykładów. Żadnych zbytnio zaawansowanych zagadnień jak dla "zielonego". Wszystkie te rzeczy trzeba znać, by programować w asemblerze. Być może zbyt "gęsto" opisuję to w moim kursie.

@Davka

Było by mi bardzo miło pozyskać nowego czytelnika. Byłbym rad, gdybyś stał się nowym koderem :) Zacznij od Amigazynu #1. W numerze bieżącym - grudniowym wyjątkowo nie ma odcinka mojego kursu, bo jest tam mój inny artykuł, ale od nowego roku cykl będzie kontynuowany. Tak jak wspomniałem, będzie w formie "Kącika", czyli jakiś jeden wybrany temat związany z asemblerem szczegółowo omówiony w każdym numerze. Będzie na pewno też więcej praktycznych przykładów. Myślę, że mój kurs dzięki temu będzie prostszy i ciekawszy.

No, ale Asman jest bohaterem tego newsa, więc proponuję wątek odnośnie mojego kursu przenieść gdzie indziej.

Ostatnia aktualizacja: 30.12.2015 13:30:03 przez Hexmage960
[#6] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #5

Fajnie by było zobaczyć jak w asm zrobić konkretne rzeczy jak kontrola stanu joy'a i przycisków , zapis odczyt plików, obsługa bibliotek systemowych.

Tak w ogóle to warto skupić się na tym co daje nam już sam system operacyjny gotowego do wywołania i jak z tego skorzystać.

A może lepiej kurs asm dla osób które chociaż trochę znają C albo Basica.

Ostatnia aktualizacja: 30.12.2015 14:19:36 przez pong777
[#7] Re: Kurs asemblera 68k - część 1
Kurs jaki by się przydał to wyczerpujący opis wielu narzędzi asm,c itd., środowiska pracy, przede wszystkim organizacji środowiska pracy amigowego programisty w amigowym systemie pod kątem różnych projektów... Kurs samego języka powinien być niemal kopią opisu manuali w wersji skróconej, w przypadku asm; opis instrukcji, trybów adresowania, dosłownie kilka stronic (z linkami po szczegóły), rozrzucenie na jeden odcinek arytmetyki bitowej przypomina mi nieco kursy z lat 80 i 90. Drugi zaawansowany kurs związany z asm powinien moim zdaniem zawierać; użyteczne gotowe rutynki z opisem (także linki do takowych itp.), użyteczne szablony kodu asm, wyjaśnienie metod projektowania programów asm na różnych przykładach itp. To właściwie można potem ciągnąć w n razy X odcinków.
[#8] Re: Kurs asemblera 68k - część 1

@sigma2pi, post #7

użyteczne gotowe rutynki z opisem (także linki do takowych itp.)

Proszę bardzo: http://teleinfo.pb.edu.pl/krashan/articles/pierwiastkowanie
[#9] Re: Kurs asemblera 68k - część 1

@Krashan, post #8

Na mojej stronie można znaleźć wiele gotowych i przetestowanych procedur asemblera dla procesorów 68000 i 6502 oraz mikrokontrolerów AVR.
[#10] Re: Kurs asemblera 68k - część 1

@RomanWorkshop, post #9

Popatrzyłem na kod procedury LenStr i tak się zastanawiam czy nie prościej jest odpuścić sobie zwiększanie rejestru D1 i po wyjściu z pętli po prostu odjąć od aktualnej zawartości A0 adres początku łańcucha. Kod prawdopodobnie będzie szybszy i zniknie ograniczenie do 255 znaków.
[#11] Re: Kurs asemblera 68k - część 1
Przeczytałem odcinek. Moim zdaniem, wiadomo, zawsze lepiej mieć o jeden kurs więcej, niż o jeden mniej. Ale żeby on wnosił jakąś nową jakość, w stosunku do tych wszystkich innych, jakie napisano wcześniej, to nie mogę powiedzieć.
[#12] Re: Kurs asemblera 68k - część 1

@Krashan, post #10

Zgadza się byłoby chyba trochę szybciej, ale potrzebny byłby drugi rejestr adresowy, a tak mamy wynik w rejestrze danych. Ograniczenie do 255 znaków można ominąć nie zwiększając rozmiaru kodu - wystarczy zamiast instrukcji "addq.b #1,D1", dać "addq.w #1,D1" (do 65535 znaków) lub "addq.l #1,D1" (maks. 4294967295 znaków).
[#13] Re: Kurs asemblera 68k - część 1

@RomanWorkshop, post #12

@RomanWorkshop

4 cykle na każdym sprawdzanym znaku to w przypadku dłuższych ciągów daje konkretną wartość. To co zaproponował Krashan jest: szybsze , nie ma ograniczenia do 255 znaków i kod dalej jest ładny. I nie potrzebujesz drugiego rejestru adresowego. W zależności od tego czy wynik ma być w rejestrze adresowym czy nie to potrzeba będzie wtedy (bądź nie) dodatkowej instrukcji neg.l dx.

@pong777
Aby zobaczyć konkretne rzeczy to trzeba "przejść" przez podstawowe rzeczy, czyli trochę się zaprzyjaźnić z asemblerem 68k + znać bebechy amigi.

@Krashan
Kurs z całą pewnością nie wnosi nić nowego dla kogoś kto widział inne/podobne kursy. Ale dzięki za tą uwagę, zmusza mnie to do myślenia.
[#14] Re: Kurs asemblera 68k - część 1

@asman, post #13

I nie potrzebujesz drugiego rejestru adresowego.

Będzie szybszy, to wiem. Chodzi mi o to, że gdzieś musi być zachowany początkowy adres ciągu, a później musi być on odjęty od adresu bajtu $00 w ciągu. Dlatego też te wartości muszą znajdować się w dwóch rejestrach. Nie kumam po co ten neg.l dx?
[#15] Re: Kurs asemblera 68k - część 1

@RomanWorkshop, post #14

Ja też mam pewną uwagę odnośnie Twojej procedury liczenia długości ciągu. Mianowicie instrukcja:

moveq #-1,d0

obecna w Twoim kodzie ustawia wszystkie bity rejestru d0 na 1. Chodzi o to, że operacja dodawania add operuje na liczbach ze znakiem. Twoja procedura zadziała bo efektem dodawania do wartości $7F (127) będzie wartość $80 (-128) oraz przepełnienie, jednakże warto mieć na uwadze znak i użyć nie moveq #-1,d0, ale takich dwóch instrukcji:

moveq #0,d0
move.b #-1,d0

Jest to bardziej przyjazne rozwiązanie. W ten sposób jeśli użytkownik będzie chciał użyć wartości zwróconej przez Twoją funkcję np. do dodania jej do innej wartości 16-bitowej napisze:

add.w d0,d1

Otrzyma poprawny wynik. W twojej obecnej funkcji otrzyma wynik niepoprawny, bo w drugim bajcie licząc od prawej są niechciane jedynki. Zauważ, że rozwiązanie w postaci:

ext.w d0

zadziała źle dla liczb ze znakiem (czyli ciągów o długości większej niż 127). To tyle odnośnie moich spostrzeżeń.
[#16] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #15

Jeżeli już się czepiamy detali:

1. Operacja dodawania operuje zarówno na liczbach ze znakiem jak i bez znaku – to tylko kwestia interpretacji samej liczby i flag CCR.

2. Skoro w rejestrze będzie $FFFFFFFF, to instrukcja ADDQ.B będzie dodawała do $FF (-1), a nie do $7F.

3. Jeżeli interpretujemy ten bajt licznika jako liczbę bez znaku to oczywiście, że nie możemy rozszerzać instrukcją EXT.W, bo ona jest do liczb interpretowanych jako ze znakiem. Dla liczby bez znaku zamiast EXT.W robimy ANDI.W #$00FF.

4. Jeżeli wiemy, że będziemy używać wyniku jako liczbę 16- albo 32-bitową, to od razu można używać ADDQ.W albo ADDQ.L i po kłopocie. Co prawda nie wiem, czy nie są wolniejsze od ADDQ.B na 68000, bo na 020 i wyżej to wątpię.

5. Moja propozycja z odjęciem od A0 adresu początku łańcucha likwiduje wszystkie powyższe dylematy .
[#17] Re: Kurs asemblera 68k - część 1

@asman, post #13

@Asman

Kurs z całą pewnością nie wnosi nić nowego dla kogoś kto widział inne/podobne kursy. Ale dzięki za tą uwagę, zmusza mnie to do myślenia.

Uściślając, do samej treści wiele nowego wnieść się nie da, wszak to ten sam AsmOne i ten sam M68k. Natomiast co do formy, to odniosłem wrażenie, że powtarzają się wady innych kursów. Konkretnie chodzi mi o nieco chaotyczne przeskakiwanie z zagadnienia na zagadnienie. W jednej chwili piszesz o komendzie AsmOne, a za chwilę o ręcznej konwersji między systemami liczbowymi, a potem znów wracasz do poleceń programu, albo przeskakujesz na operatory. Tekstu jest sporo i aż się prosi o podział na podrozdziały z tytułami, wtedy też łatwiej byłoby uporządkować i jakoś ustawić po kolei poruszane zagadnienia. Tekstu jest też sporo ze względu na gawędziarski (a chwilami wręcz rozwlekły) styl pisania. Co prawda sam tak często piszę, ale po przeczytaniu swojej twórczości staram się ograniczać, zwięzłość w pisaniu kursów i artykułów bywa zaletą dla czytelnika. Czasem też warto zamiast grzmocić akapity popełnić jakiś rysunek.

Być może moja krytyka jest przesadzona, bo nie da się ukryć, że piszę to z pozycji osoby nieźle znającej asembler M68k, AsmOne może akurat mniej, bo używałem głównie DevPaca. Opinie osób, które faktycznie asemblera dopiero poznają, będą z pewnością bardziej miarodajne.
[#18] Re: Kurs asemblera 68k - część 1

@Krashan, post #16

Tak, zdecydowanie Twój sposób będzie najszybszy. Nawet o nim nie pomyślałem, bo tylko przełożyłem algorytm, którego używałem na 8-bitowcach na asembler procesora 68000, zapominając o jego 32-bitowych rejestrach adresowych.

4. Instrukcje addq.b i addq.w wykonują się w 4 cyklach, a addq.l już w 8 cyklach.
[#19] Re: Kurs asemblera 68k - część 1

@Krashan, post #16

2. Skoro w rejestrze będzie $FFFFFFFF, to instrukcja ADDQ.B będzie dodawała do $FF (-1), a nie do $7F.

Mi chodziło o przypadek, gdy ciąg jest większy niż 127 znaków. Wtedy nastąpi przepełnienie (znacznik Overflow) i wynik nie będzie mógł być poprawnie wyrażony w arytmetyce ze znakiem. W przypadku gdy dodamy 1 do $FF (bajt) to w arytmetyce ze znakiem będzie to znaczyło to samo, co dodanie wartości 1 do liczby -1. Wynik będzie poprawny i równy 0 (nie nastąpi przepełnienie). Oczywiście w tym przypadku zostanie zapalony znacznik przeniesienia Carry.

W moich uwagach sugerowałem m.in., by kod był bardziej spójny. Jeśli na wstępie Roman używa własności, że 1 dodane do -1 daje 0, to powinien być konsekwentny i stosować dalej tą konwencję. Podałem też, że polecenie MOVEQ #-1,D0 a później dodawanie do bajtu niesie za sobą konsekwencje.

Rozwiązanie z odejmowaniem rejestrów adresowych jest najlepsze. Mimo to warto mieć na uwadze rzeczy, o których wspominam oraz trzymać się jednej konwencji, bo może to być źródło błędów.
[#20] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #19

Jest oczywiste, że zliczona liczba znaków może być tylko dodatnia, bo ciąg nie może mieć np. -15 znaków. Wynikiem tej prostej procedury może być wartość 0 lub więcej znaków, czyli nie wartość ze znakiem (signed). Nie za bardzo rozumiem, jakiej konwencji miałbym się trzymać i ją stosować? To, że rejestr się przepełnia i zeruje, to jest normalne zachowanie sprzętu, a nie konwencja programistyczna.
[#21] Re: Kurs asemblera 68k - część 1

@RomanWorkshop, post #20

To, że rejestr się przepełnia i zeruje, to jest normalne zachowanie sprzętu, a nie konwencja programistyczna.

Możesz wykorzystywać ten fakt że $7F+1=$80, lecz komputer interpretuje najwyższy bit jako bit znaku. Oznacza to, że jeśli Twoja procedura obliczy wartość w bajcie zaś użytkownik Twojej funkcji zapragnie dodać tą liczbę do jakiejś innej, powiedzmy 16-bitowej napotka na problem. Twoja funkcja powinna zadbać o to, by wynik był w pełni poprawny i sama na końcu rozszerzyć liczbę za pomocą komendy EXT lub zamaskować niechciane bity za pomocą ANDI, by użytkownik tym się już nie martwił.

Wykorzystujesz fakt, że $FF+1=$100, czyli dobrze - rejestr zostanie wyzerowany. Akurat tu myślałem, że raczej chodzi o to, że -1+1=0. Nie zmienia to faktu, że nie powinieneś opierać się na pewnych "efektach ubocznych", jest to źródło potencjalnych błędów. Wytłumaczyłem to dwa posty wcześniej.

Overflow (przepełnienie) nie jest wprowadzone bez przyczyny i to pod taką nazwą. Nie można tego lekceważyć. Jeśli jednak opiszesz, że Twoja funkcja pracuje na ciągach do 127 znaków i, że zwraca wartość dla użytkownika w bajcie, który należy rozszerzyć do pożądanego rozmiaru to OK. Lepszym zwyczajem będzie samodzielnie wewnątrz funkcji to wprowadzić.
[#22] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #21

zliczanie długości ciągu znaków ascii powinno być prawidłowo wykonywane za pomocą wskazówki Krashana do której dodałbym koniecznie tylko jeden warunek zakończenia tj. wyjście poza przydzielony obszar pamięci (wyjść można tylko z jednej strony, więc sprawa jest trywialna), wsio, natomiast używanie licznika oczywiście poza samym zwiększaniem wymaga jeszcze dodatkowej kontroli jego przepełnienia. Licznik ma sens w przypadku zliczania obiektów np: różnej długości. Uniwersalność tej procedury stoi pod bardzo dużym znakiem zapytania w tym przypadku
[#23] Re: Kurs asemblera 68k - część 1

@sigma2pi, post #22

Generale sigma Jaruzelski, prosze natychmiast zdac raport w kwaterze "rzeznia" i odmaszerowac, poniewaz uniwersalnosc wypowiedzi pana generala stoi pod znakiem zapytania !
[#24] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #21

Możesz wykorzystywać ten fakt że $7F+1=$80, lecz komputer interpretuje najwyższy bit jako bit znaku.

Tu całkowicie zgadzam się z Romanem. Komputer nic nie interpretuje, ponieważ operacja dodawania liczb ze znakiem i dodawania liczb bez znaku, to jest dokładnie ta sama operacja. Interpretuje to autor programu.
[#25] Re: Kurs asemblera 68k - część 1

@RomanWorkshop, post #14

@RomanWorkshop

Chodziło mi o coś takiego
Len:
	lea	textbuf(pc),a0
	move.l	a0,d0
.loop	tst.b	(a0)+
	bne.b	.loop
	subq.l	#1,a0
	sub.l	a0,d0
	neg.l	d0
	rts


@Krashan
Dzięki bardzo za krytykę. Tak właśnie czekam na opinię innych osób, szczególnie tych które nigdy nie miały do czynienia z asemblerem.
[#26] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #21

Problemy będą, jeśli użytkownik źle interpretuje fakty albo używa niewłaściwych procedur do danego zadania.

1. Ta moja procedura zwraca w bajcie wynik bez znaku (unsigned), a Ty na siłę chcesz zrobić z niego wartość ze znakiem (signed). Wszystkie moje procedury dają wynik unsigned, bo jest to natywny sposób liczenia przez procesory, czy mikrokontrolery. Nawet o tym nie wspominam, bo rzeczywiście taką mam konwencję ;)

2. Wynik w rejestrze D1 jest bajtem (wyjście danych: D1.b), co oznacza że tylko najmłodszy bajt rejestru D1 zawiera wynik. Pozostałe starsze bajty tego rejestru należy ignorować. Czyli, jeśli użytkownik chce dodać wynik z mojej procedury, to rzeczywiście musi go najpierw przenieść do "czystego" rejestru i wykonać dodawanie bez znaku (czyli normalne).

3. $FF+1 nie równa się $100 tylko $00, bo dodaję z dokładnością ".b" (starsze bajty dalej mają wartość $FFFFFF).

Co nie zmienia faktu, że sposób opisany przez Krashan'a jest dużo lepszy.

@ Asman
Jak zamienisz "sub.l a0,d0" i "neg.l d0" na "sub.l d0,a0" i "move.l a0,d0", to zaoszczędzisz 2 cykle! ;)


Ostatnia aktualizacja: 31.12.2015 11:55:57 przez RomanWorkshop
[#27] Re: Kurs asemblera 68k - część 1

@RomanWorkshop, post #26

3. $FF+1 nie równa się $100 tylko $00, bo dodaję z dokładnością ".b" (starsze bajty dalej mają wartość $FFFFFF).

Ale dlaczego nie wyzerujesz tych starszych bajtów? Dlaczego zawierają losowe dane ustawione przez Twoją funkcję?

Poza tym mnie uczono, że program pisze się dla użytkownika oraz żeby dokładnie dokumentować swoje funkcje. Moje rady nie są czysto kosmetyczne. Oszczędzisz użytkownikom swoich funkcji zbędnego stresu w wynajdywaniu błędów w programie, jeśli będzie dokładnie udokumentowana.

Wyzerowanie tych starszych bajtów to kwestia jednego polecenia procesora (nadmiarowo).

Co do liczb ze znakiem to rzeczywiście procesor może pracować na liczbach bez znaku bez zmiany kodu. Jednak obecność znaczników N (liczba ujemna) oraz V (nadmiar) wskazuje na to, że liczby ujemne są obsługiwane przez procesor w sposób naturalny.

Reasumując radzę Ci, żeby wartość zwracana przez Twoją funkcję w rejestrze D0 była poprawna (czyli jak ciąg ma 3 znaki to zwróci $00000003, a nie $FFFFFF03 np. za pomocą EXT lub EXTB. Uwierz mi, że oszczędzi to mnóstwo czasu programistom korzystającym z Twojej funkcji.
[#28] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #27

Co do liczb ze znakiem to rzeczywiście procesor może pracować na liczbach bez znaku bez zmiany kodu. Jednak obecność znaczników N (liczba ujemna) oraz V (nadmiar) wskazuje na to, że liczby ujemne są obsługiwane przez procesor w sposób naturalny.

Liczby bez znaku są przetwarzane przez procesor dokładnie tak samo naturalnie jak liczby ze znakiem. W przypadku liczb bez znaku flaga N jest po prostu kopią najstarszego bitu wyniku, zaś stan znacznika V określa, czy ten najstarszy bit został zmieniony wskutek wykonania operacji...
[#29] Re: Kurs asemblera 68k - część 1

@RomanWorkshop, post #26

O patrz! A byłem przekonany że neg.l zajmuje tylko 4 cykle. Powinienem to sprawdzić a nie liczyć że coś dobrze zapamiętałem
[#30] Re: Kurs asemblera 68k - część 1

@Hexmage960, post #27

Wyzerowanie tych starszych bajtów to kwestia jednego polecenia procesora (nadmiarowo).

Nawet nie nadmiarowo, bo wystarczy instrukcję "addq.b #1,D1" zamienić na "addq.l #1,D1".

Uwierz mi, że oszczędzi to mnóstwo czasu programistom korzystającym z Twojej funkcji.

Nie sądzę, żeby jakiś programista używał akurat tej mojej procedury i miał z nią jakiś problem, bo jest ona tak prosta, że szkoda nawet pisać ;)

Ostatnia aktualizacja: 31.12.2015 13:33:55 przez RomanWorkshop
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem