Asembler

program tłumaczący język asemblera na kod maszynowy

Asembler (z ang. assembler) – termin informatyczny związany z programowaniem i tworzeniem kodu maszynowego dla procesorów. W języku polskim oznacza on program tworzący kod maszynowy na podstawie kodu źródłowego (tzw. asemblacja) wykonanego w niskopoziomowym języku programowania bazującym na podstawowych operacjach procesora zwanym językiem asemblera, popularnie nazywanym również asemblerem[1].

W tym artykule język programowania nazywany będzie językiem asemblera, a program tłumaczący – asemblerem.

Język asemblera edytuj

Języki asemblera (zwyczajowo asemblery) to rodzina języków programowania niskiego poziomu, których jedno polecenie odpowiada zasadniczo jednemu rozkazowi procesora. Języki te powstały na bazie języków maszynowych danego procesora poprzez zastąpienie kodów operacji ich mnemonikami. Dzięki stosowaniu kilkuliterowych skrótów poleceń zrozumiałych dla człowieka pozwala to z jednej strony na tworzenie oprogramowania, 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 od architektury 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ę kolejnych ję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 na komputery osobiste. Jednak istnieją zastosowania, np. w przypadku programowania mikrokontroleró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ów systemów operacyjnych.

Ekstrakod edytuj

W niektórych językach asemblera występują mnemoniki, tzw. ekstrakody[2], którym nie odpowiadają instrukcje procesora, lecz są realizowane programowo, zwykle przez funkcje systemu operacyjnego lub biblioteczne.

Perspektywa historyczna edytuj

Języki asemblera i ich użycie sięgają aż do czasów wprowadzenia zapisywanych programów komputerowych. Pierwszy język asemblera został opracowany w 1947 roku przez Kathleen Booth dla ARC2 w Birkbeck, po współpracy z Johnem von Neumannem i Hermanem Goldstine’em w Instytucie Studiów Zaawansowanych w Princeton. W 1949 EDSAC posiadał asemblera nazwanego rozkazami początkowymi wykorzystującego jedno-literowe mnemoniki. SOAP był językiem asemblera dla komputera IBM 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 one programistó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 przez ję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 to sterowniki urządzeń, niskopoziomowe systemy wbudowane oraz systemy 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 typu mainframe IBM, napisanego przez duże korporacje. Ostatecznie wyparły je COBOL, FORTRAN i niektóre PL/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 PC DOS, kompilator Turbo Pascal oraz wczesne aplikacje, takie jak program do arkuszy kalkulacyjnych Lotus 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 z Sega Saturn, konsoli która była znana z notorycznie trudnego tworzenia gier. Gra NBA 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 jak MSX, Sinclair ZX 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.

Bieżące użycie edytuj

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. W przypadku optymalizacji prędkości, używane są nowoczesne kompilatory optymalizacyjne do renderowania języków wysokiego poziomu do kodu, który może działać tak szybko, jak ręcznie napisany asembler[4]. Pomimo kontrprzykładów, które można znaleźć, złożoność nowoczesnych procesoró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 edytuj

Asembler (ang. assemble – składać) to program dokonujący tłumaczenia języka asemblera na język maszynowy, czyli tzw. asemblacji. Jest to odpowiednik kompilatora dla ję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 wersji języka C.

Przykład edytuj

Do najpopularniejszych odmian języka asemblera, ze względu na popularność architektury Intela znanej pod nazwą x86-64, zaliczyć można Asembler x86-64. Do najpopularniejszych asemblerów zalicza się NASM, TASM oraz MASM, jak również FASM i GASM.

Kod edytuj

Przykładowe polecenia (mnemoniki) w języku Asembler x86-64 (x64):

;do rejestru RAX wpisz wartość natychmiastową 02h
mov rax, 02h
;do rejestru RCX wpisz wartość z rejestru RAX
mov rcx, rax
;do zmiennej o nazwie var1 wpisz wartość z rejestru RCX
mov var1, rcx
;odłóż wartość z rejestru RAX na stos
push rax
;zdejmij wartość ze stosu i umieść w zmiennej o nazwie var2
pop var2
;do rejestru RBX wpisz adres napisu var3
mov rbx, offset var3
;podmień drugi znak (bajt) w napisie na literę "a"
mov byte ptr [rbx + 1], "a"

Przykładowy kod dla nowoczesnego Asemblera x64 (składnia MASM):

extrn ExitProcess : proc
extrn MessageBoxA : proc

.data
;ciąg bajtów zawierający napis
szText db "Witaj, 64-bitowy świecie!", 0

.code

Main proc
  sub rsp, 28h
  xor r9, r9
  lea r8, szText
  lea rdx, szText
  xor rcx, rcx
  call MessageBoxA
  add rsp, 28h

  ;wyjście z programu
  sub rsp, 8h
  xor rcx, rcx ;kod wyjścia = 0
  call ExitProcess
Main endp

end

Budowanie kodu źródłowego do pliku EXE:

ml64.exe prog1.asm /link /entry:Main /subsystem:windows /defaultlib:"kernel32.Lib" /defaultlib:"user32.Lib"

Historia edytuj

Za pierwowzór pierwszego asemblera uznaje się skonstruowany przez Konrada Zuse w 1945 r. układ elektromechaniczny przygotowania taśmy perforowanej z programem dla maszyny Z4 w postaci modułu Planfertigungsteil, który umożliwiał wprowadzanie oraz odczyt rozkazów i adresów w sposób zrozumiały dla człowieka[6]. Jednak za autorkę pierwszego faktycznego asemblera uznaje się Kathleen Booth[7].

Pierwszym polskim asemblerem był PROBIN komputera XYZ z ok. 1958 r.[8] Do pierwszych szerzej znanych w Polsce asemblerów należy PLAN, wykorzystywany w komputerach Odra, oraz MOTIS, stosowany w maszynach Mera 300.

Zobacz też edytuj

Przypisy edytuj

  1. Słownik terminologiczny informacji naukowej, Maria Dembowska, Wrocław–Warszawa–Kraków–Gdańsk: Zakład Narodowy imienia Ossolińskich, 1979, s. 26.
  2. Wykład z Assemblera. [dostęp 2016-11-05]. (pol.).
  3. The IBM 650, www.columbia.edu [dostęp 2018-01-11].
  4. John Markoff, Writing the Fastest Code, by Hand, for Fun: A Human Computer Keeps Speeding Up Chips, „The New York Times”, 28 listopada 2005, ISSN 0362-4331 [dostęp 2018-01-11] (ang.).
  5. Great Debate I, 16 czerwca 2008 [dostęp 2018-01-11] [zarchiwizowane z adresu 2008-06-16].
  6. Subrata Dasgupta, It Began with Babbage: The Genesis of Computer Science, Oxford University Press, 7 stycznia 2014, p. 191-192., ISBN 978-0-19-930942-9 [dostęp 2020-01-23] (ang.).
  7. David Cassel: Kathleen Booth, Creator of the First Assembly Language. 2022-11-06. [dostęp 2023-01-28].
  8. Jak się programowało XYZ, „Informatyka” nr 8-12/1989.

Bibliografia edytuj

  • Augustyn Jacek: Asemblery: uC51, ADSP-21065L SHARC; Państwowa Wyższa Szkoła Zawodowa w Tarnowie. Instytut Politechniczny. Kraków: Wydawnictwo Instytutu Gospodarki Surowcami Mineralnymi i Energią Polskiej Akademii Nauk, 2006. ISBN 83-89174-39-1.
  • Kruk Stanisław: Asembler. Podstawy programowania w Windows, Jędrzejów: EscapeMagazine.pl, 2007. ISBN 978-83-60320-18-1.
  • Dawid Farbaniec Esencja wiedzy o Asemblerze x64 w błękitnej szklanej fiolce.
  • Marańda Witold, Grzegorz Jabłoński, Mariusz Grecki: Programowanie mikroprocesorów rodziny Motorola 680x0 w języku asemblera: materiały pomocnicze do laboratorium dla kierunków studiów Elektronika i Informatyka, Politechnika Łódzka. Katedra Mikroelektroniki i Technik Informatycznych. Wyd. 2 popr. Łódź: Politechnika Łódzka. Katedra Mikroelektroniki i Technik Informatycznych, 2005. ISBN 83-919289-8-5.
  • Eugeniusz Wróbel: Programowanie w języku asemblera MASM. Gliwice: Wydawnictwo Politechniki Śląskiej, 2006. ISBN 83-7335-313-5.
  • David Salomon Assemblers and Loaders.
  • History of Assembly Language.