Zrozumieć Assembler...

0

Gdy zaczynałem naukę Javy, zawsze zastanawiałem się, uwaga cytuję: "W jaki sposób, zmieniając wartości funkcji, można cokolwiek sensownego zrobić?".

Teraz już to wiem. Problem jednak zaczyna się znowu, gdy próbowałem zacząć naukę assemblera. Tutaj zrozumienie go jest dla mnie o wiele trudniejsze:

W jaki sposób, przenosząc wartości z jednego rejestru do drugiego, można zrobić coś sensownego?"

Naprawdę, proszę o wyjaśnienie, bo ja nie potrafię sobie tego wyjaśnić. Myśląc o tym przenoszeniu, do głowy wpada mi tylko Brainfuck: przechodzenie do różnych komórek i zmiana ich wartości. Chyba.

Moje pytania brzmią:

  1. Czy każdy rejestr w procesorze wykonuje jakieś inne działanie, że przenoszenie wartości z jednego do drugiego daje efekty?
  2. W jaki sposób osiągnąć za pomocą tych zmian np. wyświetlanie tekstu?
  3. Do czego w dzisiejszych czasach może być przydatny Assembler?
3
  1. rejestr to tylko taki kontener na bajty, nic mniej nic wiecej. Nie ma on zadnego typu, nic nie robi, po prostu mozna tam wrzucic jakas zmienna i to daje szybszy dostep niz odwolywanie sie do komorek pamieci.
  2. Wyswietlanie tekstu mozna osiagnac na kilka sposob, wywolanie funkcji bibliotecznych, przerwania, mazanie po pamieci karty graficznej.
  3. Do pisania malych appek, optymalizacji, pisania bootloaderow, kerneli, programowania urzadzen wbudowanych. Chociaz ogolnie teraz sie idzie w kierunku, zeby jak najwiecej mozna bylo napisac w C.

Edit: Przepraszam, ze zapomnialem o "chlopcach od RE" ;>

2

Czy każdy rejestr w procesorze wykonuje jakieś inne działanie, że przenoszenie wartości z jednego do drugiego daje efekty?

Rejestr to jest taka jakby "zmienna". Czy zmienne wykonują jakieś działania? Nie. Wykonuje się działania na zmiennych ;)

W jaki sposób osiągnąć za pomocą tych zmian np. wyświetlanie tekstu?

Na przykład kopiując bajty do pamięci karty graficznej?

Do czego w dzisiejszych czasach może być przydatny Assembler?

Do tego żeby rozumieć jak działa komputer.

0
ShookTea napisał(a):

Do czego w dzisiejszych czasach może być przydatny Assembler?

  • do niskopoziomowej analizy kodu wygenerowanego przez kompilator (np. C/C++) w celu jego optymalizacji na wysokim poziomie lub debugowania
  • do pisania wstawek assemblerowych podnoszących wydajność programu przy jednoczesnym jego zaciemnieniu
  • do pisania sterowników
0

No dobra, teraz to mniej więcej rozumiem. Pojawiło mi się w głowie jeszcze jedno pytanie - w jaki sposób zmieniać wartości w rejestrach poprzez np. mnożenie czy dzielenie? Czy takie coś w ogóle ma sens w Assemblerze?

2

div, mul, idiv, imul, dla unsigned i signed integerow w x86.

0

Kto normalny robi wstawki Assemblerowe w kodzie w dzisiejszych czasach? Szansa, że coś zostanie napisane lepiej, niż wygeneruje to kompilator ze swoimi setkami optymalizacji jest relatywnie niska :P

  1. może chcemy użyć jakiegoś SSE2345, których to instrukcji nam kompilator sam nie wygeneruje
  2. może piszemy sterownik, i potrzeba się odwołać do portu albo do przerwania
  3. może potrzebujemy wygenerować kod wykonywalny (np. wewnątrz kompilatora...) // ok, to nie jest "wstawka", ale znajomość konieczna
    ...
0

No to jeszcze dwa:
Czy nazwy rejestrów coś znaczą (np. w danym rejestrze można przechowywać tylko daną wartość), czy jest to kwestia dowolna?
Skoro w Assemblerze pracujemy prawie bezpośrednio na procesorze, to w jaki sposób wysłać coś do karty graficznej (by np. wyświetlić tekst)?

1
ShookTea napisał(a):

No to jeszcze dwa:
Czy nazwy rejestrów coś znaczą (np. w danym rejestrze można przechowywać tylko daną wartość), czy jest to kwestia dowolna?

Zależy od procesora, ale zwykle rejestry nie są uniwersalne.
Są rejestry do obliczeń, są do operacji na stosie, są do kontroli miejsca wykonywania programu.

http://www.c-jump.com/CIS77/ASM/Assembly/lecture.html#A77_0180_typical_gp_reg_uses
http://www.tech-juice.org/2011/08/27/x86-segment-registers-in-protected-mode/

ShookTea napisał(a):

Skoro w Assemblerze pracujemy prawie bezpośrednio na procesorze, to w jaki sposób wysłać coś do karty graficznej (by np. wyświetlić tekst)?

To zależy od środowiska.
Jeśli jesteś poza OS-em (np. w trakcie bootowania) to możesz użyć INT 10h - wykorzystanie BIOS-a.
W DOS - INT 21h

http://asm.inightmare.org/index.php?article=1&location=12
http://montcs.bloomu.edu/Code/Asm.and.C/Asm.Nasm/hello-in-assembly.shtml

1

to w jaki sposób wysłać coś do karty graficznej (by np. wyświetlić tekst)?

Pisząc dane do odpowiedniego miejsca w pamięci (np.pod 0xB8000 w trybie tekstowym - http://wiki.osdev.org/Printing_To_Screen).

1 użytkowników online, w tym zalogowanych: 0, gości: 1