Jak pisać programy w języku asembler pod Linuksem?
Wyobraźcie sobie, jakby to było móc programować maszynę bezpośrednio - rozmawiać z procesorem bez pośrednictwa struktur wysokiego poziomu, np. takich jak spotykamy w języku C. Bezpośrednie operowanie na procesorze umożliwia przecież pełną kontrolę jego działań! Bez zbędnych instrukcji i innych śmieci spowalniających nasze programy.
Czy już czujecie chęć pisania najkrótszych i najszybszych programów na świecie?
Programów, których czasem w ogóle NIE MOŻNA napisać w innych językach? Brzmi wspaniale, prawda?
Tylko pomyślcie o tym, co powiedzieliby znajomi, gdybyście się im pochwalili. Widzicie już te ich zdumione miny?
Miła perspektywa, prawda? No, ale dość już gadania. Zabierajmy się do rzeczy!
Zacznijmy od krótkiego wprowadzenia:
1. Dwójkowy (binarny)
Najprostszy dla komputera, gdzie coś jest albo włączone, albo wyłączone. System ten operuje na liczbach zwanych bitami (bit = binary digit = cyfra dwójkowa). Bit przyjmuje jedną z dwóch wartości: 0 lub 1.
Na bajt składa się 8 bitów. Jednym bajtem można przedstawić więc 2A8=256 możliwości.
Przeliczenie liczby zapisanej w systemie dwójkowym na dziesiętny jest proste. Podobnie jak w systemie dziesiętnym, każdą cyfrę mnożymy przez odpowiednią potęgę podstawy (podstawa wynosi 2 w systemie dwójkowym, 10 w systemie dziesiętnym).
Oto przykład (daszek A oznacza potęgowanie):
1010 1001 dwójkowo =
1 *(2A7) + 0*(2A6) + 1 *(2A5) + 0*(2A4) + 1*(2A3) + 0*(2A2) + 0*(2A1) + 1*(2A0) =
128 + 32 + 8 + 1 =
169 dziesiętnie (lub dec, od decimal).
Działanie odwrotne też nie jest trudne: naszą liczbę dzielimy ciągle (do chwili uzyskania ilorazu równego 0) przez 2, po czym zapisujemy reszty z dzielenia wspak:
(przeskocz konwersje liczby dziesiętnej na dwójkowa)
169
84
1
0
0
42
21
9