Kurs asemblera

0

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 ?

0

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

4

***-- 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

  1. Gynveal Coldwind asembler x86 - Gynvael's Asm (PL)
  2. Poza tym warto zobaczyć jakie bugi można zrobić w kodzie pisząc wysoko poziomo - C/C++ vs Security!
  3. 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ą.
  4. Ciekawa jest też książka Assembly Language Step-by-Step: Programming with Linux
  5. Żeby pisać w asemblerze wystarczy gcc, można tworzyć pliki .S albo robić wstawki asemblera albo makra.
  6. Jest też NASM, FASM YASM, ale póki co tylko używałem NASM
  7. Warto rzucić okiem na mikrokontrolery AVR oraz ARM, jak to się programuje, żeby mieć porównanie.
  8. Aha, jest jeszcze coś takiego jak https://godbolt.org/ w którym można podejrzeć kod asemblera i wynik działania programu
  9. 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.

2

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ę.

0
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 :)

2
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

4p.png

Na prawdę???

1
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:

Opera Zdjęcie_2020-02-04_005719_helion.pl.png

3

@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.

0

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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.