Lekcja Assemblera 3

in #polish7 years ago

Temat:
Bity,bajty,słowa- słowem pamięć.

Zacznijmy od czegoś co bardzo trudno sobie uświadomić. Bit to podstawowa jednostka informacji, pojedyncza cyfra binarna 1 albo 0. I wszystko jest spoko dopóki te bity są jakieś wirtualne, nienamacalne. Problem jednak polega na tym że każdego jednego bitu w komputerze można dotknąć. Bit nagle przestaje być cyfrą a staje się zestawem tranzystorów, kondensatorem, żyłą czy falą.

Bajtem nazwiemy 8 takich bitów "obok siebie".
Słowo to ilość informacji którą procesor może obrobić na raz.
Intel 4004 pierwszy cywilny mikroprocesor miał słowo 4 bitowe, a omawiany 8086 ma słowo 16 bit.
Historia zna wynalazki o słowach dowolnej szerokości i 10bit to nie najdziwniejsze co było.

Taka definicja słowa jest problematyczna głównie dlatego że Intel używa przewrotnego nazewnictwa.
Mimo że i386 miał słowo 32bitowe a AMD64 64bitowe to w świecie x86 słowem nazywamy 16 bitów.
Jak więc Intel nazywa kolejne wielkości "słowa" ?

1 bajt to po prostu bajt i definiujemy go dyrektywą db (define byte)
2 bajty to słowo (zgodnie z 8086) definiujemy dyrektywą dw (define word)
4 bajty, słowo 32 bitowe (i386) definiujemy dyrektywą dd (define dubleword)
8 bajtów czyli 64bity definiujemy dyrektywą dq (define quadword)

i odpowiadają temu rejestry
1- AL,AH,BL,BH,CL,CH,DL,DH
2- AX,BX,CX,DX,SP,DI,SI,BP,IP
4- EAX,EBX,ECX,EDX,ESP,EDI,ESI,EBP,EIP // dostępne od i386
8- RAX,RBX,RCX,RDX,RSP,RDI,RSI,RBP,RIP,R8,R9,R10,R11,R12,R13,R15 //dostępne od AMD64
widzimy że tryb 64 bitowy dodaje nam poza szerokością dodatkowe rejestry ogólnego przeznaczenia.

87654321bajt
RAXRAXRAXRAXRAXRAXRAXRAX
EAXEAXEAXEAX
AXAX
AHAL

Tak to mniej więcej wygląda na przykładzie rejestru akumulatora.
i jest to jedne rejestr, co często umyka uwadze młodych programistów.
ZMIANA WARTOŚCI NP. AX SPOWODUJE ZMIANĘ RÓWNIEŻ RAX,EAX,AX,AL,AH BO TO FIZYCZNIE JEDEN REJESTR.

Wszystko to spoko tylko że pamięć zbudowana jest w architekturze bajtowej. Oznacza to że najmniejszą
a zarazem jedyną cegiełką budującą pamięć jest 1 bajt. Jak zapisać więc np słowo w RAMie?
Tu mamy 2 opcje
Little endian i Big endian
Big endian to przepisanie na żywca, a little endian to zapisanie mniejsze niżej a więc odwrotnie.
sądzę że najlepiej będzie jak zapiszemy do pamięci wartość 0x12345678

_____
0x000x010x020x03Adres
0x120x340x560x78Big Endian
0x780x560x340x12Little endian

Po co to tak odwrócono? taki zapis ułatwia przycinanie.
wyobraźmy sobie że ładujemy zmienną z pamięci z pod adresu 0x00 do rejestru.
przy załadowaniu do rejestru 32 bitowego nie ma problemu, a co jak byśmy potrzebowali tylko najmłodszy bajt?
w przypadku Big Endian możemy załadować do rejestr 32 bit i potem dopiero patrzeć na najmłodsze 8 bitów by odczytać. Nie jest to zbyt praktyczne, dlatego stosuje się little Endian gdzie chcąc załadować kilka młodszych bajtów starczy załadować do odpowiedniego rejestru i już.
Mam nadzieję, że to jest jasne.

Ok omówiliśmy więc rejestry i spróbowaliśmy spojrzeć na pamięć, zanim przyjrzymy się jak zbudowane
są inne pamięci zobaczmy jak się je szereguje.

dla porządku "przepisze tu ten obrazek"
L0- najszybsze,najmniejsze,najdroższe: Rejestry
L1- Cache wykonywany w technologi SRAM, szybszy i mniejszy z 2
L2- Cache wykonywany w technologi SRAM, wolniejszy i większy z 2
L3- Pamięć RAM w technologi DRAM.
L4- Pamięć masowa....

SRAM(Cache) i DRAM(RAM) czym to się różni?

Budowa komórki:
SRAM StaticRandomAccessMemory składa się z 2 zapętlonych bramek NOT, pamięć ta nie znika po odczycie

DRAM DynamicRandomAccessMemory składa się z kondensatora którego naładowania trzeba pilnować i jego stan jest tracony przy odczycie, zatem musi automatycznie nastąpić jeszcze zapis, a to kosztuje nas czas.

Jak więc widzimy pamięć SRAM wymaga od nas więcej zasilania, ale za to jest prostsza w użyciu i szybsza.

Organizacja:
I tu spokojnie z punktu widzenia programisty CAŁA pamięć wygląda jak DRAM, więc nie przerażać się
SRAM:
jest tablicą asocjacyjną odzwierciedlającą cały RAM. Pewno zapytasz jak zmieścić 16GB w 8MB i odpowiedź brzmi nie da się.
Każdy wiersz takiej pamięci składa się z 1 lub więcej kanałów wyglądających tak:

__
@Etykietadane,dane,dane,dane

więc pamięć 2 kanałowa wygląda tak:

____
@Etykietadane,dane,dane,dane@Etykietadane,dane,dane,dane

DRAM:
Tu mamy jedną wielką przestrzeń, podajesz adres dostajesz dane, tak prosto.

Odczyt/Zapis:
SRAM:
Adres dzielimy na pola

___
@EtykietaWierszoffset

Następnie idziemy do wiersza Wiersz porównujemy znalezioną tam wartość @Etykieta z tą jaką mamy
w Adresie. Jak pasuje to czytamy wskazaną przez offset kolumnę z danymi. Przy pamięci wielokanałowej wykonujemy ten krok dla każdego z kanałów. Jak trafimy to spoko. Jeśli jednak nie uda nam się trafić przechodzimy do odczytu z pamięci DRAM. Przed tym jednak należy odłożyć wiersz z pamięci Cache do RAMu i dopiero wtedy załadować kilka bajtów na jego miejsce. Jak więc widać pudło nas dużo kosztuje. W pamięci cache są jeszcze bity informujące o ważności tego co się tam znajduje oraz statystyczne pomagające podjąć decyzje co wywalić z tej pamięci a co zachować.
DRAM
Wystawiamy sygnał RAS Row Adress Strobe by wskazać "kolumnę" z której czytamy
Potem czekamy chwilę i wystawiamy sygnał CAS Column Adress Strobe by pobrać odpowiedni wiersz.
Sygnał CAS można podać kilkakrotnie.
Z uwagi na wydajność podczas takiego żądania wysyłane jest kilka bajtów do procesora. Po wysłaniu sygnału CAS musimy poczekać chwilkę na dane, czas wyrażony w cyklach jaki to zajmuje jest parametrem kości nazwanym CL (CAS Latency). Dlatego jest to ważny parametr pamięci jeśli ktoś chce się brandzlować pod #pcmasterrace

Taka a nie inna organizacja pamięci Cache ma sens z uwagi na 2 bardzo ważne zasady wynikłe z obserwacji:

  1. zasada lokalności przestrzennej
  2. zasada lokalności czasowej
    obie te zasady sprowadzają się do tego że program będzie kręcił się wśród małej ilości danych a ewentualne skoki będą wykonywanie nie daleko.

Na koniec kilka uwag dot tego co widzi programista a co jest w rzeczywistości.
Programista widzi 4GB pamięci wirtualnej w trybie 32 bit. Odzwierciedlenie tego na pamięć rzeczywistą
to wyższa szkoła jazdy i używa się do tego takich wymyślnych rzeczy jak strony pamięci upakowane w katalogi itd. Taka organizacja pozwala implementować SWAP na Linuksie i Plik wymiany w Windows Jeśli jesteście zainteresowani jak ta cała magia z pamięcią wirtualną chętnie opiszę, ale w innym wpisie ten jest nazbyt długi.

To co powinieneś pamiętać po tej lekcji to:

  1. Można odwołać się do młodszej części rejestru jednak AX to kawałek rejestru EAX a nie osobny rejestr.
  2. Co znaczy Little endian i Big Endian oraz jak zapisywane są dane
  3. Masz 4GB ramu a na resztę jako programista masz wyjebane.
  4. Jeśli składasz mocnego PC spójrz na wielkość pamięci Cache procesora oraz CL w pamięci RAM

Za dotrwanie do tego miejsca ciekawostka:

Angielskie nazwy big endian i little endian pochodzą z książki Jonathana Swifta Podróże Guliwera i odnoszą się do mieszkańców Liliputu, których spór o to czy ugotowane jajko należy tłuc od grubego (tępego), czy od cienkiego (ostrego) końca, doprowadził do podziału na dwa stronnictwa toczące ze sobą niekończące się, choć bezsensowne, dysputy i wojny.

No i jak zwykle chce poznać waszą opinie na temat tej lekcji, co jest nie jasne a czego było za dużo?

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 63030.98
ETH 2594.62
USDT 1.00
SBD 2.74