Konfiguracja sprzętu i oprogramowania

Podstawowe komponenty asemblera i struktura poleceń. Polecenia asemblera (Wykład)

Temat 1.4 Mnemotechnika asemblera. Struktura i formaty poleceń. Rodzaje adresowania. Zestaw instrukcji mikroprocesora

Plan:

1 Język asemblera. Podstawowe koncepcje

2 Symbole języka asemblera

3 Rodzaje instrukcji asemblera

4 dyrektywy montażowe

5 Zestaw instrukcji procesora

1język programowania. Podstawowe koncepcje

język programowaniajest symboliczną reprezentacją języka maszynowego. Wszystkie procesy w maszynie na najniższym poziomie sprzętowym są sterowane wyłącznie poleceniami (instrukcjami) języka maszynowego. Z tego jasno wynika, że ​​pomimo wspólnej nazwy, język asemblera dla każdego typu komputera jest inny.

Program w języku asemblerowym to zbiór bloków pamięci zwanych segmenty pamięci. Program może składać się z jednego lub więcej takich segmentów bloków. Każdy segment zawiera zbiór zdań językowych, z których każdy zajmuje oddzielny wiersz kodu programu.

Oświadczenia montażowe są czterech typów:

1) polecenia lub instrukcje które są symbolicznym odpowiednikiem poleceń maszynowych. Podczas procesu translacji instrukcje asemblera są konwertowane na odpowiednie polecenia zestawu instrukcji mikroprocesora;

2) makra -zdania tekstu programu, które są w pewien sposób sformalizowane i są zastępowane innymi zdaniami podczas emisji;

3) dyrektywy,które są instrukcjami dla tłumacza asemblera, aby wykonał pewne czynności. Dyrektywy nie mają odpowiedników w reprezentacji maszynowej;

4) linie komentarza , zawierający dowolne znaki, w tym litery alfabetu rosyjskiego. Komentarze są ignorowane przez tłumacza.

­ Struktura programu montażowego. składnia asemblera.

Zdania tworzące program mogą być konstrukcją składniową odpowiadającą poleceniu, makro, dyrektywie lub komentarzowi. Aby tłumacz asemblera mógł je rozpoznać, muszą być uformowane zgodnie z pewnymi regułami składniowymi. W tym celu najlepiej jest użyć formalnego opisu składni języka, podobnie jak zasad gramatyki. Najczęstsze sposoby podobny opis język programowania - diagramy składni oraz rozszerzone formy Backusa-Naura. Do praktyczne użycie wygodniejszy diagramy składni. Na przykład, składnia instrukcji języka asemblerowego może być opisana za pomocą diagramów składni pokazanych na poniższych rysunkach 10, 11, 12.

Rysunek 10 - Format zdania zespołu


­ Rysunek 11 - Format dyrektyw

­ Rysunek 12 - Format poleceń i makr

Na tych rysunkach:

­ Nazwa etykiety- identyfikator, którego wartością jest adres pierwszego bajtu zdania kodu źródłowego programu, który oznacza;

­ Nazwa -identyfikator, który odróżnia tę dyrektywę od innych dyrektyw o tej samej nazwie. W wyniku przetworzenia przez asembler pewnej dyrektywy, pewne cechy mogą być przypisane do tej nazwy;

­ kod operacji (COP) i dyrektywa - są to symbole mnemoniczne dla odpowiedniej instrukcji maszynowej, makroinstrukcji lub dyrektywy kompilatora;

­ operandy -części polecenia, makra lub dyrektywy asemblera, oznaczające obiekty, na których wykonywane są akcje. Operandy asemblera są opisywane za pomocą wyrażeń ze stałymi numerycznymi i tekstowymi, etykietami zmiennych i identyfikatorów za pomocą znaków operatora i niektórych słów zastrzeżonych.

Pomoc w diagramach składni znajdź, a następnie przemierz ścieżkę od wejścia diagramu (po lewej) do jego wyjścia (po prawej). Jeśli taka ścieżka istnieje, to zdanie lub konstrukcja są poprawne składniowo. Jeśli nie ma takiej ścieżki, to kompilator nie zaakceptuje tej konstrukcji.

­ 2 symbole języka asemblera

Dozwolone znaki podczas pisania tekstu programów to:

1) wszystkie litery łacińskie: A-Z,a-z. W takim przypadku wielkie i małe litery są uważane za równoważne;

2) liczby od 0 zanim 9 ;

3) znaki ? , @ , $ , _ , & ;

4) separatory , . () < > { } + / * % ! " " ? = # ^ .

Zdania asemblera są tworzone z tokeny, które są syntaktycznie nierozłącznymi sekwencjami prawidłowych znaków językowych, które mają sens dla tłumacza.

tokeny są:

1) identyfikatory - sekwencje poprawnych znaków używane do oznaczania obiektów programu, takich jak kody operacji, nazwy zmiennych i nazwy etykiet. Zasada pisania identyfikatorów jest następująca: identyfikator może składać się z jednego lub więcej znaków;

2) ciągi znaków - sekwencje znaków ujęte w pojedyncze lub podwójne cudzysłowy;

3) liczby całkowite w jednym z następujących systemów liczbowych : binarny, dziesiętny, szesnastkowy. Identyfikacja numerów podczas zapisywania ich w programach asemblera odbywa się według pewnych zasad:

4) liczby dziesiętne nie wymagają dodatkowych symboli do ich identyfikacji, np. 25 lub 139. Do identyfikacji w kodzie źródłowym programu liczby binarne konieczne jest, po wpisaniu zer i jedynek wchodzących w ich skład, umieścić łacinę „ b”, na przykład 10010101 b.

5) Liczby szesnastkowe mają więcej konwencji w notacji:

Po pierwsze składają się z liczb. 0...9 , małe i wielkie litery alfabetu łacińskiego a,b, c,d,mi,f lub A,B,C,D,mi,F.

Po drugie, tłumacz może mieć trudności z rozpoznaniem liczb szesnastkowych, ponieważ mogą one składać się zarówno z cyfr 0...9 (np. 190845), jak i zaczynać się od litery alfabetu łacińskiego (np. ef15). Aby "wyjaśnić" tłumaczowi, że dany leksem nie jest liczbą dziesiętną ani identyfikatorem, programista musi specjalnie przydzielić liczbę szesnastkową. Aby to zrobić, na końcu sekwencji cyfr szesnastkowych, które tworzą liczbę szesnastkową, napisz łacińską literę „ h”. to wymagany warunek. Jeśli liczba szesnastkowa zaczyna się od litery, jest poprzedzona wiodącym zerem: 0 ef15 h.

Niemal każde zdanie zawiera opis przedmiotu, na którym lub za pomocą którego dokonuje się jakiejś czynności. Obiekty te nazywają się operandy. Można je zdefiniować w następujący sposób: operandy- są to obiekty (niektóre wartości, rejestry lub komórki pamięci), na które mają wpływ instrukcje lub dyrektywy, lub są to obiekty, które definiują lub udoskonalają działanie instrukcji lub dyrektyw.

Możliwe jest przeprowadzenie następującej klasyfikacji argumentów:

­ operandy stałe lub natychmiastowe;

­ operandy adresowe;

­ przesunięte operandy;

licznik adresów;

­ operand rejestru;

­ argumenty bazowe i indeksowe;

­ operandy strukturalne;

dokumentacja.

Argumenty to elementarne komponenty, które tworzą część instrukcji maszynowej, oznaczające obiekty, na których wykonywana jest operacja. W bardziej ogólnym przypadku operandy mogą być zawarte jako komponenty w bardziej złożonych formacjach zwanych wyrażenia.

Wyrażenia to kombinacje operandów i operatorów rozpatrywane jako całość. Wynikiem oceny wyrażenia może być adres jakiejś komórki pamięci lub pewna stała (bezwzględna) wartość.

­ 3 Rodzaje instrukcji asemblera

Wymieńmy możliwe typy oświadczenia asemblera i składniowych reguł tworzenia wyrażeń asemblera:

­ operatory arytmetyczne;

­ operatorzy zmian;

­ operatory porównania;

­ operatory logiczne;

­ operator indeksu;

­ operator nadpisania typu;

­ operator redefinicji segmentu;

­ operator nazewnictwa typu struktury;

­ operator do uzyskania części składowej adresu wyrażenia;

­ wyrażenie offset operator pobierania.

1 Dyrektywy montażowe

­ Dyrektywy asemblera to:

1) Dyrektywy segmentacyjne. W trakcie poprzedniej dyskusji odkryliśmy wszystkie podstawowe zasady pisania instrukcji i operandów w programie asemblerowym. Pytanie, jak prawidłowo sformatować sekwencję poleceń, aby tłumacz mógł je przetwarzać, a mikroprocesor mógł je wykonywać, pozostaje otwarte.

Rozważając architekturę mikroprocesora dowiedzieliśmy się, że posiada on sześć rejestrów segmentowych, dzięki którym może pracować jednocześnie:

­ z jednym segmentem kodu;

­ z jednym segmentem stosu;

­ z jednym segmentem danych;

­ z trzema dodatkowymi segmentami danych.

Fizycznie segment jest obszarem pamięci zajmowanym przez polecenia i (lub) dane, których adresy są obliczane względem wartości w odpowiednim rejestrze segmentowym. Opis składniowy segmentu w asemblerze to konstrukcja pokazana na rysunku 13:


­ Rysunek 13 - Opis składniowy segmentu w asemblerze

Należy zauważyć, że funkcjonalność segmentu jest nieco szersza niż po prostu dzielenie programu na bloki kodu, danych i stosu. Segmentacja jest częścią bardziej ogólnego mechanizmu związanego z: koncepcja programowania modułowego. Polega ona na ujednoliceniu konstrukcji modułów obiektowych tworzonych przez kompilator, w tym pochodzących z różnych języków programowania. Pozwala to na łączenie programów napisanych w różnych językach. To jest do realizacji różne opcje taki związek i operandy w dyrektywie SEGMENT są zamierzone.

2) Wykaz dyrektyw kontrolnych. Dyrektywy sterujące listowaniem są podzielone na następujące grupy:

­ ogólne dyrektywy kontrolne listowania;

­ dyrektywy wyjściowe zawierające listę plików;

­ dyrektywy wyjściowe dla warunkowych bloków montażowych;

­ dyrektywy wyjściowe do listy makr;

­ dyrektywy do wyświetlania informacji o odsyłaczach na liście;

­ dyrektywy dotyczące zmiany formatu aukcji.

2 Zestaw instrukcji procesora

Zestaw instrukcji procesora pokazano na rysunku 14.

Rozważ główne grupy poleceń.

­ Rysunek 14 - Klasyfikacja instrukcji montażu

Polecenia to:

1 Polecenia przesyłania danych. Instrukcje te zajmują bardzo ważne miejsce w zestawie instrukcji dowolnego procesora. Pełnią następujące podstawowe funkcje:

­ zapisanie w pamięci zawartości wewnętrznych rejestrów procesora;

­ kopiowanie treści z jednego obszaru pamięci do drugiego;

­ zapis do urządzeń I/O i odczyt z urządzeń I/O.

W niektórych procesorach wszystkie te funkcje są wykonywane przez pojedynczą instrukcję MOV (dla transferów bajtów - MOVB ) ale z różnymi metodami adresowania operandów.

W innych procesorach oprócz instrukcji MOV istnieje kilka innych poleceń do wykonywania wymienionych funkcji. Polecenia przesyłania danych obejmują również polecenia wymiany informacji (ich oznaczenie oparte jest na słowie Wymieniać się ). Możliwe jest zapewnienie wymiany informacji między rejestrami wewnętrznymi, między dwiema połówkami jednego rejestru ( ZAMIENIAĆ ) lub między rejestrem a komórką pamięci.

2 Polecenia arytmetyczne. Instrukcje arytmetyczne traktują kody operandów jako numeryczne kody binarne lub BCD. Polecenia te można podzielić na pięć głównych grup:

­ komendy do operacji na punkcie stałym (dodawanie, odejmowanie, mnożenie, dzielenie);

­ instrukcje zmiennoprzecinkowe (dodawanie, odejmowanie, mnożenie, dzielenie);

­ polecenia czyszczenia;

­ polecenia inkrementacji i dekrementacji;

­ polecenie porównania.

3 Instrukcje stałoprzecinkowe działają na kodach w rejestrach procesora lub w pamięci, tak jak w przypadku normalnych kodów binarnych. Instrukcje operacyjne zmiennoprzecinkowe (przecinkowe) używają formatu do przedstawiania liczb z wykładnikiem i mantysą (zwykle te liczby zajmują dwie kolejne lokacje w pamięci). W nowoczesnych wydajnych procesorach zestaw instrukcji zmiennoprzecinkowych nie jest ograniczony tylko do czterech operacji arytmetycznych, ale zawiera również wiele innych bardziej złożonych instrukcji, na przykład obliczanie funkcji trygonometrycznych, funkcji logarytmicznych, a także złożone funkcje niezbędne do przetwarzania dźwięku i obrazu.

4 Polecenia Clear mają na celu zapisanie kodu zerowego do rejestru lub komórki pamięci. Polecenia te można zastąpić instrukcjami transferu kodu zerowego, ale specjalne instrukcje kasujące są zwykle szybsze niż instrukcje transferu.

5 Polecenia zwiększania (zwiększania o jeden) i zmniejszania

(obniżki o jeden) są również bardzo wygodne. Zasadniczo można je zastąpić instrukcjami dodawania lub odejmowania, ale inkrementacja i dekrementacja są szybsze niż dodawanie i odejmowanie. Te instrukcje wymagają jednego argumentu wejściowego, który jest również operandem wyjściowym.

6 Instrukcja Compare służy do porównywania dwóch argumentów wejściowych. W rzeczywistości oblicza różnicę tych dwóch operandów, ale nie tworzy operandu wyjściowego, a jedynie zmienia bity w rejestrze stanu procesora na podstawie wyniku tego odejmowania. Instrukcja następująca po instrukcji porównania (zwykle instrukcja skoku) przeanalizuje bity w rejestrze statusu procesora i wykona działania na podstawie ich wartości. Niektóre procesory dostarczają instrukcje do porównywania łańcuchów dwóch sekwencji operandów w pamięci.

7 Polecenia logiczne. Instrukcje logiczne wykonują logiczne (bitowe) operacje na operandach, to znaczy traktują kody operandów nie jako pojedynczą liczbę, ale jako zestaw pojedynczych bitów. W tym różnią się od poleceń arytmetycznych. Polecenia logiczne wykonują następujące podstawowe operacje:

­ logiczne AND, logiczne OR, dodawanie modulo 2 (XOR);

­ przesunięcia logiczne, arytmetyczne i cykliczne;

­ sprawdzanie bitów i operandów;

­ ustawianie i kasowanie bitów (flag) rejestru stanu procesora ( PSW).

Instrukcje logiczne umożliwiają obliczanie bit po bicie podstawowych funkcji logicznych na podstawie dwóch argumentów wejściowych. Ponadto operacja AND służy do wymuszenia wyczyszczenia określonych bitów (jako jeden z operandów wykorzystuje kod maski, w którym bity wymagające wyczyszczenia są ustawione na zero). Operacja OR służy do wymuszenia ustawienia określonych bitów (jako jeden z operandów używany jest kod maski, w którym bity wymagające ustawienia na jeden są równe jeden). Operacja XOR służy do odwracania podanych bitów (jako jeden z operandów używany jest kod maski, w którym bity do odwrócenia są ustawione na jeden). Instrukcje wymagają dwóch argumentów wejściowych i tworzą jeden argument wyjściowy.

8 Polecenia przesunięcia umożliwiają przesuwanie kodu operandu bit po bicie w prawo (w kierunku niższych bitów) lub w lewo (w kierunku wyższych bitów). Rodzaj przesunięcia (logiczne, arytmetyczne lub cykliczne) określa, jaka będzie nowa wartość najbardziej znaczącego bitu (przy przesunięciu w prawo) lub najmniej znaczącego bitu (przy przesunięciu w lewo), a także określa, czy stara wartość najbardziej znaczącego bit zostanie zapisany gdzieś (przy przesunięciu w lewo) lub najmniej znaczący bit (przy przesunięciu w prawo). Przesunięcia obrotowe umożliwiają przesuwanie bitów kodu operandu w okręgu (zgodnie z ruchem wskazówek zegara przy przesuwaniu w prawo lub przeciwnie do ruchu wskazówek zegara przy przesuwaniu w lewo). W takim przypadku pierścień zmiany biegów może, ale nie musi zawierać flagi przeniesienia. Bit flagi przeniesienia (jeśli jest używany) jest ustawiony na najbardziej znaczący bit dla obrotu w lewo i najmniej znaczący bit dla obrotu w prawo. Zgodnie z tym, wartość bitu flagi przeniesienia zostanie przepisana do najmniej znaczącego bitu, gdy jest cykliczny w lewo i do najbardziej znaczącego bitu, gdy jest cykliczny w prawo.

9 Polecenia skoku. Polecenia skoku są przeznaczone do organizowania wszelkiego rodzaju pętli, rozgałęzień, wywołań podprogramów itp., to znaczy zakłócają sekwencyjny przepływ programu. Instrukcje te zapisują nową wartość do rejestru licznika instrukcji i tym samym powodują, że procesor przeskakuje nie do następnej instrukcji w kolejności, ale do dowolnej innej instrukcji w pamięci programu. Niektóre komendy skoku pozwalają cofnąć się do punktu, z którego wykonano skok, a inne nie. Jeśli podano zwrot, bieżące parametry procesora są przechowywane na stosie. Jeśli nie zostanie podany zwrot, bieżące parametry procesora nie zostaną zapisane.

Polecenia skoku bez cofania są podzielone na dwie grupy:

­ polecenia skoków bezwarunkowych;

­ instrukcje skoku warunkowego.

Te polecenia używają słów Gałąź (gałąź) i Skok (skok).

Instrukcje skoku bezwarunkowego powodują skok do nowego adresu bez względu na wszystko. Mogą powodować skok do określonej wartości przesunięcia (do przodu lub do tyłu) lub do określonego adresu pamięci. Wartość przesunięcia lub nowa wartość adresu jest określona jako argument wejściowy.

Polecenia skoku warunkowego nie zawsze powodują skok, ale tylko wtedy, gdy spełnione są określone warunki. Takimi warunkami są zazwyczaj wartości flag w rejestrze stanu procesora ( PSW ). Oznacza to, że warunek przejścia jest wynikiem poprzedniej operacji, która zmienia wartości flag. W sumie takich warunków skoku może być od 4 do 16. Kilka przykładów poleceń skoku warunkowego:

­ skok, jeśli jest równy zero;

­ skok, jeśli niezerowe;

­ skacz, jeśli jest przepełnienie;

­ skacz, jeśli nie ma przelewu;

­ skok, jeśli jest większy od zera;

­ skok, jeśli jest mniejszy lub równy zero.

Jeżeli warunek przejścia jest spełniony, to nowa wartość jest ładowana do rejestru licznika instrukcji. Jeśli warunek skoku nie jest spełniony, licznik instrukcji jest po prostu zwiększany, a procesor wybiera i wykonuje następną instrukcję w sekwencji.

W szczególności do sprawdzania warunków rozgałęzień używana jest instrukcja porównania (CMP), która poprzedza instrukcję skoku warunkowego (lub nawet kilka instrukcji skoku warunkowego). Ale flagi można ustawić za pomocą dowolnego innego polecenia, takiego jak polecenie przesyłania danych, dowolne polecenie arytmetyczne lub logiczne. Zwróć uwagę, że same polecenia skoku nie zmieniają flag, co pozwala po prostu umieścić kilka poleceń skoku jedna po drugiej.

Polecenia przerwań zajmują szczególne miejsce wśród poleceń skoku z powrotem. Te instrukcje wymagają numeru przerwania (adresu wektora) jako argumentu wejściowego.

Wniosek:

Język asemblera jest symboliczną reprezentacją języka maszynowego. Język asemblera dla każdego typu komputera jest inny. Program w języku asemblerowym jest zbiorem bloków pamięci zwanych segmentami pamięci. Każdy segment zawiera zbiór zdań językowych, z których każdy zajmuje oddzielny wiersz kodu programu. Instrukcje asemblera są czterech typów: polecenia lub instrukcje, makra, dyrektywy, wiersze komentarza.

Prawidłowe znaki podczas pisania tekstu programów to wszystkie litery łacińskie: A-Z,a-z. W takim przypadku wielkie i małe litery są uważane za równoważne; liczby z 0 zanim 9 ; oznaki ? , @ , $ , _ , & ; separatory , . () < > { } + / * % ! " " ? = # ^ .

Stosuje się następujące typy instrukcji asemblera i reguły składni dla tworzenia wyrażeń asemblera. operatory arytmetyczne, operatory przesunięcia, operatory porównania, operatory logiczne, operator indeksu, operator redefinicji typu, operator redefinicji segmentu, operator nazewnictwa typu struktury, operator uzyskiwania składnika adresu segmentu wyrażenia, operator uzyskiwania przesunięcia wyrażenia.

System dowodzenia podzielony jest na 8 głównych grup.

­ Pytania testowe:

1 Co to jest język asemblera?

2 Jakich symboli można użyć do pisania poleceń w asemblerze?

3 Czym są etykiety i jaki jest ich cel?

4 Wyjaśnij strukturę instrukcji montażu.

5 Wymień 4 typy instrukcji asemblera.

Aby maszyna wykonywała ludzkie polecenia na poziomie sprzętowym, konieczne jest ustawienie określonej sekwencji działań w języku „zer i jedynek”. Assembler zostanie w tej sprawie asystentem. Jest to narzędzie, które działa z tłumaczeniem poleceń na język maszynowy. Jednak pisanie programu to bardzo czasochłonny i złożony proces. Ten język nie jest przeznaczony do tworzenia łatwych i prostych działań. Na ten moment każdy używany język programowania (asembler działa świetnie) pozwala na pisanie specjalnych wydajnych zadań, które mają duży wpływ na działanie sprzętu. Głównym celem jest tworzenie mikroinstrukcji i małych kodów. Ten język zapewnia więcej funkcji niż na przykład Pascal lub C.

Krótki opis języków asemblera

Wszystkie języki programowania podzielone są na poziomy: niski i wysoki. Każdy z systemów składniowych „rodziny” Assemblera różni się tym, że łączy w sobie jednocześnie niektóre zalety najbardziej popularnych i nowoczesnych języków. Z innymi łączy je również to, że można w pełni korzystać z systemu komputerowego.

Charakterystyczną cechą kompilatora jest łatwość obsługi. Tym różni się od tych, które działają tylko z wysokimi poziomami. Jeśli weźmiemy pod uwagę jakikolwiek taki język programowania, asembler działa dwa razy szybciej i lepiej. Aby w nim pisać program świetlny nie potrwa zbyt długo.

Krótko o strukturze języka

Jeśli mówimy ogólnie o pracy i strukturze funkcjonowania języka, możemy z całą pewnością powiedzieć, że jego polecenia są w pełni zgodne z poleceniami procesora. Oznacza to, że asembler używa kodów mnemonicznych, które są najwygodniejsze do pisania dla danej osoby.

W przeciwieństwie do innych języków programowania, Asembler używa określonych etykiet zamiast adresów do zapisywania komórek pamięci. Są one tłumaczone na tzw. dyrektywy wraz z procesem wykonania kodu. Są to adresy względne, które nie wpływają na działanie procesora (nie są tłumaczone na język maszynowy), ale są niezbędne do rozpoznania przez samo środowisko programistyczne.

Każda linia procesora ma swoją własną, w tej sytuacji każdy proces będzie poprawny, w tym przetłumaczony.

Język asemblera ma kilka składni, które zostaną omówione w artykule.

Plusy językowe

Najważniejszą i najwygodniejszą adaptacją asemblera będzie to, że można go użyć do napisania dowolnego programu na procesor, który będzie bardzo zwarty. Jeśli kod jest ogromny, to niektóre procesy są przekierowywane do Baran. Jednocześnie wszystkie działają dość szybko i bezawaryjnie, o ile oczywiście nie steruje nimi wykwalifikowany programista.

Sterowniki, systemy operacyjne, BIOS, kompilatory, interpretery itp. to programy w języku asemblera.

Korzystając z deasemblera, który tłumaczy z maszyny na maszynę, możesz łatwo zrozumieć, jak działa to lub inne zadanie systemowe, nawet jeśli nie ma dla niego wyjaśnień. Jest to jednak możliwe tylko wtedy, gdy programy są lekkie. Niestety dość trudno jest zrozumieć nietrywialne kody.

Wady języka

Niestety początkującym programistom (i często profesjonalistom) trudno jest zrozumieć język. Monter wymaga szczegółowego opisu wymaganej instrukcji. Ze względu na konieczność korzystania z instrukcji maszynowych wzrasta prawdopodobieństwo błędnych działań i złożoność wykonania.

Aby napisać nawet najbardziej prosty program, programista musi być wykwalifikowany, a jego poziom wiedzy jest wystarczająco wysoki. Przeciętny specjalista niestety często pisze złe kody.

Jeśli platforma, dla której tworzony jest program, jest aktualizowana, wszystkie polecenia należy przepisać ręcznie - jest to wymagane przez sam język. Monter nie obsługuje funkcji automatycznej regulacji stanu procesów i wymiany jakichkolwiek elementów.

Polecenia językowe

Jak wspomniano powyżej, każdy procesor ma swój własny zestaw instrukcji. Najprostszymi elementami rozpoznawanymi przez dowolny typ są następujące kody:


Korzystanie z dyrektyw

Programowanie mikrokontrolerów w języku (Assembler na to pozwala i świetnie sobie radzi) na najniższym poziomie w większości przypadków kończy się pomyślnie. Najlepiej używać procesorów o ograniczonych zasobach. Dla technologii 32-bitowej podany język pasuje świetnie. Często można zobaczyć dyrektywy w kodach. Co to jest? A do czego służy?

Na początek należy podkreślić, że dyrektywy nie są tłumaczone na język maszynowy. Regulują sposób działania kompilatora. W przeciwieństwie do poleceń te parametry, mające różne funkcje, różnią się nie ze względu na różne procesory, ale ze względu na innego translatora. Do głównych dyrektyw należą:


pochodzenie nazwy

Jak nazywa się język - „Assembler”? Mówimy o tłumaczu i kompilatorze, które szyfrują dane. Z angielskiego Assembler oznacza nic więcej niż asembler. Program nie był kompilowany ręcznie, zastosowano strukturę automatyczną. Co więcej, w tej chwili użytkownicy i specjaliści już usunęli różnicę między terminami. Często asembler nazywany jest językiem programowania, chociaż jest tylko narzędziem.

Ze względu na ogólnie przyjętą nazwę zbiorową niektórzy ludzie mają błędne założenie, że istnieje jeden język niskiego poziomu (lub jego standardowe normy). Aby programista zrozumiał, o jakiej strukturze mówimy, konieczne jest wyjaśnienie, dla której platformy używany jest ten lub inny język asemblera.

narzędzia makr

Języki asemblera, które są stosunkowo nowe, mają funkcje makr. Ułatwiają zarówno pisanie, jak i uruchamianie programu. Dzięki ich obecności tłumacz wielokrotnie szybciej wykonuje napisany kod. Tworząc wybór warunkowy, możesz napisać ogromny blok poleceń, ale łatwiej jest używać makr. Pozwolą one szybko przełączać się między akcjami, w przypadku spełnienia lub niespełnienia warunku.

Używając dyrektyw języka makr, programista otrzymuje makra asemblera. Czasami może być szeroko stosowany, a czasami jego funkcjonalność sprowadza się do jednego polecenia. Ich obecność w kodzie ułatwia pracę z nim, czyni go bardziej zrozumiałym i wizualnym. Jednak nadal powinieneś uważać - w niektórych przypadkach makra wręcz przeciwnie, pogarszają sytuację.

Struktura instrukcji języka asemblera Programowanie na poziomie instrukcji maszynowych jest minimalnym poziomem, na którym możliwe jest programowanie komputerowe. System instrukcji maszynowych musi być wystarczający do realizacji wymaganych działań poprzez wydawanie instrukcji do sprzętu maszyny. Każda instrukcja maszynowa składa się z dwóch części: części operacyjnej, która definiuje „co robić” oraz operandu, który definiuje obiekty przetwarzania, czyli „co robić”. Instrukcja maszynowa mikroprocesora, napisana w języku asemblerowym, jest pojedynczą linią, mającą następującą postać: etykieta instrukcja/dyrektywa argument(y) ; komentarze Etykieta, polecenie/dyrektywa i operand są oddzielone co najmniej jednym znakiem spacji lub tabulacji. Operandy instrukcji są oddzielone przecinkami.

Struktura instrukcji asemblera Instrukcja asemblera mówi kompilatorowi, jaką akcję powinien wykonać mikroprocesor. Dyrektywy zespołu to parametry określone w tekście programu, które wpływają na proces składania lub właściwości pliku wyjściowego. Operand określa początkową wartość danych (w segmencie danych) lub elementy, na które instrukcja ma działać (w segmencie kodu). Instrukcja może mieć jeden lub dwa operandy lub nie mieć operandów. Liczba argumentów jest domyślnie określona przez kod instrukcji. Jeśli polecenie lub dyrektywa ma być kontynuowane w następnym wierszu, używany jest znak odwrotnego ukośnika: "" . Domyślnie asembler nie rozróżnia wielkich i małych liter w poleceniach i dyrektywach. Przykłady dyrektyw i poleceń Count db 1 ; Nazwa, dyrektywa, jeden operand mov eax, 0 ; Polecenie, dwa argumenty

Identyfikatory to sekwencje prawidłowych znaków używanych do oznaczania nazw zmiennych i nazw etykiet. Identyfikator może składać się z jednego lub więcej z następujących znaków: wszystkie litery alfabetu łacińskiego; liczby od 0 do 9; znaki specjalne: _, @, $, ? . Kropka może być użyta jako pierwszy znak etykiety. Zarezerwowane nazwy asemblerów (dyrektywy, operatory, nazwy poleceń) nie mogą być używane jako identyfikatory. Pierwszy znak identyfikatora musi być literą lub znakiem specjalnym. Maksymalna długość identyfikatora to 255 znaków, ale tłumacz akceptuje pierwsze 32 znaki i ignoruje resztę. Wszystkie etykiety napisane w wierszu, który nie zawiera dyrektywy asemblera, muszą kończyć się dwukropkiem ":". Etykieta, polecenie (dyrektywa) i operand nie muszą zaczynać się w żadnej konkretnej pozycji w łańcuchu. Zaleca się zapisanie ich w kolumnie dla większej czytelności programu.

Etykiety Wszystkie etykiety napisane w wierszu, który nie zawiera dyrektywy asemblera, muszą kończyć się dwukropkiem ":". Etykieta, polecenie (dyrektywa) i operand nie muszą zaczynać się w żadnej konkretnej pozycji w łańcuchu. Zaleca się zapisanie ich w kolumnie dla większej czytelności programu.

Komentarze Użycie komentarzy w programie poprawia jego przejrzystość, zwłaszcza gdy cel zestawu instrukcji jest niejasny. Komentarze zaczynają się w dowolnym wierszu modułu źródłowego średnikiem (;). Wszystkie znaki na prawo od „; ' na końcu wiersza są komentarze. Komentarz może zawierać dowolne znaki, które można wydrukować, w tym „spację”. Komentarz może obejmować całą linię lub podążać za poleceniem w tym samym wierszu.

Struktura programu w asemblerze Program w asemblerze może składać się z kilku części zwanych modułami, z których każdy może definiować jeden lub więcej segmentów danych, stosu i kodu. Każdy kompletny program w języku asemblerowym musi zawierać jeden główny lub główny moduł, od którego rozpoczyna się jego wykonywanie. Moduł może zawierać segmenty programu, segmenty danych i stosu zadeklarowane za pomocą odpowiednich dyrektyw.

Modele pamięci Przed zadeklarowaniem segmentów należy określić model pamięci za pomocą dyrektywy. MODEL modyfikator model_pamięci, wywołanie_konwencja, OS_type, parametr_stosu Modele pamięci w podstawowym języku asemblera: Model pamięci Adresowanie kodu Adresowanie danych System operacyjny Przeplatanie kodu i danych MAŁY BLISKI MS-DOS Prawidłowy MAŁY BLISKI MS-DOS, Windows Nie ŚREDNI DALEKO BLISKI MS-DOS, Windows Nie KOMPAKTOWY BLISKI MS-DOS, Windows Nie DUŻY DALEKI MS-DOS, Windows Nie DUŻY DALEKI MS-DOS, Windows Nie BLISKI Windows 2000, Windows XP, Windows WAŻNE PŁASKIE BLISKI NT,

Modele pamięci Mały model działa tylko w 16-bitowych aplikacjach MS-DOS. W tym modelu wszystkie dane i kod znajdują się w jednym fizycznym segmencie. Rozmiar plik programu w tym przypadku nie przekracza 64 KB. Mały model obsługuje jeden segment kodu i jeden segment danych. Dane i kod w przypadku korzystania z tego modelu są adresowane jako bliskie (bliskie). Model średni obsługuje wiele segmentów kodu i jeden segment danych, przy czym wszystkie łącza w segmentach kodu są domyślnie uważane za dalekie (daleko), a łącza w segmencie danych są uważane za bliskie (bliskie). Model kompaktowy obsługuje wiele segmentów danych, które wykorzystują adresowanie danych dalekich (daleko) i jeden segment kodu, który wykorzystuje adresowanie danych bliskich (blisko). Duży model obsługuje wiele segmentów kodu i wiele segmentów danych. Domyślnie wszystkie odwołania do kodu i danych są uważane za dalekie. Ogromny model jest prawie odpowiednikiem modelu z dużą pamięcią.

Modele pamięci Model płaski zakłada konfigurację programu bez segmentacji i jest używany tylko w 32-bitowych systemach operacyjnych. Ten model jest podobny do małego modelu, ponieważ dane i kod znajdują się w tym samym segmencie 32-bitowym. Opracowanie programu dla modelu płaskiego przed dyrektywą. Wzornik płaski powinien umieścić jedną z dyrektyw: . 386, . 486, . 586 lub. 686. Wybór dyrektywy wyboru procesora określa zestaw poleceń dostępnych podczas pisania programów. Litera p po dyrektywie wyboru procesora oznacza chroniony tryb pracy. Adresowanie danych i kodu jest bliskie, a wszystkie adresy i wskaźniki są 32-bitowe.

modele pamięci. MODEL modyfikator model_pamięci, wywołanie_konwencja, typ_OS, parametr_stosu Parametr modyfikatora służy do definiowania typów segmentów i może przyjmować następujące wartości: użyj 16 (segmenty wybranego modelu są używane jako 16-bitowe) użyj 32 (segmenty wybranego modelu są używane jako 32-bitowy). Parametr call_convention służy do określenia sposobu przekazywania parametrów podczas wywoływania procedury z innych języków, w tym języków wysokiego poziomu (C++, Pascal). Parametr może przyjmować następujące wartości: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

modele pamięci. Modyfikator MODEL model_pamięci, konwencja_wywoływania, typ_OS, parametr_stosu Parametr OS_type to domyślnie OS_DOS i jest to obecnie jedyna obsługiwana wartość tego parametru. Parametr stack_param jest ustawiony na: NEARSTACK (rejestr SS jest równy DS, regiony danych i stosu znajdują się w tym samym segmencie fizycznym) FARSTACK (rejestr SS nie jest równy DS, regiony danych i stosu znajdują się w różnych segmentach fizycznych). Wartość domyślna to NEARSTACK.

Przykład programu „nic nie robienie”. 686 P. MODEL PŁASKI, STDCALL. DANE. KOD START: RET KONIEC START RET - polecenie mikroprocesorowe. Zapewnia prawidłowe zakończenie programu. Pozostała część programu związana jest z obsługą translatora. . 686 P — Dozwolone są polecenia trybu chronionego Pentium 6 (Pentium II). Ta dyrektywa wybiera obsługiwany zestaw instrukcji asemblera przez określenie modelu procesora. . MODEL FLAT, stdcall - płaski model pamięci. Ten model pamięci jest używany w systemie operacyjnym Windows. stdcall to procedura wywoływania konwencji do użycia.

Przykład programu „nic nie robienie”. 686 P. MODEL PŁASKI, STDCALL. DANE. KOD POCZĄTEK: POWRÓT KONIEC START . DATA - segment programu zawierający dane. Ten program nie używa stosu, więc segment. Brak STOSOWANIA. . KOD - segment programu zawierający kod. START - etykieta. KONIEC START - koniec programu i komunikat dla kompilatora, że ​​program należy uruchomić z etykiety START. Każdy program musi zawierać dyrektywę END oznaczającą koniec kod źródłowy programy. Wszystkie wiersze następujące po dyrektywie END są ignorowane.Etykieta za dyrektywą END informuje kompilator o nazwie głównego modułu, od którego rozpoczyna się wykonywanie programu. Jeżeli program zawiera jeden moduł, etykietę po dyrektywie END można pominąć.

Tłumacze języka asemblera Tłumacz to program lub środki techniczne A, który konwertuje program w jednym z języków programowania na program w języku docelowym, zwanym kodem obiektowym. Oprócz obsługi mnemotechniki instrukcji maszynowych, każdy kompilator ma swój własny zestaw dyrektyw i makr, często niekompatybilnych z czymkolwiek innym. Główne typy translatorów języka asemblera to: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - swobodnie rozpowszechniany wieloprzebiegowy assembler napisany przez Tomasza Gryshtara (Polski), NASM (Netwide Assembler) - darmowy asembler dla architektury Intel x 86 został stworzony przez Simona Tathama z Julianem Hallem i jest obecnie rozwijany przez mały zespół programistów w Source. Fałszować. internet.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" ="(!LANG:Emisja programu do firmy Microsoft studio wizualne 2005 1) Utwórz projekt wybierając z menu Plik->Nowy->Projekt i">Tłumaczenie programu w Microsoft Visual Studio 2005 1) Utwórz projekt wybierając z menu Plik->Nowy->Projekt i określając nazwę projektu (hello.prj) i wpisz projekt: Win 32 Project. opcje dodatkowe kreator projektu, aby określić „Pusty projekt”.

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="(!LANG:Tłumaczenie programu w Microsoft Visual Studio 2005 2) W drzewie projektu (Widok->Solution Explorer) dodaj"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Tłumaczenie programu w Microsoft Visual Studio 2005 3) Wybierz typ pliku Code C++, ale określ nazwę z rozszerzeniem. jako M:

Tłumaczenie programu w Microsoft Visual Studio 2005 5) Ustaw opcje kompilatora. Wybierz na prawym przycisku w menu pliku projektu Niestandardowe reguły kompilacji…

Tłumaczenie programu w Microsoft Visual Studio 2005 iw wyświetlonym oknie wybierz Microsoft Macro Assembler.

Tłumaczenie programu w Microsoft Visual Studio 2005 Sprawdź prawym przyciskiem w pliku witam. asm drzewa projektu z menu Właściwości i ustaw Ogólne->Narzędzie: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="(!LANG:Tłumaczenie programu w Microsoft Visual Studio 2005 6) Skompiluj plik, wybierając Build->Build hello.prj ."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Programowanie systemu operacyjnego Programowanie Windows w OC Windows opiera się na wykorzystaniu funkcji API (Application Program Interface, czyli interfejs aplikacja oprogramowania). Ich liczba sięga 2000. Program dla Windows w dużej mierze składa się z takich połączeń. Wszystkie interakcje z urządzenia zewnętrzne a zasoby systemu operacyjnego z reguły odbywają się za pośrednictwem takich funkcji. sala operacyjna system Windows używa płaskiego modelu pamięci. Adres dowolnej komórki pamięci będzie określony przez zawartość jednego rejestru 32-bitowego. Istnieją 3 rodzaje struktur programu dla systemu Windows: dialog (główne okno jest oknem), struktura konsoli lub bez okien, struktura klasyczna (okno, ramka).

Połączenie cechy okien API W pliku pomocy dowolna funkcja API jest reprezentowana jako typ nazwa_funkcji (FA 1, FA 2, FA 3) Typ – zwracany typ wartości; FAKS to lista argumentów formalnych w kolejności ich występowania, na przykład int Wiadomość. Box (HWND h. Wnd, LPCTSTR lp. Tekst, LPCTSTR lp. Podpis, UINT u. Typ); Ta funkcja wyświetla okno z komunikatem i przyciskiem(ami) wyjścia. Znaczenie parametrów: godz. Wnd - uchwyt do okna, w którym pojawi się okno wiadomości, lp. Tekst - tekst, który pojawi się w oknie, lp. Podpis - tekst w tytule okna, u. Typ - typ okna, w szczególności można określić ilość przycisków wyjścia.

Wywoływanie funkcji Windows API w Message. Box (HWND h. Wnd, LPCTSTR lp. Tekst, LPCTSTR lp. Podpis, UINT u. Typ); Prawie wszystkie parametry funkcji API są w rzeczywistości 32-bitowymi liczbami całkowitymi: HWND jest 32-bitową liczbą całkowitą, LPCTSTR jest 32-bitowym wskaźnikiem ciągu, UINT jest 32-bitową liczbą całkowitą. Przyrostek „A” jest często dodawany do nazw funkcji, aby przejść do nowszych wersji funkcji.

Wywoływanie funkcji Windows API w Message. Box (HWND h. Wnd, LPCTSTR lp. Tekst, LPCTSTR lp. Podpis, UINT u. Typ); Używając MASM, musisz dodać @N N na końcu nazwy - liczbę bajtów, które przekazane argumenty zajmują na stosie. W przypadku funkcji API Win 32 liczba ta może być zdefiniowana jako liczba argumentów n razy 4 (bajty w każdym argumencie): N=4*n. Do wywołania funkcji używana jest instrukcja CALL asemblera. W tym przypadku wszystkie argumenty funkcji są do niej przekazywane przez stos (polecenie PUSH). Kierunek przekazywania argumentów: OD LEWEJ DO PRAWEJ - OD DOŁU DO GÓRY. Argument u zostanie wypchnięty na stos jako pierwszy. rodzaj. Połączenie określona funkcja będzie wyglądać tak: CALL Wiadomość. skrzynka. [e-mail chroniony]

Wywoływanie funkcji Windows API w Message. Box (HWND h. Wnd, LPCTSTR lp. Tekst, LPCTSTR lp. Podpis, UINT u. Typ); Wynikiem wykonania dowolnej funkcji API jest zazwyczaj liczba całkowita, która jest zwracana w rejestrze EAX. Dyrektywa OFFSET to „przesunięcie w segmencie” lub, w przypadku języków wysokiego poziomu, „wskaźnik” do początku wiersza. Dyrektywa EQU, podobnie jak #define w C, definiuje stałą. Dyrektywa EXTERN mówi kompilatorowi, że funkcja lub identyfikator jest zewnętrzny względem modułu.

Przykład programu „Witam wszystkich!” . 686 P. MODEL PŁASKI, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Mój pierwszy program", 0 STR 2 DB "Witam wszystkich!", 0 HW DD ? ZEWNĘTRZNA wiadomość. skrzynka. [e-mail chroniony]: BLISKO. KOD START: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Wiadomość. skrzynka. [e-mail chroniony] POWRÓT KONIEC START

Dyrektywa INVOKE Translator języka MASM umożliwia również uproszczenie wywołania funkcji za pomocą narzędzia makr - dyrektywa INVOKE: funkcja INVOKE, parametr1, parametr2, ... Nie ma potrzeby dodawania @16 do wywołania funkcji; parametry są zapisywane dokładnie w kolejności, w jakiej są podane w opisie funkcji. makra translatora umieszczają parametry na stosie. aby skorzystać z dyrektywy INVOKE należy posiadać opis prototypu funkcji za pomocą dyrektywy PROTO w postaci: Message. skrzynka. PROTO: DWORD, : DWORD

Ze względu na cel można rozróżnić polecenia (przykłady mnemonicznych opkodów poleceń asemblera PC, takiego jak IBM PC, podano w nawiasach):

l egzekucja działania arytmetyczne(ADD i ADC - dodawanie i dodawanie z przeniesieniem, SUB i SBB - odejmowanie i odejmowanie z pożyczaniem, MUL i IMUL - mnożenie bez znaku i ze znakiem, DIV i IDIV - dzielenie bez znaku i ze znakiem, CMP - porównania itp.);

l wykonywanie operacji logicznych (OR, AND, NOT, XOR, TEST itp.);

l transfer danych (MOV - wysyłanie, XCHG - wymiana, IN - wejście do mikroprocesora, OUT - wycofanie z mikroprocesora itp.);

l przeniesienie sterowania (rozgałęzienia programu: JMP - rozgałęzienie bezwarunkowe, CALL - wywołanie procedury, RET - powrót z procedury, J * - rozgałęzienie warunkowe, LOOP - sterowanie pętlą itp.);

l przetwarzanie ciągów znaków (MOVS - transfery, CMPS - porównania, LODS - pobieranie, SCAS - skany. Te polecenia są zwykle używane z prefiksem (modyfikator powtórzeń) REP;

l przerwania programowe (INT - przerwania programowe, INTO - przerwania warunkowe przy przepełnieniu, IRET - powrót z przerwania);

l sterowanie mikroprocesorowe (ST* i CL* - ustawianie i kasowanie flag, HLT - stop, WAIT - stan czuwania, NOP - bezczynność itp.).

Z pełna lista polecenia asemblera można znaleźć w pracach.

Polecenia przesyłania danych

l MOV dst, src - transfer danych (przenieś - przenieś z src do dst).

Transfery: jeden bajt (jeśli src i dst są w formacie bajtowym) lub jedno słowo (jeśli src i dst są w formacie słowa) między rejestrami lub między rejestrem a pamięcią i zapisuje natychmiastową wartość do rejestru lub pamięci.

Operandy dst i src muszą mieć ten sam format - bajt lub słowo.

Src może być typu: r (rejestr) - rejestr, m (pamięć) - pamięć, i (impedancja) - wartość natychmiastowa. Dst może być typu r, m. Operandy nie mogą być użyte w jednym poleceniu: rsegm razem z i; dwa argumenty typu m i dwa argumenty typu rsegm). Operand, którym mogę być proste wyrażenie:

mov AX, (152 + 101B) / 15

Ocena wyrażenia jest wykonywana tylko podczas tłumaczenia. Flagi się nie zmieniają.

l PUSH src - umieszczanie słowa na stosie (push - forsować; push do stosu z src). Odkłada zawartość src na wierzch stosu - dowolny rejestr 16-bitowy (włącznie z segmentem) lub dwie komórki pamięci zawierające 16-bitowe słowo. Flagi się nie zmieniają;

l POP dst — wyodrębnianie słowa ze stosu (pop — pop; liczba ze stosu w dst). Usuwa słowo z wierzchołka stosu i umieszcza je w dst - dowolnym 16-bitowym rejestrze (włącznie z segmentem) lub dwóch lokalizacjach pamięci. Flagi się nie zmieniają.

Wstęp.

Język, w którym napisany jest oryginalny program, nazywa się Wejście język i język, na który jest tłumaczony w celu wykonania przez procesor - weekend język. Proces konwersji języka wejściowego na język wyjściowy nazywa się audycja. Ponieważ procesory są zdolne do wykonywania programów w binarnym języku maszynowym, który nie jest używany do programowania, konieczne jest tłumaczenie wszystkich programów źródłowych. znany dwie drogi tłumaczenia: kompilacje i tłumaczenia ustne.

Na kompilacja program źródłowy jest najpierw w całości tłumaczony na równoważny program w języku docelowym, zwany obiekt program, a następnie wykonywane. Proces ten odbywa się za pomocą specjalnego programy, nazywa kompilator. Nazywa się kompilator, dla którego język wejściowy jest symboliczną reprezentacją języka maszynowego (wyjściowego) kodów binarnych monter.

Na interpretacje każda linia tekstu programu źródłowego jest parsowana (interpretowana) i polecenie w nim określone jest natychmiast wykonywane. Wdrożenie tej metody leży po stronie program tłumacza. Interpretacja zajmuje dużo czasu. Aby zwiększyć jego wydajność, zamiast przetwarzać każdą linię, tłumacz wstępnie konwertuje wszystkie Komenda ciągi do znaków (

). Wygenerowana sekwencja symboli służy do wykonywania funkcji przypisanych do oryginalnego programu.

Omówiony poniżej język asemblera jest zaimplementowany za pomocą kompilacji.

Cechy języka.

Główne cechy asemblera:

● zamiast kodów binarnych język używa nazw symbolicznych - mnemonika. Na przykład dla polecenia dodawania (

) używany jest mnemonik

Odejmowania (

mnożenie (

Podziały (

itd. Nazwy symboliczne są również używane do adresowania komórek pamięci. Aby programować w języku asemblerowym, zamiast kodów i adresów binarnych, musisz znać tylko nazwy symboliczne, które asembler tłumaczy na kody binarne;

każde oświadczenie odpowiada jedno polecenie maszyny(kod), to znaczy istnieje korespondencja jeden-do-jednego między instrukcjami maszynowymi a operatorami w programie asemblerowym;

● język zapewnia dostęp do wszystkich obiektów i zespoły. Języki wysokiego poziomu nie mają tej umiejętności. Na przykład język asemblerowy pozwala na sprawdzenie bitu rejestru flag i języka wysokiego poziomu (na przykład

) nie ma tej możliwości. Zwróć uwagę, że języki programowania systemów (na przykład C) często zajmują pozycję pośrednią. Pod względem dostępności są one bliższe asemblerowi, ale mają składnię języka wysokiego poziomu;

● język asemblera nie jest językiem uniwersalnym. Każda konkretna grupa mikroprocesorów ma swój własny asembler. Języki wysokiego poziomu nie mają tej wady.

W przeciwieństwie do języków wysokiego poziomu, pisanie i debugowanie programu w języku asemblerowym zajmuje dużo czasu. Mimo to język asemblera stał się szerokie zastosowanie z powodu następujących okoliczności:

● Program napisany w języku asemblerowym jest znacznie mniejszy i znacznie szybszy niż program napisany w języku wysokiego poziomu. W przypadku niektórych aplikacji wskaźniki te odgrywają nadrzędną rolę, na przykład wiele programy systemowe(w tym kompilatory), programy w kartach kredytowych, telefony komórkowe, sterowniki urządzeń itp.;

● niektóre procedury wymagają pełny dostęp do sprzętu, co zwykle nie jest możliwe w języku wysokiego poziomu. Ten przypadek obejmuje przerwania i procedury obsługi przerwań w systemach operacyjnych, a także kontrolery urządzeń w systemach wbudowanych czasu rzeczywistego.

W większości programów tylko niewielki procent całego kodu odpowiada za duży procent czasu wykonywania programu. Zazwyczaj 1% programu odpowiada za 50% czasu realizacji, a 10% programu odpowiada za 90% czasu realizacji. Dlatego do napisania konkretnego programu w rzeczywistych warunkach używany jest zarówno asembler, jak i jeden z języków wysokiego poziomu.

Format operatora w asemblerze.

Program w języku asemblerowym jest listą poleceń (wyrażeń, zdań), z których każde zajmuje oddzielną linię i zawiera cztery pola: pole etykiety, pole operacji, pole operandu i pole komentarza. Każde pole ma osobną kolumnę.

Pole etykiety.

Dla pola etykiety przydzielona jest kolumna 1. Etykieta jest nazwą symboliczną lub identyfikatorem, adresy pamięć. Jest to konieczne, aby móc:

● dokonać warunkowego lub bezwarunkowego przejścia do polecenia;

● uzyskać dostęp do miejsca, w którym przechowywane są dane.

Takie oświadczenia są oznaczone. Do oznaczenia nazwy używane są (duże) litery alfabetu angielskiego i cyfry. Nazwa musi zaczynać się od litery i kończyć się dwukropkiem. Etykietę dwukropka można zapisać w osobnym wierszu, a kod operacji można wpisać w następnym wierszu w kolumnie 2, co upraszcza pracę kompilatora. Brak dwukropka uniemożliwia odróżnienie etykiety od kodu, jeśli znajdują się one w osobnych wierszach.

W niektórych wersjach języka asemblera, dwukropki są umieszczane tylko po etykietach instrukcji, a nie po etykietach danych, a długość etykiety może być ograniczona do 6 lub 8 znaków.

Pole etykiety nie powinno zawierać tych samych nazw, ponieważ etykieta jest powiązana z adresami poleceń. Jeżeli podczas wykonywania programu nie ma potrzeby wywoływania polecenia lub danych z pamięci, to pole etykiety pozostaje puste.

Pole kodu transakcji.

To pole zawiera komendę mnemonik lub pseudo komendę (patrz niżej). Kod mnemoniczny polecenia jest wybierany przez projektantów języka. W języku asemblera

mnemonik wybrany do załadowania rejestru z pamięci

) oraz przechowywanie zawartości rejestru w pamięci - mnemonik

). W językach asemblera

możesz użyć tej samej nazwy dla obu operacji, odpowiednio

Jeśli wybór nazw mnemonicznych może być dowolny, to konieczność użycia dwóch instrukcji maszynowych wynika z architektury procesora

Mnemoniki rejestrów zależą również od wersji asemblera (Tabela 5.2.1).

Pole operandowe.

Oto dodatkowe informacje wymagane do wykonania operacji. W polu operandów instrukcji skoku wskazany jest adres, pod którym chcesz przeskoczyć, a także adresy i rejestry, które są operandami instrukcji maszynowej. Jako przykład, oto operandy, których można użyć w procesorach 8-bitowych

● dane liczbowe,

przedstawione w różnych systemach liczbowych. Aby wskazać używany system liczbowy, po stałej następuje jedna z liter łacińskich: B,

Odpowiednio, binarne, ósemkowe, szesnastkowe, dziesiętne systemy liczbowe (

nie mogą być rejestrowane). Jeśli pierwsza cyfra liczby szesnastkowej to A, B, C,

Następnie z przodu dodaje się nieznaczące 0 (zero);

● kody wewnętrznych rejestrów mikroprocesora i komórek pamięci

M (źródła lub odbiorcy informacji) w postaci liter A, B, C,

M lub ich adresy w dowolnym systemie liczbowym (na przykład 10V - adres rejestru)

w systemie binarnym);

● identyfikatory,

dla zarejestrowanych par samolotów,

Pierwsze litery B

H; dla pary akumulatora i rejestru cech -

; dla licznika programów -

; dla wskaźnika stosu -

● etykiety wskazujące adresy operandów lub kolejne instrukcje w trybie warunkowym

(gdy warunek jest spełniony) i bezwarunkowe przejścia. Na przykład argument M1 w poleceniu

oznacza konieczność bezwarunkowego przejścia do polecenia, którego adres w polu etykiety jest oznaczony identyfikatorem M1;

● wyrażenia,

które są budowane poprzez łączenie omówionych powyżej danych za pomocą operatorów arytmetycznych i logicznych. Pamiętaj, że sposób rezerwacji miejsca na dane zależy od wersji języka. Deweloperzy języka asemblera dla

Zdefiniuj słowo), a później wprowadził alternatywę.

który od samego początku był w języku dla procesorów

W wersji językowej

używany

zdefiniować stałą).

Procesory przetwarzają operandy o różnej długości. Aby to zdefiniować, deweloperzy asemblera podjęli różne decyzje, na przykład:

II rejestry o różnej długości mają różne nazwy: EAX - do umieszczania 32-bitowych operandów (typ

); AX - dla 16-bitów (typ

i AN - dla 8-bitów (typ

● dla procesorów

przyrostki są dodawane do każdego opcode: przyrostek

Dla typu

; przyrostek „.B” dla typu

dla operandów o różnych długościach używane są różne kody operacji, na przykład do załadowania bajtu, półsłowa (

) i słowa w rejestrze 64-bitowym używają opkodów

odpowiednio.

Pole komentarzy.

To pole zawiera wyjaśnienia dotyczące działań programu. Komentarze nie mają wpływu na działanie programu i są przeznaczone dla osoby. Mogą być potrzebne do modyfikacji programu, który bez takich komentarzy może być zupełnie niezrozumiały nawet dla doświadczonych programistów. Komentarz zaczyna się od znaku i służy do wyjaśniania i dokumentowania programów. Początkowy znak komentarza może mieć postać:

● średnik (;) w językach dla procesorów firmy

● wykrzyknik (!) w językach dla

Każda osobna linia zarezerwowana na komentarz jest poprzedzona znakiem startu.

Pseudo rozkazy (dyrektywy).

W języku asemblerowym można wyróżnić dwa główne typy poleceń:

podstawowy instrukcje, które są równoważne kodowi maszynowemu procesora. Te polecenia wykonują całe przetwarzanie zapewniane przez program;

pseudopolecenia lub dyrektywy, przeznaczony do obsługi procesu tłumaczenia programu na język kombinacji normowych. Jako przykład w tabeli. 5.2.2 pokazuje niektóre pseudo-polecenia z as-asemblera

dla rodziny

.

Podczas programowania zdarzają się sytuacje, w których zgodnie z algorytmem ten sam ciąg poleceń musi być wielokrotnie powtarzany. Aby wyjść z tej sytuacji, możesz:

● napisz żądaną sekwencję poleceń, gdy tylko wystąpi. Takie podejście prowadzi do zwiększenia objętości programu;

● zorganizuj tę sekwencję w procedurę (podprogram) i wywołaj ją, jeśli to konieczne. Takie wyjście ma swoje wady: za każdym razem trzeba wykonać specjalną instrukcję wywołania procedury i instrukcję powrotu, które przy krótkiej i często używanej sekwencji mogą znacznie zmniejszyć szybkość działania programu.

Najprostszy i skuteczna metoda wielokrotne powtarzanie łańcucha poleceń ma na celu użycie makro, które można traktować jako pseudopolecenie przeznaczone do ponownego przetłumaczenia grupy poleceń często spotykanych w programie.

Makro lub makroinstrukcja charakteryzuje się trzema aspektami: definicją makra, odwróceniem makra i rozwinięciem makra.

definicja makra

Jest to oznaczenie powtarzającej się sekwencji poleceń programu, używanej do odniesień w tekście programu.

Makro ma następującą strukturę:

Lista wyrażeń; definicja makra

Powyższa struktura definicji makr składa się z trzech części:

● nagłówek

makro zawierające nazwę

Pseudo-polecenie

oraz zestaw parametrów;

● kropkowany ciało makro;

● drużyna

ukończenie szkoły

definicje makr.

Zestaw parametrów makro zawiera listę wszystkich parametrów podanych w polu operandu dla wybranej grupy instrukcji. Jeżeli parametry te zostaną podane wcześniej w programie, to można je pominąć w nagłówku definicji makra.

Do ponownego złożenia wybranej grupy poleceń używane jest wywołanie składające się z nazwy

makro i lista parametrów z innymi wartościami.

Gdy asembler napotka definicję makra podczas kompilacji, przechowuje ją w tabeli definicji makr. Z kolejnymi występami w programie nazwy (

) makra, asembler zastępuje je treścią makra.

Nazywa się używanie nazwy makra jako kodu operacji makro-odwrócenie(wywołanie makra) i zastąpienie go treścią makra - makro ekspansja.

Jeśli program jest reprezentowany jako ciąg znaków (litery, cyfry, spacje, znaki interpunkcyjne i powrót karetki, aby przejść do Nowa linia), to makroekspansja polega na zastąpieniu niektórych łańcuchów z tej sekwencji innymi łańcuchami.

Rozszerzanie makr następuje podczas procesu składania, a nie podczas wykonywania programu. Sposoby manipulowania ciągami znaków są przypisane do narzędzia makr.

Prowadzony jest proces montażu w dwóch przejazdach:

● W pierwszym przebiegu wszystkie definicje makr są zachowywane, a wywołania makr są rozszerzane. W tym przypadku program źródłowy jest odczytywany i konwertowany na program, w którym wszystkie definicje makr są usuwane, a każde wywołanie makra jest zastępowane treścią makra;

● Drugi przebieg przetwarza otrzymany program bez makr.

Makra z parametrami.

Do pracy z powtarzającymi się sekwencjami poleceń, których parametry mogą przyjmować różne wartości, dostępne są definicje makr:

● z rzeczywisty parametry, które są umieszczane w polu operandu wywołania makra;

● z formalny parametry. Podczas rozwijania makra każdy formalny parametr, który pojawia się w treści makra, jest zastępowany odpowiadającym mu parametrem rzeczywistym.

za pomocą makr z parametrami.

Program 1 pokazuje dwie podobne sekwencje poleceń, różniące się tym, że pierwsza z nich zamienia P i

I drugi

Program 2 zawiera makro z dwoma parametrami formalnymi P1 i P2. Podczas rozszerzania makra każdy znak P1 w treści makra jest zastępowany przez pierwszy rzeczywisty parametr (P,

), a symbol P2 zostaje zastąpiony przez drugi aktualny parametr (

) z programu nr 1. W wywołaniu makra

program 2 jest oznaczony: P,

Pierwszy rzeczywisty parametr,

Drugi aktualny parametr.

Program 1

Program 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P, EBX MOV P2, EAX

Rozszerzone możliwości.

Rozważ niektóre zaawansowane funkcje języka

Jeśli makro zawierające instrukcję rozgałęzienia warunkowego i etykietę, do której należy przejść, zostanie wywołane dwa lub więcej razy, etykieta zostanie zduplikowana (problem z powielaniem etykiet), co spowoduje błąd. Dlatego każdemu wywołaniu przypisywana jest (przez programistę) osobna etykieta jako parametr. w języku

etykieta jest zadeklarowana lokalnie (

) a dzięki zaawansowanym funkcjom asembler automatycznie generuje inną etykietę za każdym razem, gdy makro jest rozwijane.

pozwala na definiowanie makr wewnątrz innych makr. Ta zaawansowana funkcja jest bardzo przydatna w połączeniu z warunkowym łączeniem programów. Rozważać

JEŚLI WORDSIZE GT 16 M2 MAKRO

Makro M2 można zdefiniować w obu częściach zestawienia

Jednak definicja zależy od tego, czy program jest montowany na procesorze 16-bitowym czy 32-bitowym. Jeśli M1 nie zostanie wywołane, to makro M2 nie zostanie w ogóle zdefiniowane.

Inną zaawansowaną funkcją jest to, że makra mogą wywoływać inne makra, w tym siebie - rekursywny połączenie. W tym drugim przypadku, aby uniknąć nieskończonej pętli, makro musi przekazać do siebie parametr, który zmienia się przy każdym rozwinięciu, a także sprawdzać ten parametr i zakończyć rekursję, gdy parametr osiągnie określoną wartość.

O wykorzystaniu makr w asemblerze.

Używając makr, asembler musi być w stanie wykonać dwie funkcje: zapisz definicje makr oraz rozwiń wywołania makr.

Zapisywanie definicji makr.

Wszystkie nazwy makr są przechowywane w tabeli. Każdej nazwie towarzyszy wskaźnik do odpowiedniego makra, aby w razie potrzeby można je było wywołać. Niektóre asemblery mają osobną tabelę nazw makr, inne mają wspólną tabelę, w której obok nazw makr znajdują się wszystkie polecenia maszynowe i dyrektywy.

W przypadku napotkania makra podczas montażu Utworzony:

nowy element tabeli z nazwą makra, liczbą parametrów i wskaźnikiem do innej tabeli definicji makra, w której będzie przechowywany korpus makra;

● lista formalny parametry.

Treść makra, która jest po prostu ciągiem znaków, jest następnie odczytywana i przechowywana w tabeli definicji makr. Parametry formalne występujące w treści pętli są oznaczone specjalnym symbolem.

Wewnętrzna reprezentacja makra

z powyższego przykładu dla programu 2 (s. 244) to:

MOV EAX, MOV EBX, MOV MOV i

gdzie średnik jest używany jako znak powrotu karetki, a ampersand & jest używany jako formalny znak parametru.

Rozszerzenie połączeń makro.

Za każdym razem, gdy podczas składania zostanie napotkana definicja makra, jest ona przechowywana w tabeli makr. Gdy makro jest wywoływane, asembler tymczasowo zawiesza odczytywanie danych wejściowych z urządzenia wejściowego i rozpoczyna odczytywanie treści zapisanego makra. Parametry formalne wyodrębnione z treści makra są zastępowane przez parametry rzeczywiste i dostarczane przez wywołanie. Znak & przed parametrami pozwala asemblerowi je rozpoznać.

Chociaż istnieje wiele wersji asemblera, procesy montażu mają wspólne cechy i są podobne pod wieloma względami. Poniżej omówiono pracę montera dwuprzebiegowego.

Asembler dwuprzebiegowy.

Program składa się z szeregu stwierdzeń. Wydawałoby się zatem, że podczas montażu można zastosować następującą sekwencję czynności:

● przetłumaczyć na język maszynowy;

● przenieść otrzymany kod maszynowy do pliku, a odpowiednią część zestawienia - do innego pliku;

● powtarzaj powyższe procedury, aż cały program zostanie wyemitowany.

Jednak takie podejście nie jest efektywne. Przykładem jest tzw. problem wiodący link. Jeśli pierwsza instrukcja jest skokiem do instrukcji P na samym końcu programu, to asembler nie może jej przetłumaczyć. Musi najpierw określić adres operatora P, a do tego konieczne jest przeczytanie całego programu. Każde pełne przeczytanie oryginalnego programu nazywa się przejście. Pokażmy, jak możemy rozwiązać problem z referencjami do przodu za pomocą dwóch przebiegów:

na pierwszym przejściu zebrać i przechowuj wszystkie definicje symboli (w tym etykiety) w tabeli, a przy drugim przejściu odczytaj i złóż każdy operator. Ta metoda jest stosunkowo prosta, ale drugie przejście przez oryginalny program wymaga dodatkowego czasu we/wy;

● na pierwszym przejeździe, konwertować zaprogramować na formę pośrednią i zapisać w tabeli, a drugie przejście wykonuje się nie według oryginalnego programu, ale według tabeli. Ta metoda montażu oszczędza czas, ponieważ przy drugim przejściu nie są wykonywane żadne operacje we/wy.

Pierwsze podanie.

Cel pierwszego przejazdu- zbuduj tablicę symboli. Jak wspomniano powyżej, kolejnym celem pierwszego przebiegu jest zapisanie wszystkich definicji makr i rozwinięcie wywołań w miarę ich pojawiania się. Dlatego zarówno definicja znaku, jak i rozwinięcie makra występują w tym samym przebiegu. Symbolem może być albo etykieta, lub oznaczający, któremu przypisywana jest konkretna nazwa za pomocą dyrektywy -you:

;Wartość - wielkość bufora

Przez nadanie znaczenia nazwom symbolicznym w polu etykiety instrukcji, asembler zasadniczo ustawia adresy, które każda instrukcja będzie miała podczas wykonywania programu. Aby to zrobić, monter podczas procesu montażu oszczędza licznik adresu instrukcji(

) jako zmienną specjalną. Na początku pierwszego przebiegu wartość zmiennej specjalnej jest ustawiana na 0 i zwiększana po każdym przetworzeniu polecenia o długość tego polecenia. Jako przykład w tabeli. 5.2.3 pokazuje fragment programu wskazujący długość poleceń i wartości liczników. Tabele generowane są podczas pierwszego przejazdu nazwy symboli, dyrektywy oraz kody operacji, a jeśli to konieczne dosłowny stół. Literał jest stałą, dla której asembler automatycznie rezerwuje pamięć. Od razu zauważamy, że nowoczesne procesory zawierają instrukcje z adresami bezpośrednimi, więc ich asemblery nie obsługują literałów.

Tabela symboli

zawiera jeden element dla każdej nazwy (tabela 5.2.4). Każdy wpis w tablicy symboli zawiera samą nazwę (lub wskaźnik do niej), jej wartość liczbową, a czasem dodatkowe informacje, które mogą obejmować:

● długość pola danych skojarzonego z symbolem;

● bity remapowania pamięci (które wskazują, czy wartość symbolu zmienia się, jeśli program jest ładowany pod innym adresem niż zamierzony asembler);

● informacja o tym, czy do symbolu można uzyskać dostęp spoza procedury.

Nazwy symboliczne to etykiety. Można je określić za pomocą operatorów (na przykład

Tabela dyrektyw.

Ta tabela zawiera listę wszystkich dyrektyw lub pseudo rozkazów, które występują podczas asemblowania programu.

Tabela kodów operacji.

Dla każdego kodu operacji w tabeli znajdują się oddzielne kolumny: oznaczenie kodu operacji, operand 1, operand 2, wartość szesnastkowa kodu operacji, długość instrukcji i typ instrukcji (Tabela 5.2.5). Kody operacji są podzielone na grupy w zależności od liczby i rodzaju operandów. Typ polecenia określa numer grupy i określa procedurę wywoływaną w celu przetworzenia wszystkich poleceń w tej grupie.

Drugie podanie.

Cel drugiego przejazdu- stworzenie programu obiektowego i wydrukowanie, jeśli to konieczne, protokołu asemblera; wyprowadza informacje potrzebne konsolidatorowi do łączenia procedur, które zostały złożone w różnym czasie w jeden plik wykonywalny.

W drugim przebiegu (podobnie jak w pierwszym) wiersze zawierające oświadczenia są odczytywane i przetwarzane jeden po drugim. Oryginalny operator i dane wyjściowe pochodzące z niego w postaci szesnastkowej obiekt kod może być wydrukowany lub zbuforowany w celu późniejszego wydrukowania. Po zresetowaniu licznika adresów poleceń wywoływane jest polecenie następne stwierdzenie.

Oryginalny program może zawierać błędy, na przykład:

dany symbol nie jest zdefiniowany lub zdefiniowany więcej niż raz;

● Opcode jest reprezentowany przez nieprawidłową nazwę (z powodu literówki), nie ma wystarczającej liczby operandów lub ma zbyt wiele operandów;

● brak operatora

Niektóre asemblery mogą wykryć niezdefiniowany symbol i zastąpić go. Jednak w większości przypadków, gdy zostanie znaleziona instrukcja z błędem, asembler wyświetla na ekranie komunikat o błędzie i próbuje kontynuować proces asemblacji.

Artykuły poświęcone asemblerowi.

Podobał Ci się artykuł? Podziel się z przyjaciółmi!
Czy ten artykuł był pomocny?
TAk
Nie
Dziekuję za odpowiedź!
Coś poszło nie tak i Twój głos nie został policzony.
Dziękuję Ci. Twoja wiadomość została wysłana
Znalazłeś błąd w tekście?
Wybierz, kliknij Ctrl+Enter a my to naprawimy!