Wstęp do assemblera MA51 Ryszard J. Barczyński, 2017 Politechnika Gdańska, Wydział FTiMS, Katedra Fizyki Ciała Stałego Materiały dydaktyczne do użytku wewnętrznego
Assembler Assembler to język programowania charakteryzujący się tym, że... jedna instrukcja assemblera jest tłumaczona na jeden rozkaz procesora... możliwy jest bezpośredni dostęp do wszystkich zasobów systemu... praktycznie każda architektura procesora posiada własny assembler Assemblery zwykle pracują we współpracy z linkerami, bibliotekarzami itp. Assemblery zwykle często posiadają wbudowane generatory makrodefinicji
Assembler (proces tworzenia programu)
Assembler (wiersze) Program w assemblerze składa się z wierszy. Wiersz może pełnić rolę... instrukcji... dyrektyw (wpływają na utworzony kod)... dyrektyw sterujących (wpływają na przykład na formaty listingu) Każdy wiersz może być zakończony komentarzem Komentarz rozpoczyna się znakiem ; Pusty wiersz jest ignorowany (może zawierać komentarz).
Assembler (słowa kluczowe) Słowa kluczowe to symbole używane przez assembler do specjalnych celów Słowa zwykle nie mogą być przedefiniowywane i używane w innym celu Typowo w skład słów kluczowych wchodzą... mnemoniki instrukcji (MOX, XOR, itp)... symbole dyrektyw (ORG, DB, DS, itp)... (niekiedy) symbole elementów architektury procesora (A, B, IDATA, itd)... inne symbole (ELSE, GT, LT itp)
Assembler (symbole) Symbol jest w zasadzie nazwą wielkości numerycznej Symbole mogą zawierać litery, cyfry i znaki $, _ i? Symbole nie mogą zaczynać się od cyfry Wielkość liter zwykle jest ignorowana (uwaga!) Długość symbolu jest dowolna, ale... assemblery zwykle analizują pewną liczbą początkowych znaków Symbol $ ma znaczenie specjalne i oznacza adres aktualnej instrukcji Symbole są określone w całym tekście programu (wieloprzebiegowość)
Assembler (etykiety) składnia moja_etykieta: Etykieta jest symbolem oznaczającym określone miejsce w programie Etykieta może się odnosić do:... kodu programu... pamięci danych (wewnętrznej i zewnętrznej)... stałej w kodzie programu
Assembler (operandy) Operandy to argumenty instrukcji i dyrektyw. Operandy mogą być podzielona na... operandy numeryczne, znakowe i łańcuchy znaków... wskaźnik adresu ($)... rejestry (również takie jak C czy DPTR)
Assembler (operandy numeryczne, znakowe, łańcuchy) Operandy numeryczne... rozpoczynają się od cyfry.... mogą zawierać ostatnią literę oznaczającą bazę (B, H, O, D) Operandy znakowe zawierają jeden lub dwa znaki ASCII umieszczone w ' ' Łańcuch znakowy to napis ograniczony ' '... może być umieszczony tylko w dyrektywie DB
Assembler (wyrażenia numeryczne) W miejscu operandów numerycznych mogą wystąpić wyrażenia. Wyrażenia są obliczane przez assembler w trakcie assemblacji. Wyrażenie jest kombinacja operandów i operatorów. Wyrażenie może dać w wyniku symbol relokowalny. Uwaga na zakresy wielkości liczbowych!!! W wielu assemblerach nie należy traktować zbyt poważnie kolejności działań
Assembler (operatory arytmetyczne) + (dodawanie exp + exp) (odejmowanie exp exp) * (mnożenie exp * exp) / (dzielenie exp / exp) MOD (reszta exp MOD exp)
Assembler (operatory porównania) GTE lub >= (np. exp >= exp) GT lub > (np. exp GT exp) LTE lub <= (np. exp LTE exp) LT lub < (np. exp LT exp) EQ lub = (np. exp EQ exp) NE (np. exp NE exp)
Assembler (operatory przesunięcia) SHR (exp SHR exp) SHL (exp SHL exp)
Assembler (operatory logiczne) AND (exp AND exp) OR (exp OR exp) XOR (exp XOR exp)
Assembler (operatory unarne) + NOT (bitowe) LOW (młodszy bajt) HIGH (starszy bajt)
Assembler (priorytety operatorów)
Assembler (nazwy obszarów pamięci) CODE obszar pamięci programu XDATA zewnętrzna pamięć danych DATA wewnętrzna pamięć danych (0..7Fh) IDATA wewnętrzna pamięć danych adresowana pośrednio (0..0FFh) BDATA wewnętrzna pamięć adresowalna bitowo (20h..2Fh) BIT bity w pamięci adresowalnej bitowo (0..7Fh)
Assembler (segmenty) Zarządzanie pamięcią w assemblerze odbywa się za pomocą segmentów. Segmenty mogą... być umieszczone w stałym miejscu pamięci (segmenty absolutne)... być relokowalne (o ich dokładnym adresie decyduje linker) Segmenty mogą być definiowane we wszystkich rodzajach pamięci O metodzie dostępu pamięci segmentu decyduje oczywiście jej rodzaj Różne assemblery mogą się różnić w sposobie deklaracji segmentów
Assembler (segmenty absolutne) Składnia: BSEG [AT addr] CSEG [AT addr] DSEG [AT addr] IDSEG [AT addr] XSEG [AT addr] Przy braku adresu jest użyty kolejny adres w segmencie określonego typu... lub adres początkowy pamięci, jeżeli jest to pierwsze użycie Dyrektywa ORG służy do określania adresu w aktualnym segmencie Składnia: ORG exp
Assembler (segmenty relokowalne) Składnia: seg_name SEGMENT seg_type [reloc_type] seg_type: BIT, CODE, DATA, IDATA, XDATA reolc_type: BITADDRESSABLE, INBLOCK, INPAGE,... OVERLAYABLE, PAGE, UNIT
Assembler (definiowanie symboli) Składnia: symbol BIT exp symbol CODE exp symbol DATA exp symbol IDATA exp symbol XDATA exp oraz NUMBER symbol exp... (nie zalecane; stała 16 bitów)
Assembler (rezerwowanie pamięci) Składnia: [lab] DBIT exp [lab] DS exp Możliwa jest rezerwacja pewniej liczby... bitów w obszarze adresowanym bitowo... bajtów w wewnętrznej pamięci danych
Assembler (inicjalizowanie pamięci w segmencie kodu) Składnia: [lab] DB exp [, exp...] [lab] DW exp [, exp...] Dyrektywa DB dotyczy bajtów, znaków i łańcuchów Dyrektywa DW dotyczy słów 16 bitowych
Assembler (zmienne assemblera) Składnia: symb SET exp symb SET reg Zmienna assemblera może przejmować wartość numeryczną... lub nazwę rejestru
Assembler (stałe assemblera) Składnia: symb EQU exp symb EQU reg Stała assemblera może przejmować wartość numeryczną... lub nazwę rejestru
Assembler (instrukcje CALL i JMP) Lista rozkazów procesora X51 zawiera różne rozkazy skoków... (LJMP, AJMP) JMP jest dyrektywą assemblera, który wybierze skok optymalny. Podobnie CALL zostanie zamieniony na jeden z... ACALL, LCALL
Assembler (pliki) Składnia: [$]INCLUDE (Nazwa_pliku) Skrót: [$]IC Możliwa jest wielopoziomowość włączania plików Należy uważać na cykliczność włączeń
Assembler (assemblacja warunkowa) Składnia: IF exp... ENDIF IF exp... ELSE... ENDIF IF exp... ELSEIF exp... ELSE... ENDIF (bloków z ELSEIF może być wiele)
Assembler (dyrektywy dla linkera) Składnia: PUBLIC symbol [, symbol...] EXTERN seg_typ symbol [, symbol...] seg_typ to CODE, DATA, IDATA, BIT, XDATA, NUMBER Potrzeba stosowania tych dyrektyw występuje gdy używamy symboli zdefiniowanych w innym module.
Assembler (przykłady) $INCLUDE(PROTOCOL.ASM) ; ; Scoreboard type parameters ; ; *** Do10th SET 0 ; 10 th of second is installed Do30s SET 1 ; 30 sec aux clock is installed IsAthl SET 0 ; Athletics Radio SET 1 ; Radio modem is installed ; ; Game limits ; MaxRes EQU 199 ; Max number of displayed points MaxSet EQU 9 ; Max number of set number MaxHlf EQU 9 ; Max number of half
Assembler (przykłady) If (TAB904=1) ; ; Keyboard definition for foil keyboard ; KRow0 EQU P1.4 KRow1 EQU P1.5 KCol EQU P3 ; Else ; Hall keyboard ; KPointA EQU 005h KPointB EQU 012h ; Key bank selectors KBank0 EQU P3.6 KBank1 EQU P3.7 EndIf
Assembler (przykłady) LstKey: DS 1 ; The last key pressed TheKey: DS 1 ARCnt: DS 1 ; Autorepeat counter ; ClkTic: DS 1 ; Ticks for fancy displays ClkMin: DS 1 ; Main clock minutes ClkSec: DS 1 ; Main clock seconds Clk100: DS 1 ; Main clock 100 th of second ClkD10: DS 1 ; Displayed 10th of second
Assembler (przykłady) ;============================================================= CSEG ; BEGIN: JMP START ; ORG BEGIN+0Bh ; Timer 0 int. vector JMP TINTER ; CRStr: DB ' TAB 905 v.1.3.4 ', 00Dh, 00Ah, 000h
Assembler (koniec...) Składnia: END Dyrektywa END kończy tekst źródłowy modułu (Pominęliśmy dzisiaj wiele rzadziej stosowanych dyrektyw)