Język Asemblera PC.pdf

(1023 KB) Pobierz
Microsoft Word - JHAPC.doc
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
WYŁĄCZNOŚĆ DO PUBLIKOWANIA TEGO TŁUMACZENIA
POSIADA RAG
HTTP://WWW.R-AG.PRV.PL
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Język Asemblera PC
Paul A. Carter
12 grudzień 2002
Tłumaczone by K.remik
*Szósty rozdział został przetłumaczony niezależnie ( i bez „ściągania”) od Sawki*
Rozdział 1
Wprowadzenie
1.1Systemy Liczbowe
Pamięć komputera składa się z liczb. Pamięć komputera nie przechowuje tych liczb dziesiętnie
(podstawa 10). Ponieważ to wielce upraszcza, komputery przechowują wszystkie informacje w formacie
binarnym (podstawa 2). Najpierw popatrzmy na system dziesiętny.
1.1.1 System Dziesiętny
Podstawa dziesiętna liczb składa się z 10 możliwych cyfr (0-9). Każda cyfra liczby ma potęgę 10
skojarzoną z jej pozycją w liczbie. Na przykład:
234 = 2 x 10 2 + 3 x10 1 + 4 x10 0
1.1.2 System Dwójkowy
Podstawa dwójkowa składa się z dwóch możliwych cyfr (0 i 1). Każda cyfr liczby ma potęgę 2
skojarzoną z jej pozycją w liczbie (Pojedyncza cyfra binarna jest nazywana bitem). Na przykład:
11001 2 = 1 x2 4 +1 x2 3 + 0 x2 2 + 0 x2 1 + 1 x2 0
= 16 + 8 + 1
= 25
Pokażę jak liczba dwójkowa może być skonwertowana do liczby dziesiętnej. Tablica 1.1 pokazuje jak
pierwszych kilka liczb binarnych jest skonwertowanych.
Rysunek 1.1 pokazuje jak są dodawane pojedyncze cyfry binarne (tj. bity)
Tu mamy przykład:
Dziesiętnie
Binarnie
Dziesiętnie
Binarnie
0
0000
8
1000
1
0001
9
1001
2
0010
10
1010
3
0011
11
1011
4
0100
12
1100
5
0101
13
1101
6
0110
14
1110
7
0111
15
1111
Tablica 1.1 Konwersja liczb dziesiętnych 0 do 15 na liczby binarne
Żadnego poprzedniego przeniesienia
Poprzednie przeniesienie
0
0
1
1
0
0
1
1
+0
1
0
1
+0
1
0
1
----------------------------------
-----------------------------
0
1
1
0
1
0
0
1
c
c
c
c
27427849.001.png
Rysunek 1.1 Dodawanie binarne (c oznacza przeniesienie)
11011 2
+10001 2
---------
101100 2
Rozważmy poniższe dzielenie binarne:
1101 2 ٪ 10 2 = 110 2 r 1
Pokazuje to, że dzielenie przez dwa, dwójkowo przesuwa wszystkie bity w prawo o jedną pozycję i przenosi bit
najbardziej na prawo do reszty. (Analogicznie dzielenie przez dziesięć w systemie dziesiętnym przesuwa
wszystkie cyfry dziesiętne w prawo o jeden i przenosi najbardziej na prawo cyfrę do reszty). Fakt ten może być
zastosowany do konwersji liczby dziesiętnej do jej binarnego odpowiednika, jak pokazano na rysunku 1.2.
Metoda ta znajduje najpierw cyfrę najbardziej na prawo, cyfra ta jest nazywana najmniej znaczącym bitem.
Cyfra najbardziej na lewo jest nazywana najbardziej znaczącym bitem. Podstawowa jednostka pamięci składa
się z 8 bitów i jest nazywana bajtem.
1.1.3 System Heksadecymalny
Liczby heksadecymalne stosują podstawę szesnastkową. System szesnastkowy (lub w skrócie hex)
może być zastosowany jako skrót dla liczb binarnych. Hex ma 16 możliwych cyfr.
Dziesiętnie
Binarnie
25 ÷ 2 = 12 r 1
11001 ÷ 10 = 1100 r 1
12 ÷ 2 = 6 r 0
1100 ÷ 10 = 110 r 0
6 ÷ 2 = 3 r 0
110 ÷ 10 = 11 r 0
3 ÷ 2 = 1 r 1
11 ÷ 10 = 1 r 1
1 ÷ 2 = 0 r 1
1 ÷ 10 = 0 r 1
Zatem
Zatem 25 10 = 11001 2 .
Rysunek 1.2 Konwersja dziesiętna
589 ÷ 16 = 36 r 13
36 ÷ 16 = 2 r 4
2 ÷ 16 = 0 r 2
Zatem 589 = 24D 16 .
Rysunek 1.3
To tworzy problem ponieważ nie ma symboli dla zastosowania dla tych dodatkowych cyfr powyżej 9. Przyjęto,
że, są stosowane litery dla tych dodatkowych cyfr. Te 16 cyfr hex to 0 – 9 potem A, B, C, D, E i F. Cyfra A jest
odpowiednikiem 10 w systemie dziesiętnym, B 11, itd.. Każda cyfra ,która jest liczbą hex ma podstawę potęgi
16 z nią skojarzoną. Przykład:
2BD 16 = 2 x 16 2 + 11 x 16 1 + 13 x 16 0
= 512 + 176 + 13
= 701
Konwertując z systemu dziesiętnego na hex, używamy tych samych sposobów , które były zastosowane dla
konwersji binarnej, z wyjątkiem tego, że dzielimy przez 16. Zobacz na przykład rysunek 1.3
Tak więc, 539 = 24D 16 . Powód dla którego system heksadecymalny jest użyteczny jest taki, że jest to
bardzo prosty sposób konwersji pomiędzy systemem heksadecymalnym a binarnym Liczby binarne szybko
27427849.002.png
stają się duże i nieporęczne. System heksadecymalny dostarcza dużo bardziej zwartego sposobu przedstawiania
liczb binarnych.
Konwersja liczby hex na liczbę binarną, to po prostu konwersja każdej cyfry hex na czterobitową
liczbę binarną. Na przykład, 24D 16 jest skonwertowane do 0010 0100 1101 2 . Zauważ, że ważne są początkowe
zera czterech bitów. Konwertowanie z systemu binarnego na hex jest prawie tak samo łatwe. Właściwie robimy
odwrotną konwersję. Konwertujemy każdą czterobitową część liczby binarnej na hex. Pamiętaj, że zaczynamy
od prawego końca, a nie lewego końca liczby binarnej. Przykład:
110 0000 0101 1010 0111 1110 2
6 0 5 A 7 E 16
Czterobitowa liczba jest nazywana nibblem. A zatem każda cyfra hex odpowiada nibblowi. Dwa nibble
tworzą bajt a więc bajt może być przedstawiany jako dwie cyfry liczby heksadecymalnej. Wartość bajtu mieści
się w zakresie od 0 do 11111111 w systemie binarnym, 0 do FF w systemie heksadecymalnym i od 0 do 255 w
systemie dziesiętnym.
1.2Organizacja Komputera
1.2.1 Pamięć
Podstawową jednostką pamięci jest bajt. Komputer z 32 MB RAM’u może przechować, mniej więcej,
32 miliony bajtów informacji. Każdy bajt jest określony przez unikalną liczbę, znaną jako jego adres, jak
pokazuje rysunek 1.4.
Adres
0
1
2
3
4
5
6
7
Pamięć 2A
45
B8
20
8F
CD
12
2E
Rysunek 1.4 : Adres pamięci
Wszystkie dane w pamięci są numeryczne. Znaki są przechowywane poprzez zastosowanie kodu znaku.
PC stosuje najpowszechniejszy kod znaku znany jako ASCII . Często pamięć jest używana w większych
kawałkach niż pojedynczy bajt. Nazwy nadane tym większym częścią pamięci są pokazane w tabeli 1.2.
Słowo
2 bajty
Podwójne słowo
4 bajty
Poczwórne słowo
8 bajtów
Paragraf
16 bajtów
Tablica 1.2: Jednostki pamięci
1.2.2 CPU
Centralna Jednostka Przetwarzająca (CPU) jest sprzętem, który bezpośrednio wykonuje instrukcje.
Instrukcje, które wykonuje CPU są generalnie bardzo proste. Instrukcje mogą wymagać danych które działają na
specjalnych komórkach pamięci w samym CPU zwanych rejestrami. CPU może uzyskać dostęp do danych w
rejestrach dużo szybciej niż do danych w pamięci RAM. Jednakże, liczba rejestrów w CPU jest ograniczona,
dlatego programista musi ostrożnie przetrzymywać tylko bieżące używane dane w rejestrach.
Instrukcje wykonywane przez CPU stanowią język maszynowy CPU. Programy maszynowe mają dużo
bardziej podstawową strukturę niż języki wysokiego poziomu. Instrukcje języka maszynowego są kodowane
jako surowe liczby, a nie w przyjaznym formacie tekstowym. CPU musi być zdolny do zdekodowania celu
działania instrukcji bardzo szybko aby sprawnie działać. Język maszynowy jest zaprojektowany właśnie w tym
celu a nie po to by być łatwo rozszyfrowanym przez ludzi. Programy napisane w innych językach muszą być
skonwertowane do „rodzonego” języka maszynowego CPU dla uruchomienia na komputerze. Kompilator jest
programem ,który tłumaczy program napisany w języku programowania na język maszynowy właściwej
architektury komputera. Ogólnie, każdy typ CPU ma swój własny unikalny język maszynowy. Jest to jeden z
powodów dlaczego programy napisane na Mac’a nie działają na PC typu IBM.
27427849.003.png
1.2.3 Rodzina CPU 80x86
Pecety typu IBM zawierają CPU z rodziny Intela 80x86 (lub ich klony). CPU w tej rodzinie wszystkie
mają wspólne cechy wliczając w to bazowy język maszynowy. Jednakże , ostatni członkowie wielce poprawili te
cechy.
8088, 8086: Te CPU z punktu widzenia programisty są identyczne. Były to CPU używane w najwcześniejszych
PC. Dostarczały kilu 16 bitowych rejestrów: AX,BX, CX,DX, SI, DI, BP, SP,CS, DS., SS, ES,IP, FLAGS.
Udostępniały one tylko jeden megabajt pamięci i działały tylko w trybie rzeczywistym. W trybie tym program
może uzyskać dostęp do adresu pamięci nawet w pamięci innych programów! Czyni to debuggowanie i ochronę
bardzo trudnymi. Również pamięć programu musi być podzielona na segmenty. Każdy segment nie może być
podzielony na więcej niż 64Kb.
80286: Te CPU były używane w pecetach klasy AT. Dodały one kilka nowych instrukcji do bazowego języka
maszynowego 8088/8086. Jednakże, ich nową główną cechą był 16 bitowy tryb chroniony. W trybie tym, można
uzyskać dostęp do 16 megabajtów i chronić programy przed dostępem z innej pamięci. Jednakże programy są
jeszcze dzielone na segmenty, które nie mogą być większe niż 64Kb.
80386: Te CPU wielce poprawiły 80286. Po pierwsze, rozszerzyły wiele z rejestrów do przechowywania 32
bitów (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP,EIP) i dodały dwa nowe 16 bitowe rejestry FS i GS.
Dodały również
AX
AH
AL
Rysunek 1.5: rejestr AX
nowy 32 bitowy tryb chroniony. W trybie tym, można uzyskać dostęp do 4 gigabajtów. Programy są znów
dzielone na segmenty, ale teraz każdy segment może również być poszerzony do rozmiarów 4 gigabajtów!
80486/Pentium/Pentium Pro: Ci członkowie rodziny 80x86 dodali bardzo niewiele nowych cech. Głownie
przyspieszone zostało wykonywanie instrukcji.
Pentium MMX: procesor ten dodał instrukcje MMX (MultiMedia eXtension) do Pentium. Instrukcje te mogą
przyspieszać operacje graficzne.
Pentium II: Jest to procesor Pentium Pro z dodanymi instrukcjami MMX (Pentium III jest zasadniczo szybszym
Pentium II)
1.2.4 16 bitowe rejestry 8086
Oryginalne CPU 8086 dostarczały czterech 16 bitowych rejestrów ogólnego przeznaczenia: AX, BX,
CX i DX. Każdy z tych rejestrów mógł być rozbity na dwa 8 bitowe rejestry. Na przykład rejestr AX mógł być
rozbity na rejestry AH i AL jak pokazuje rysunek 1.5. rejestr AH zawiera górne (lub wyższe) 8 bitów AX a AL
zawiera niższe 8 bitów AX. Często AH i AL są używane jako niezależne jednobajtowe rejestry; jednakże ważne
jest uświadomienie sobie jeden rzeczy, one nie są niezależne od AX. Zmiana wartości AX powoduje zmianę
AH i AL i vice versa. Rejestry ogólnego przeznaczenia są używane przez wiele instrukcji przemieszczenia i
arytmetycznych.
Są dwa 16-bitowe rejestry indeksowe : SI i SI. Są one często używane jako wskaźniki, ale mogą być
używane do tych samych celów jak rejestry ogólne. Jednakże, nie mogą być rozłożone na rejestry 8 bitowe.
16 bitowe rejestry BP i SP są używane do wskazywania danych na stosie języka maszynowego. Będzie
to omawiane później.
16 bitowe rejestry CS, DS., SS i ES są rejestrami segmentowymi, Określają jaka pamięć jest używana
dla różnych części programu. CS oznacza Segment Kodu, DS. Segment Danych, SS Segment Stosu a ES
Segment Dodatkowy. ES jest używany jako czasowy rejestr segmentowy. Szczegóły o tych rejestrach są zawarte
w sekcji 1.2.6 i 1.2.7
27427849.004.png
Zgłoś jeśli naruszono regulamin