Asembler (ang. assembler) – termininformatyczny związany zprogramowaniem i tworzeniemkodu maszynowego dlaprocesorów. W języku polskim oznacza onprogram tworzący kod maszynowy na podstawiekodu źródłowego (tzw.asemblacja) wykonanego wniskopoziomowymjęzyku programowania bazującym na podstawowych operacjach procesora zwanymjęzykiem asemblera, popularnie nazywanym równieżasemblerem[1].
W tym artykule język programowania nazywany będziejęzykiem asemblera, a program tłumaczący –asemblerem.
Języki asemblera (zwyczajowoasemblery) to rodzina języków programowania niskiego poziomu, których jedno polecenie odpowiada zasadniczo jednemurozkazowi procesora. Języki te powstały na baziejęzyków maszynowych danego procesora poprzez zastąpieniekodów operacji ichmnemonikami. Dzięki stosowaniu kilkuliterowych skrótów poleceń zrozumiałych dla człowieka pozwala to z jednej strony na tworzenieoprogramowania, z drugiej strony bezpośrednia odpowiedniość mnemoników oraz kodu maszynowego umożliwia zachowanie wysokiego stopnia kontroli programisty nad działaniem procesora. Składnia języka asemblera zależy odarchitektury procesora, ale i używanego asemblera, jednak zwykle autorzy asemblerów dla danego procesora trzymają się oznaczeń danych przez producenta.
Pierwotnie był to podstawowy język programowania procesorów. W wyniku poszukiwania efektywniejszych metod programowania i pojawiania się kolejnychjęzyków interpretowanych i kompilowanych języki asemblerów straciły na znaczeniu. Z tego powodu współcześnie nie korzysta się z nich do pisania całych programów nakomputery osobiste. Jednak istnieją zastosowania, np. w przypadku programowaniamikrokontrolerów,systemów wbudowanych, sterowników sprzętu, gdzie nadal znajdują one swoje miejsce. Korzysta się z nich także do pisania kluczowych fragmentów kodu wymagających najwyższej wydajności, wyjątkowo małych rozmiarów kodu wynikowego lub również niewielkich fragmentówsystemów operacyjnych.
W niektórych językach asemblera występują mnemoniki, tzw.ekstrakody[2], którym nie odpowiadają instrukcje procesora, lecz są realizowane programowo, zwykle przez funkcjesystemu operacyjnego lubbiblioteczne.
Języki asemblera i ich użycie sięgają aż do czasów wprowadzenia zapisywanychprogramów komputerowych. Pierwszy język asemblera został opracowany w 1947 roku przezKathleen Booth dla ARC2 wBirkbeck, po współpracy zJohnem von Neumannem iHermanem Goldstine’em wInstytucie Studiów Zaawansowanych w Princeton. W 1949EDSAC posiadał asemblera nazwanego rozkazami początkowymi wykorzystującego jedno-literowe mnemoniki.SOAP(inne języki) był językiem asemblera dla komputeraIBM 650, napisanym przez Stana Poleya w 1955[3].
Języki asemblera eliminują znaczącą część podatnego na błędy, męczącego oraz zajmującego dużo czasu programowania pierwszej generacji, które wymagane było przy wczesnych komputerach. Uwolniły oneprogramistów od zapamiętywania kodów numerycznych oraz ręcznego obliczania adresów. Były kiedyś powszechnie używane, jednak w latach ‘80 i ‘90 ich zastosowanie zostało wyparte przezjęzyki wyższego poziomu, idąc z poszukiwaniem większej efektywności programowania. W dzisiejszych czasach, języki asemblera wciąż są używane do bezpośredniego manipulowania sprzętem, dostępu do specjalnych instrukcji procesora lub do zaadresowania krytycznych problemów optymalizacyjnych.
Typowe zastosowania tosterowniki urządzeń, niskopoziomowe systemy wbudowane orazsystemy czasu rzeczywistego.
Na przestrzeni lat, wiele programów było napisanych całkowicie w językach asemblera.
Burroughs MCP (1961) był pierwszym komputerem, dla którego system operacyjny nie był osadzony wyłącznie na języku asemblera; napisany w ESPOL, z nadzbioru Algol.
Również wiele aplikacji komercyjnych było napisanych w językach asemblera, w tym duża część oprogramowania typumainframe IBM, napisanego przez duże korporacje. Ostatecznie wyparły jeCOBOL,FORTRAN i niektórePL/I, jednak pewna liczba organizacji posiadała strukturę opartą na językach asemblera aż do końca lat ‘90.
Większość wczesnych mikrokomputerów polegała na ręcznym kodowaniu języka asemblera, w tym większość systemów operacyjnych oraz dużych aplikacji. Było tak, ponieważ systemy te posiadały dotkliwe ograniczenia zasobów, narzuconą idiosynkratyczną pamięć i architekturę wyświetlaczy oraz dostarczały ograniczonych, niestabilnych usług systemowych. Być może ważniejszy był brak kompilatorów pierwszej-klasy dla języków wysokopoziomowych, odpowiednich do użycia w mikrokomputerach.
Czynnik psychologiczny również mógł odegrać ważną rolę; pierwsza generacja programistów mikrokomputerów ciągnęła za sobą hobbystyczną postawę „majsterkowicza”.
W bardziej komercyjnym spektrum do najważniejszych powodów użycia języka asemblera zaliczamy jego minimalistyczną postać, minimalną wielkość potrzebnych zasobów, szybkość oraz niezawodność.
Typowe przykłady dużych programów napisanych w języku asemblera w dzisiejszych czasach to system operacyjny IBM PCDOS, kompilatorTurbo Pascal oraz wczesne aplikacje, takie jak program do arkuszy kalkulacyjnychLotus 1-2-3.
Według niektórych ludzi w branży, język asemblera był najlepszym językiem komputerowym do uzyskania najwyższej wydajności zSega Saturn, konsoli która była znana z notorycznie trudnego tworzenia gier. GraNBA Jam(inne języki) z 1993 roku jest kolejnym tego przykładem.
Był również podstawowym językiem programowania wielu popularnych komputerów domowych lat ‘80 i ‘90 (takich jakMSX,SinclairZX Spectrum,Commodore 64,Commodore Amiga,Atari ST). Było tak w dużej części przez to, że dialekty BASIC-a na tych systemach nie oferowały dostatecznej szybkości wykonania oraz niewystarczającego zaplecza, aby w pełni wykorzystać potencjał sprzętu na tych komputerach. Niektóre systemy mają nawet zintegrowane środowisko programistyczne (IDE) z wysoko rozwiniętymi funkcjami debugowania i macro.
Od zawsze debatowano nad użytecznością i wydajnością języka asemblera w stosunku do języków wysokopoziomowych. Ma on określone zastosowania niszowe tam, gdzie jest to ważne.
Asembler może być użyty do optymalizacji prędkości lub rozmiaru. Również współczesnekompilatory optymalizacyjne mają wbudowane metodyoptymalizacji prędkości, dzięki którym tworzą kod działający równie szybko, jak kod ręcznie napisany w języku asemblera[4], oraz optymalizacji rozmiaru, tworzące kod wolniejszy, za to o minimalnej długości. Pomimo kontrprzykładów, które można znaleźć, złożoność nowoczesnychprocesorów i podsystemów pamięci sprawia, że efektywna optymalizacja staje się coraz trudniejsza dla kompilatorów, a także programistów montażowych[5].
Asembler (ang.assemble – składać) to program dokonujący tłumaczenia języka asemblera najęzyk maszynowy, czyli tzw.asemblacji. Jest to odpowiednikkompilatora dlajęzyków wyższych poziomów. Program tworzony w innych językach programowania niż asembler jest zwykle kompilowany do języka asemblera (w wyniku pracy kompilatora), a następnie zamieniany na kod binarny przez program asemblera.
Powtarzające się często schematy programistyczne oraz wstawiane fragmenty kodu doprowadziły do powstania tzw.makroasemblerów, które rozszerzają asemblery o obsługę makr przed właściwą asemblacją, co zbliża je nieco do pierwszych wersjijęzyka C.
Do najpopularniejszych odmian języka asemblera, ze względu na popularność architekturyIntela znanej pod nazwąx86-64, zaliczyć możnaAsembler x86-64. Do najpopularniejszych asemblerów zalicza sięNASM,TASM orazMASM, jak równieżFASM iGASM.
Przykładowe polecenia (mnemoniki) w języku Asembler x86-64 (x64):
;do rejestru RAX wpisz wartość natychmiastową 02hmovrax,02h;do rejestru RCX wpisz wartość z rejestru RAXmovrcx,rax;do zmiennej o nazwie var1 wpisz wartość z rejestru RCXmovvar1,rcx;odłóż wartość z rejestru RAX na stospushrax;zdejmij wartość ze stosu i umieść w zmiennej o nazwie var2popvar2;do rejestru RBX wpisz adres napisu var3movrbx,offsetvar3;podmień drugi znak (bajt) w napisie na literę "a"movbyteptr[rbx+1],"a"
Przykładowy kod dla nowoczesnego Asemblera x64 (składnia MASM)[6][7]:
extrnExitProcess:procextrnMessageBoxA:proc.data;ciąg bajtów zawierający napisszTextdb"Witaj,64-bitowyświecie!",0.codeMainprocsubrsp,28h;alokacja stosu / shadow space (4 parametry + adres powrotny + wyrównanie do 16 bajtów)xorr9,r9;styl okna dialogowegolear8,szText;tytuł oknaleardx,szText;tekst w okniexorrcx,rcx;uchwyt okna nadrzędnegocallMessageBoxAaddrsp,28h;dealokacja stosu / shadow space (niekonieczne przy ExitProcess, wymagane przy ret);wyjście z programuxorrcx,rcx;kod wyjścia = 0callExitProcessMainendpend
Budowanie kodu źródłowego do pliku EXE:
ml64.exeprog1.asm/link/entry:Main/subsystem:windows/defaultlib:"kernel32.Lib"/defaultlib:"user32.Lib"
Za pierwowzór pierwszego asemblera uznaje się skonstruowany przezKonrada Zuse w 1945 r.układ elektromechaniczny przygotowaniataśmy perforowanej z programem dla maszynyZ4 w postaci modułuPlanfertigungsteil, który umożliwiał wprowadzanie oraz odczyt rozkazów iadresów w sposób zrozumiały dla człowieka[8]. Jednak za autorkę pierwszego faktycznego asemblera uznaje sięKathleen Booth[9].
Pierwszym polskim asemblerem byłPROBIN komputeraXYZ z ok. 1958 r.[10]Do pierwszych szerzej znanych w Polsce asemblerów należyPLAN, wykorzystywany w komputerachOdra, orazMOTIS, stosowany w maszynachMera 300.
| Zobacz publikację Asembler w Wikibooks |
| Zobacz hasłoasembler w Wikisłowniku |