Wikibooks
plwikibooks
https://pl.wikibooks.org/wiki/Wikibooks:Strona_g%C5%82%C3%B3wna
MediaWiki 1.48.0-wmf.3
first-letter
Media
Specjalna
Dyskusja
Wikipedysta
Dyskusja wikipedysty
Wikibooks
Dyskusja Wikibooks
Plik
Dyskusja pliku
MediaWiki
Dyskusja MediaWiki
Szablon
Dyskusja szablonu
Pomoc
Dyskusja pomocy
Kategoria
Dyskusja kategorii
Wikijunior
Dyskusja Wikijuniora
TimedText
TimedText talk
Moduł
Dyskusja modułu
Wydarzenie
Dyskusja wydarzenia
Asembler/Wprowadzenie
0
5539
560619
230321
2026-11-08T10:33:35Z
Mhippe
24440
"na pieszo" to błąd językowy
560619
wikitext
text/x-wiki
== O Asemblerze ==
{{Wikipedia|Asembler}}
Termin '''Asembler''' oznacza niskopoziomowy, czytelny dla człowieka sposób programowania (język) poszczególnych procesorów. W praktyce oznacza to, że termin ten jest bardzo rozległy i obejmuje wiele różnych dialektów. Język asembler jest zależny od danej architektury sprzętowej, dlatego też istnieją różne odmiany tego języka dla każdego z rodzajów procesorów. Asembler jest generalnie sposobem komunikacji jeden-do-jednego z właściwym językiem maszynowym. Niektóre kompilatory jak na przykład GCC mogą konwertować kod źródłowy wysokopoziomowych języków (jak C, C++ czy Ada) na kod źródłowy asemblera zależny od platformy jeszcze przed zasemblowaniem w język maszynowy.
Język asemblera jest jednym z nielicznych języków programowania, które naprawdę potrafią przestraszyć człowieka przy pierwszym kontakcie. Wynika to z dwóch faktów:
* język asemblera jest językiem niskiego poziomu (tłumaczy się go bezpośrednio do kodu maszynowego)
* według powszechnej opinii - nie nadaje się do nauczania programowania
Dlatego też osoby, które nie zetknęły się wcześniej z programowaniem nie powinny zaczynać od języków asemblerowych.
Asembler jest najbardziej niskopoziomowym sposobem na programowanie komputerów<ref>Oprócz "rzeźbienia" programu w czystym kodzie maszynowym - ten sposób programowania chyba już na zawsze wyszedł z użycia.</ref>. Nazwa "Asembler" jest myląca, gdyż nie ma jednego standardowego języka asemblerowego. Każdy procesor ma własny dialekt asemblera, różniący się między sobą zestawem instrukcji, rejestrów, mechanizmem dostępu do pamięci czy też samym sterowaniem procesora. Możemy jednak wyróżnić elementy wspólne: każdy procesor posiada rejestry (różnie się nazywające i dostępne w różnych ilościach), ma dostęp do pamięci, umożliwia wykonywanie prostych operacji logicznych i arytmetycznych itp. Dlatego też program napisany dla procesora firmy Intel nie będzie mógł zostać przetłumaczony na kod maszynowy procesora Motoroli i uruchomiony na nim (i vice versa).
Asembler jest typowym językiem jeden-do-jednego jeśli chodzi o sposób na komunikację z konkretnym językiem maszynowym. To oznacza,że każda instrukcja Asemblera może być przetłumaczona jako jedna instrukcja maszynowa i każdy rozkaz maszynowy może stanowić unikalną instrukcję w kodzie źródłowym napisanym w Asemblerze. Programując w Asemblerze można popełnić więcej błędów niż w językach wysokiego poziomu, ale czasami są sytuacje gdy niskopoziomowy język jest korzystniejszy lub wręcz konieczny. Ponadto, język asemblera może być łączony z językami wyższego poziomu w celu przyspieszenia kluczowych operacji.
Wszystkie mikroprocesory zachowują się inaczej jeśli chodzi o zadania takie jak sposoby adresowania pamięci, komunikacja z peryferiami lub innymi szczegółami. Te różnice między mikroprocesorami powodują, że generalnie Asembler jest nieprzenośnym językiem.
Nie mniej warto podkreślić, że żmudna praca na konstruowaniu instrukcji "na piechotę" daje rewelacyjne efekty n.p.
* dzięki bardzo małym wymaganiom sprzętowym,
* omija wszelki niepożądane implementację, jak n.p. telemetria (większość API jest skompilowana i trudno je przeanalizować),
* umożliwia pisanie sterowników,
* daje swobodę napisania dowolnych poleceń każdemu dla wszelkich urządzeń.
Przykłady owoców programowania w językach niskiego poziomu:
* w pełni multimedialny system operacyjny [[w:MenuetOS|MenuetOS]] (1,44MB) - jest darmowy,
* wysokiej jakości gra FPP [[w:.kkrieger|.kkrieger]] (99kB)
== Dlaczego warto uczyć się asemblera? ==
Asembler, tłumaczony bezpośrednio do kodu maszynowego danej architektury, daje możliwość dokładnego dopasowania oprogramowania do sprzętu. Dzięki temu możemy w maksymalny sposób wykorzystać możliwości naszego sprzętu. Oprócz tego znajomość języka asemblera jest konieczna wszędzie tam, gdzie programowany ma być bezpośrednio sprzęt (np. przy tworzeniu sterowników urządzeń, czy też przy programowaniu systemów operacyjnych). Oprócz tego język asemblera wymusza na programiście dokładną znajomość działania sprzętu. Tak więc nauka języka asemblera umożliwia dokładne poznanie działania np. procesora i pamięci. Wadami języka asemblera jest mała przenośność oraz stosunkowo duży nakład pracy w utworzenie nawet najprostszych programów (dla porównania - w języku [[Python]] program, który wyświetla na ekranie tekst "hello world" zajmuje tylko jedną linijkę kodu, w asemblerze potrzeba dla tej samej czynności nawet 20 linijek kodu!). W programowaniu w językach asemblerowych ważna jest także dokładność - błędne użycie instrukcji może spowodować błędy w wykonywaniu programu (właściwie, to nawet brak jednego symbolu może powodować błędy). Ponadto proces lokalizacji i usuwania błędów może być szczególnie trudny, gdyż popełniony przez nas błąd może ujawnić się bardzo daleko od swojego źródła.
== Jak działa asembler? ==
Na początku wyjaśnijmy jedną rzecz. Otóż pod nazwą "asembler" kryje się zarówno język jako taki, jak i program, który tłumaczy go do kodu maszynowego. Jako język jest pisany wielką literą (Asembler), a jako program tłumaczący jest pisany małą literą (asembler). Aby napisać program w Asemblerze potrzebny nam będzie:
* edytor, który nie zapisuje formatowań tekstu
* asembler, czyli program tłumaczący nasz program do kodu maszynowego
* dobra znajomość danej architektury lub jej specyfikacja
Taki zestaw powinien w zupełności wystarczyć Ci do napisania najprostszego programu w asemblerze. Pozostało mi tylko wyjaśnić, jak działa asembler. Otóż programista tworzy program za pomocą tzw. '''mnemoników''', czyli zwykle skrótów słów, które odpowiadają jednej instrukcji procesora. I tak, w procesorze i386 istnieje instrukcja move (przenieś), dla której w asemblerze istnieje mnemonik '''mov''', który potrafi przenosić dane pomiędzy rejestrami procesora (o nich później) a pamięcią. Gotowy program, napisany w postaci mnemoników tłumaczony jest później przez asembler na kod maszynowy, który komputer może potem wykonać. Asembler również oblicza adresy słów, przez co można korzystać z etykiet. Wiele asemblerów obsługuje makra, lub korzysta się z zewnętrznych procesorów makr, np <tt>cpp</tt>.
<noinclude>
{{Przypisy}}
{{Nawigacja|Asembler|
[[../Dla autorów/]]|
[[../Podstawy|Podstawowe wiadomości o sprzęcie]]|
}}</noinclude>
pg7ua2dge2bnljw30te6fs76xruqrni
Wikibooks:Moduły/StronicowyParser/Problemy
4
63520
560620
553430
2026-11-08T11:57:08Z
Persino
2851
560620
wikitext
text/x-wiki
<noinclude>{{ProstaStronaStart
| nagłówek = {{Podrozdział|{{ld2|StronicowyParser/Problemy}}|Dokumentacja modułów {{lpg|Lua}} w {{lpr|Lua|Scribunto}}.}}{{Autonawigacja|Pomoc:Spis treści}}
| stopka strony = {{StopkaSpisTreści}}{{Podrozdział|Koniec}}
}}</noinclude>
{{Spis treści}}
== {{Śródtytuł|p.CzyJestTakiProblemowyElement}}{{Code|p.CzyJestTakiProblemowyElement}} ==
Funkcja sprawdza maksymalnie od jednego do trzech elementów kluczy tablicy wielowymiarowej, czy taki problem istnieje.
Definicja skrótowa funkcji:
<syntaxhighlight lang="lua">
function p.CzyJestTakiProblemowyElement(self,element,element2,element3)...end;
</syntaxhighlight>
{{OpisParametrów
| tytuł = Opis parametrów funkcji:
| 1 = {{Code|self}} {{Patrz|self}} | _1 = Zmienna obiektowa funkcji modułu danej tablicy.
| 2 = {{Code|element}} {{Patrz|element}} | _2 = Pierwszy {{ZobaczTeż|element}} element tablicy wielowymiarowej kluczy problemów, on na pewno musi istnieć.
| 3 = {{Code|element2}} {{Patrz|element2}} | _3 = Drugi, jeśli istnieje, element traktowany podobnie jak w: {{LinkZobaczTeż|element}}, przeciwnie, dalszych nie uwzględniamy.
| 4 = {{Code|element3}} {{Patrz|element3}} | _4 = Trzeci, jeśli istnieje, element traktowany podobnie jak w: {{LinkZobaczTeż|element}}.
}}
Funkcja dla tablicy: {{Code|self.tabela_listy_danych_analizy_ksiazki}} {{Patrz|self.tabela_listy_danych_analizy_ksiazki}}, dla jej podtablicy o kluczu: {{Code|problemy}} {{Patrz|problemy}}, jest sprawdzana elementami kluczy wielowymiarych, czy taki problem istnieje.
== {{Śródtytuł|p.UstawTakiProblemowyElement}}{{Code|p.UstawTakiProblemowyElement}} ==
Funkcja ustawia maksymalnie od jednego do trzech elementów kluczy tablicy wielowymiarowej dla danego kodu problemu w tablicy problemów.
Definicja skrótowa funkcji:
<syntaxhighlight lang="lua">
function p.UstawTakiProblemowyElement(self,element,element2,element3)...end;
</syntaxhighlight>
{{OpisParametrów
| tytuł = Opis parametrów funkcji:
| 1 = {{Code|self}} | _1 = Jak w: {{LinkPatrz|self}},
| 2 = {{Code|element}} | _2 = Jak w: {{LinkPatrz|element}},
| 3 = {{Code|element2}} | _3 = Jak w: {{LinkPatrz|element2}},
| 4 = {{Code|element3}} | _4 = Jak w: {{LinkPatrz|element3}}.
}}
Funkcja dla tablicy: {{LinkPatrz|self.tabela_listy_danych_analizy_ksiazki}}, dla jej podtablicy o kluczu: {{LinkPatrz|problemy}}, ustawia dany kod problemu.
== {{Śródtytuł|p.CzyJestTakiElementTabeliProblemu}}{{Code|p.CzyJestTakiElementTabeliProblemu}} ==
Funkcja sprawdza, czy taki dany problem dla pewnych nazw charakteryzujący daną książkę jest ustawiony w tablicy problemów.
Definicja skrótowa funkcji:
<syntaxhighlight lang="lua">
function p.CzyJestTakiElementTabeliProblemu(self,element_tablicy,nazwa_obiektu,nazwa_przestrzeni, nazwa_przestrzeni_ksiazki,nazwa_ksiazki)...end;
</syntaxhighlight>
{{OpisParametrów
| tytuł = Parametry funkcji:
| 1 = {{Code|self}} | _1 = Jak w: {{LinkPatrz|self}}.
| 2 = {{Code|element_tablicy}} {{Patrz|element_tablicy}} | _2 = Kod danego problemu.
| 3 = {{Code|nazwa_obiektu}} {{Patrz|nazwa_obiektu}} | _3 = Nazwa obiektu, jeśli istnieje.
| 4 = {{Code|nazwa_przestrzeni}} {{Patrz|nazwa_przestrzeni}}, {{Code|nazwa_przestrzeni_ksiazki}} {{Patrz|nazwa_przestrzeni_ksiazki}}, {{Code|nazwa_ksiazki}} {{Patrz|nazwa_ksiazki}} | _4 = Kolejno: nazwa przestrzeni nazw, nazwa przestrzeni książki i nazwa książki.
}}
Dla tablicy: {{LinkPatrz|self.tabela_listy_danych_analizy_ksiazki}}, dla podtablicy o kluczu wielowymiarowym: {{LinkPatrz|problemy}} i {{Code|problemy książkowe}} {{Patrz|problemy książkowe}}, dla innych elementów tej tablicy kluczy nazw: {{LinkPatrz|nazwa_przestrzeni}}, {{LinkPatrz|nazwa_przestrzeni_ksiazki}} i {{LinkPatrz|nazwa_ksiazki}}, dla dalszego klucza: {{LinkPatrz|element_tablicy}}, jest sprawdzane, czy taki element istnieje, jeżeli w ogólne wcześniejsze elementy kluczy zostały ustawione w większych podtablicach, i jest zwracane przez funkcję wartość, czy takie jest, co zrewidowano, a jeśli dalszy element do {{LinkPatrz|nazwa_obiektu}}, nie istnieje, przeciwnie dla: {{LinkPatrz|nazwa_obiektu}}, jeśli został podany, sprawdzane jest, czy taki element istnieje, i jest zwracany tego wynik.
== {{Śródtytuł|p.DodawanieProblemowegoElementuDoTablicy}}{{Code|p.DodawanieProblemowegoElementuDoTablicy}} ==
Funkcja ustawia, taki dany problem dla pewnych nazw charakteryzujący daną książkę, w tablicy problemów.
Definicja skrótowa funkcji:
<syntaxhighlight lang="lua">
function p.DodawanieProblemowegoElementuDoTablicy(self,element_tablicy,nazwa_obiektu,nazwa_przestrzeni,nazwa_przestrzeni_ksiazki,nazwa_ksiazki)...end;
</syntaxhighlight>
{{OpisParametrów
| tytuł = Parametry funkcji:
| 1 = {{Code|self}} | _1 = Jak w: {{LinkPatrz|self}},
| 2 = {{Code|element_tablicy}} | _2 = Jak w: {{LinkPatrz|element_tablicy}},
| 3 = {{Code|nazwa_obiektu}} | _3 = Jak w: {{LinkPatrz|nazwa_obiektu}},
| 4 = {{Code|nazwa_przestrzeni}}, {{Code|nazwa_przestrzeni_ksiazki}} i {{Code|nazwa_ksiazki}} | _4 = Kolejno jak w: {{LinkPatrz|nazwa_przestrzeni}}, {{LinkPatrz|nazwa_przestrzeni_ksiazki}} i {{LinkPatrz|nazwa_ksiazki}}.
}}
Dla tablicy: {{LinkPatrz|self.tabela_listy_danych_analizy_ksiazki}}, dla podtablicy o kluczu wielowymiarowym: {{LinkPatrz|problemy}} i {{Code|problemy książkowe}} {{LinkPatrz|problemy książkowe}}, dla innych elementów tej tablicy kluczy nazw: {{LinkPatrz|nazwa_przestrzeni}}, {{LinkPatrz|nazwa_przestrzeni_ksiazki}} i {{LinkPatrz|nazwa_ksiazki}}, dla dalszego klucza problemu: {{LinkPatrz|element}}, dla nazwy obiektu, jeśli istnieje: {{LinkPatrz|nazwa_obiektu}}, jest ustawiana tablica pusta, aby ustawić dany problem.
{{BrClear}}
<noinclude><!--
-->{{ProstaStronaKoniec}}<!--
-->{{Kategoria|Opisy funkcji, w Lua w Scribunto, w modułach}}<!--
--></noinclude>
1mq0npa0f0i77vvtiv6qvxl4xf5rgfb