Chciałbym się nauczyć i jednocześnie zrozumieć zasadę działania komputera. Nie chce tutaj tylko i wyłącznie iść w stronę samych materiałów teoretycznych które dadzą mi znikomą wiedzę a zrozumieć jak to wszystko ze sobą funkcjonuje. Czy ucząc się asemblera muszę znać jakieś solidne podstawy z tego jak działa komputer czy raczej mogę być kompletnie zielony w tym temacie a nauka asemblera da mi wystarczający zastrzyk wiedzy praktycznej ?
W ogóle nie rozumiem o co pytasz. Najpierw piszesz że chcesz uczyć sie jak komputer działa, a potem się pytasz czy musisz uczyć jak komputer działa (żeby z rozumieć asemblera).
Jak chcesz się uczyć jak działa komputer to się tego ucz. Jak chcesz uczyć się assemblera to się tego ucz, a jak będziesz potrzebować innej wiedzy do się douczysz w przy okazji. Ale IHMO to jest bez sensu. Już nawet mikrokontrolery programuje się w C (w większości) i nikt nie potrzebuje assemblera poza twórcami kompilatorów
Masz tutaj mały kurs Kiedy i jak korzystać z asemblera. Podstawy programowania w asemblerze ;)
***-- Jeśli napisałem bzdury proszę mnie poprawić, albo dodać coś jeszcze do tego.-- ***
Dla mnie kopalnia wiedzy z której sporo się dowiedziałem to
- Gynveal Coldwind asembler x86 - Gynvael's Asm (PL)
- Poza tym warto zobaczyć jakie bugi można zrobić w kodzie pisząc wysoko poziomo - C/C++ vs Security!
- Semihalf ma konkret materiał którzy wrzucają do programistymag i mają też na kanale ciekawe nagrania jak to pt Masz wiadomość - komunikacja wieloprocesorowa w praktyce. Jest tam o działaniu procesorów wielordzeniowych i jak podejść do programowania. Poza tym oni robią materiały o takich niskopoziomowych zagadnieniach, nie jest to ściśle nauka asemblera ale jest to powiązane ze sobą.
- Ciekawa jest też książka Assembly Language Step-by-Step: Programming with Linux
- Żeby pisać w asemblerze wystarczy gcc, można tworzyć pliki .S albo robić wstawki asemblera albo makra.
- Jest też NASM, FASM YASM, ale póki co tylko używałem NASM
- Warto rzucić okiem na mikrokontrolery AVR oraz ARM, jak to się programuje, żeby mieć porównanie.
- Aha, jest jeszcze coś takiego jak https://godbolt.org/ w którym można podejrzeć kod asemblera i wynik działania programu
- Bardziej konkretnych tematów trzeba pt "how a cpu works" trzeba szukać po sieci, na yt.
Jest trochę tego... a to zaledwie wstęp do nauki heh.
ad 2.
ad 3.
opcodes - gynvael coldwind Na początek możesz implementować funkcje, których byś potrzebował bez wywoływania ich API z języków wyższego poziomu.
Zadania jakie mógłbyś postawić przed sobą to, np.
Jak działa struc ... endstruc. Co to jest istruc ... iend. W jaki sposób działa alignment w plikach elf, obj, itd. Co w NASM oznacza słowo extern, global. Dlaczego w NASM korzysta się z makr typu %define. Co to są pseudoinstrukcje i po co są? Co znaczy dx, gdzie za x należy podstawić jakąś literę z "b, w, d, q, t, o, y, z". Co to jest resx, gdzie za x należy podstawić litery analogicznie do dx. Jak się definiuje stałe słowem kluczowym equ. Co to znaczy times, co powtarza i jak to działa. Co to jest adres absolutny, a co relatywny. Dlaczego w assembly x86-64 korzysta się z offsetów (przesunięć). Jak się definiuje w sekcji danych łańuchy znaków (string), jak liczby, itp. Jak w rejestrach umieszczane są dane, czy można w rejestrze umieścić adres, który zawsze będzie w tym samym miejscu, czyli pod adresem np. 0xffac. Co to jest stack hardware. Czym się różni stack software od heap software. Dlaczego w procesorach z rodziny x86 jest tylko hardware'owy stos, a inne struktury danych już nie. Dlaczego korzysta się z hardware'owego stosu skoro odwołania tylko do rejestrów są teoretycznie szybsze. Gdzie jest tworzony stos i gdzie jest umieszczany (oprogramowanie wbudowane w hardware, które steruje stosem). Dlaczego komputer potrzebuje pamięci RAM i dlaczego jest tam tworzony software'owy heap (sterta). Co to jest L1, L2, L3, itp. cache procesora, jak wpływa na szybkość działania systemu i stabilność. Czym się różnią pamięci DDR od ECC. Co to są rejestry procesora EAX, EBX, ECX, EDX, itp., jak się dzielą i do czego służą. Jak wyłączyć cache w procesorze np. korzystając z rejestru kontrolnego CR0 i czy w ogóle się da. Co to jest przepełnienie stosu hardware, a czym stosu software. Dlaczego na stercie umieszcza się dane dynamiczne, które nie są znane w czasie kompilacji, a nie np. na stosie. Po co jest dynamiczna alokacja stosu i z czym to się je skoro jest sterta. Z czego składają się instrukcje procesora, co to opcode, a co to kod maszynowy. Dlaczego się mówi, że system jest 32. lub 64. bitowy? Czy bez instrukcji push można położyć wartość na stosie, itp. Dlaczego jest coś takiego jak call near i call far, czym to się różni. Czy instrukcja call niszczy "wartości" rejestrów, jeśli tak, to dlaczego tak się dzieje. Jak ocalić wartości rejestrów przed skorzystaniem z call. Czy korzystając tylko z assembly x86 można zaprogramować stronę internetową. Co to są przerwania systemowe. Jak wyjść z protected mode, by móc programować w innym trybie. Jak napisać instrukcję call nie korzystając z niej. Do czego jest NOP w x86. Co to są cykle procesora, a co to zegar systemowy. Dlaczego kompilatory zamieniają daną sekwencję instrukcji na inne, np. dzielenie przez 7 (chyba). Czemu w procesorze jest tak mało rejestrów. Jak z rejestrów 32-bit napisać typ, który mieści w sobie 64-bitowy i byłby używany w języku wyższego poziomu. Dlaczego jest instrukcja adc, do czego jest przystosowana.
Funkcje jakie mógłbyś napisać na początek, to np. strlen, konwersja z "typu string" na "int" i vice versa, struktura stos software'owy, array (tablica), lista jednokierunkowa, malloc, realloc, alloca, printf, konwersja liczb na znak ASCII i z ASCII na liczbę.
Czy taka książka https://www.empik.com/asembler-programowanie-farbaniec-dawid,p1229440752,ksiazka-p byłaby dobra na początek ?
piotrek1998 napisał(a):
Czy taka książka https://www.empik.com/asembler-programowanie-farbaniec-dawid,p1229440752,ksiazka-p byłaby dobra na początek ?
Użytkownicy tego forum mogą być nie obiektywni, bo gdzieś tu jest Autor niedawno wydanej książki o asemblerze :P Nie pamiętam czy to była ta :)
piotrek1998 napisał(a):
Czy taka książka https://www.empik.com/asembler-programowanie-farbaniec-dawid,p1229440752,ksiazka-p byłaby dobra na początek ?
Ja bym się poważnie zastanowił --- zwłaszcza po czymś takim, co znalazłem w Internecie wyszukując informacji o tym panie
Na prawdę???
piotrek1998 napisał(a):
Czy taka książka https://www.empik.com/asembler-programowanie-farbaniec-dawid,p1229440752,ksiazka-p byłaby dobra na początek ?
Widziałem jego kody źródłowe, nie polecam jego książek, bo można wynieść znacznie więcej z darmowych kursów Iczeliona (i polskich tłumaczeń Jerzego Walaszka) niż z książki kogoś kto posiada tak nikłe doświadczenie w programowaniu w assemblerze i nigdy nie zaprezentował żadnego konkretnego projektu napisanego w tym języku, ani darmowego, ani komercyjnego.
https://eduinf.waw.pl/inf/prg/002_winasm/index.php
Spoglądając na opinie ze strony wydawnictwa Helion, można przeczytać takie kwiatki:
@piotrek1998
Moja książka "Asembler. Programowanie" (z roku 2019, była jeszcze "Asembler. Leksykon kieszonkowy" z 2012 r.) nie jest dobra dla całkowicie początkujących. Co prawda opisuje Asembler x64 (MASM64/ML64.exe z najnowszego Visual Studio), ale widząc po opiniach na stronie Helion za mało tłumaczę i niestety w wielu miejscach założyłem, że czytelnik to już wie.
Ja bym się poważnie zastanowił nad słuchaniem Pana @Bartosz Wójcik, który w 2020 roku poleca swój artykuł o Asemblerze z 2002 roku.
Rekomenduje również kursy Iczeliona o MASM32, które były popularne i aktualne, ale przed wejściem architektury 64-bitowej.
Asembler x86 (32-bit) jest aktualnie w trybie kompatybilności (legacy mode).
Dlatego polecam uczyć się Asemblera dla aktualnie najnowszej architektury 64-bitowej (x86-64).
Nie zbudujesz w Asemblerze MASM64 większości kodów z MASM32 bez zmian i przepisywania (a to wymaga wiedzy).
Pan @Bartosz Wójcik Zarzuca mi też, że "nigdy nie widziałem ani jednego jego większego programu".
To znaczy, że moje umowy NDA na programy spełniają swoją rolę ;)
Jeśli chodzi o opinię na witrynie Helion, że moje kody źródłowe mają błędy i nie da się ich zbudować to zaznaczę, że należy korzystać z metody z rozdziału "3.2. Alternatywne podejście wyodrębnienie narzędzi konsolowych". Gwarantuję, że wszystko zbuduje się bez najmniejszego problemu. Żałuję tylko jednego, że nie umieściłem przy każdym kodzie informacji jak go budować i początkujący go wklejają do Visual Studio i mają błędy.
Można wiedzieć jak programować w assemblerze nie wiedząc jak komputer działa.
Ale za to assemblera daje wiedzę o tym jakie funkcje ma zaimplementowany procesor i jego peryferia, ale każdy korzysta z firmware gotowych i mało kto wie co tam siedzi.
Pełnej wiedzy o budowie to nikt nie ma, co najwyżej można spekulować i zbudować swój.
Za to wiedza na temat szukania informacji w pamięci jest bardzo ważna, możesz nie przeczytać miliarda opcodów assemblera programu, ale możesz znaleźć to co potrzebujesz i zwykle tego człowiek się uczy jakiegoś kombinowania w tym assemblerze, a niżeli pisania prostych rzeczy, które można zrobić w innych językach.
Jak assembler to najpierw język C/C++, bez tego nie widzę sensu zaczynać się uczyć assemblera.
Potem jakiś gamehacking, binary exploitation i można jakiegoś drivera napisać na miedzi na mikroklocku.
Może się wydaje, że assembler niskopoziomowy, ale i tak cię ogranicza kernel, a tam to dopiero ciekawie.