Konfiguracja sprzętu i oprogramowania

Struktura poleceń w programowaniu w języku asemblerowym na poziomie. Ogólna charakterystyka systemu instrukcji języka Assembler dla IBM-PC (podstawowy zestaw instrukcji, metody adresowania głównych operandów)

Struktury w asemblerze

Tablice, które rozważaliśmy powyżej, to zbiór elementów tego samego typu. Ale często w aplikacjach istnieje potrzeba uwzględnienia pewnego zestawu danych inny rodzaj jako jakiś pojedynczy typ.

Jest to bardzo istotne na przykład w przypadku programów bazodanowych, gdzie konieczne jest powiązanie zbioru danych różnych typów z jednym obiektem.

Na przykład wcześniej przyjrzeliśmy się Listingowi 4, który działał z tablicą elementów trzybajtowych. Z kolei każdy element składał się z dwóch elementów różnego typu: jednobajtowego pola licznika i dwubajtowego pola, które mogło zawierać więcej informacji potrzebnych do przechowywania i przetwarzania. Jeśli czytelnik zna jeden z języków wysokiego poziomu, to wie, że taki obiekt jest zwykle opisywany za pomocą specjalnego typu danych - Struktury.

W celu poprawy użyteczności języka asemblerowego wprowadzono do niego również ten typ danych.

Zgodnie z definicją Struktura to typ danych składający się ze stałej liczby elementów różnych typów.

Aby użyć struktur w programie, musisz zrobić trzy rzeczy:

    Zapytać się szablon struktury .

    W istocie oznacza to zdefiniowanie nowego typu danych, który później można wykorzystać do zdefiniowania zmiennych tego typu.

    Definiować instancja struktury .

    Ten etap obejmuje inicjalizację określonej zmiennej z predefiniowaną (przy użyciu szablonu) strukturą.

    Zorganizować dostęp do członków struktury .

Bardzo ważne jest, abyś od samego początku zrozumiał, jaka jest między nimi różnica opis struktury w programie i jego definicja.

opisać struktura w programie oznacza jedynie wskazanie jego schematu lub wzoru; pamięć nie jest przydzielona.

Ten szablon może być traktowany tylko jako informacja dla tłumacza o lokalizacji pól i ich domyślnej wartości.

Definiować struktura oznacza poinstruowanie tłumacza, aby przydzielił pamięć i nadał temu obszarowi pamięci symboliczną nazwę.

Strukturę można opisać w programie tylko raz, a zdefiniować dowolną ilość razy.

Opis szablonu struktury

Deklaracja szablonu struktury ma następującą składnię:

nazwa_struktury STRUC

nazwa_struktury ENDS

Tutaj jest sekwencją dyrektyw opisu danych db, dw, dd, dq oraz dt.

Ich operandy określają wielkość pól i opcjonalnie wartości początkowe. Wartości te prawdopodobnie zainicjują odpowiednie pola, gdy struktura zostanie zdefiniowana.

Jak już zauważyliśmy przy opisie szablonu, pamięć nie jest alokowana, ponieważ jest to tylko informacja dla tłumacza.

Lokalizacja szablon w programie może być dowolny, ale zgodnie z logiką translatora jednoprzebiegowego musi znajdować się przed miejscem, w którym zdefiniowana jest zmienna o typie tej struktury. Oznacza to, że opisując zmienną typu jakiejś struktury w segmencie danych, jej szablon musi być umieszczony na początku segmentu danych lub przed nim.

Rozważ pracę ze strukturami na przykładzie modelowania bazy danych pracowników określonego działu.

Dla uproszczenia, aby odejść od problemów konwersji informacji podczas wprowadzania, zgodzimy się, że wszystkie pola są symboliczne.

Zdefiniujmy strukturę rekordów tej bazy danych za pomocą następującego wzorca:

Definiowanie danych o typie struktury

Aby skorzystać ze struktury opisanej przy pomocy szablonu w programie, konieczne jest zdefiniowanie zmiennej o typie tej struktury. Służy do tego następująca składnia:

[nazwa zmiennej] nazwa_struktury

    nazwa zmiennej- identyfikator zmiennej danego typ strukturalny.

    Podanie nazwy zmiennej jest opcjonalne. Jeśli nie zostanie określony, zostanie po prostu zaalokowany obszar pamięci o rozmiarze sumy długości wszystkich elementów struktury.

    lista wartości- oddzieloną przecinkami listę wartości początkowych elementów konstrukcji ujętą w nawiasy kątowe.

    Jego zadanie jest również opcjonalne.

    Jeżeli lista jest niekompletna, to wszystkie pola struktury dla danej zmiennej są inicjowane wartościami z szablonu, jeśli występują.

    Dozwolone jest inicjowanie poszczególnych pól, ale w tym przypadku brakujące pola muszą być oddzielone przecinkami. Brakujące pola zostaną zainicjowane wartościami z szablonu struktury. Jeżeli definiując nową zmienną o typie tej struktury zgadzamy się z wszystkimi wartościami pól w jej szablonie (czyli domyślnie ustawionymi), to wystarczy wpisać nawiasy ostre.

    Na przykład: zwycięski robotnik.

Na przykład zdefiniujmy kilka zmiennych o typie struktury opisanym powyżej.

Metody struktury

Ideą wprowadzenia typu strukturalnego do dowolnego języka programowania jest połączenie zmiennych różnych typów w jeden obiekt.

Język musi umożliwiać dostęp do tych zmiennych w ramach określonej instancji struktury. Aby odwołać się w poleceniu do pola o jakiejś strukturze, stosuje się specjalny operator - symbol ". " (kropka). Jest używany w następującej składni:

    adres_wyrażenie- identyfikator zmiennej pewnego typu strukturalnego lub wyrażenie w nawiasach zgodnie z zasadami składni wskazanymi poniżej (rys. 1);

    nazwa_pola_struktury- nazwa pola z szablonu struktury.

    W rzeczywistości jest to również adres, a raczej przesunięcie pola od początku struktury.

Więc operator ” . " (kropka) ocenia wyrażenie

Ryż. 5. Składnia wyrażenia adresowego w operatorze dostępu do pola struktury

Zademonstrujmy na przykładzie zdefiniowanej przez nas struktury pracownik niektóre techniki pracy ze strukturami.

Na przykład wyodrębnij do topór wartości pól z wiekiem. Ponieważ jest mało prawdopodobne, aby wiek osoby pełnosprawnej przekroczył 99 lat, po umieszczeniu zawartości tego pola znaku w rejestrze topór wygodnie będzie przekonwertować go na reprezentację binarną za pomocą polecenia aad.

Bądź ostrożny, ponieważ ze względu na zasadę przechowywania danych „mały bajt pod niskim adresem” najwyższa cyfra wieku zostanie umieszczona w glin, a najmłodsi w Ach.

Aby to poprawić, po prostu użyj polecenia xchg al, ach:

mov ax,word ptr sotr1.wiek ;w wieku al sotr1

a jest to możliwe tak:

Dalsza praca z tablicą struktur odbywa się w taki sam sposób, jak z tablicą jednowymiarową. Pojawia się tutaj kilka pytań:

Jak poradzić sobie z rozmiarem i jak zorganizować indeksowanie elementów tablicy?

Podobnie jak inne identyfikatory zdefiniowane w programie, translator przypisuje nazwę typu struktury i nazwę zmiennej z typem struktury atrybutem typu. Wartością tego atrybutu jest rozmiar w bajtach zajmowany przez pola tej struktury. Możesz wyodrębnić tę wartość za pomocą operatora rodzaj.

Gdy rozmiar instancji struktury stanie się znany, organizowanie indeksowania w tablicy struktur nie jest szczególnie trudne.

Na przykład:

Jak skopiować pole z jednej struktury do odpowiadającego pola innej struktury? Albo jak skopiować całą konstrukcję? Skopiujmy pole nam trzeci pracownik w terenie nam piąty pracownik:

mas_sotr pracownik 10 dup()

mov bx, przesunięcie mas_sotr

mov si,(typ worker)*2 ;si=77*2

mov di,(typ worker)*4 ;si=77*4

Wydaje mi się, że kunszt programisty prędzej czy później sprawia, że ​​człowiek wygląda na dobrą gospodynię domową. On, podobnie jak ona, nieustannie szuka, gdzie coś uratować, cofnąć i zrobić wspaniały obiad z minimum jedzenia. A jeśli się to uda, to moralna satysfakcja jest nie mniejsza, a może większa, niż ze wspaniałej kolacji u gospodyni. Wydaje mi się, że stopień tej satysfakcji zależy od stopnia zamiłowania do wykonywanego zawodu.

Z drugiej strony postęp w rozwoju oprogramowania i sprzętu nieco odpręża programistę i dość często dochodzi do sytuacji podobnej do znanego przysłowia o locie i słoniu - do rozwiązania jakiegoś drobnego problemu używa się ciężkich narzędzi. zaangażowanych, których skuteczność w ogólnym przypadku ma znaczenie tylko przy realizacji stosunkowo dużych projektów.

Obecność w języku następujących dwóch rodzajów danych wynika prawdopodobnie z chęci „gospodyni” do jak najefektywniejszego wykorzystania obszaru roboczego stołu (RAM) podczas przygotowywania jedzenia lub umieszczania produktów (dane programu ).

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 światła i proste czynności. 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 wysokie poziomy. 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.

kierowca, OS, BIOS, kompilatory, interpretery itp. są programami języka asemblerowego.

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. Asembler wymaga szczegółowy opis wymagane polecenie. 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ę.

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ą.

Polecenia asemblera (Wykład)

PLAN WYKŁADU

1. Główne grupy operacji.

Pentium.

1. Główne grupy operacji

Mikroprocesory wykonują zestaw instrukcji, które realizują następujące główne grupy operacji:

operacje spedycyjne,

działania arytmetyczne,

operacje logiczne,

operacje zmianowe,

operacje porównawcze i testowe,

operacje bitowe,

Operacje zarządzania programem;

Operacje kontroli procesora.

2. Mnemokody poleceń procesora Pentium

Podczas opisywania poleceń zwykle stosuje się ich oznaczenia mnemoniczne (kody mnemoniczne), które służą do określenia polecenia podczas programowania w języku asemblera. Do różne wersje Mnemoniki asemblera dla niektórych poleceń mogą się różnić. Na przykład w przypadku polecenia wywoływania podprogramu używany jest kod mnemonicznyPOŁĄCZENIE lub JSR ("Skocz do podprogram”). Jednak kody mnemoniczne większości poleceń dla głównych typów mikroprocesorów są takie same lub nieznacznie się różnią, ponieważ są to skróty odpowiednich angielskich słów, które definiują wykonywaną operację. Rozważ mnemoniki poleceń przyjęte dla procesorów Pentium.

Polecenia do przodu. Głównym dowództwem tej grupy jest polecenieMOV , który zapewnia transfer danych między dwoma rejestrami lub między rejestrem a komórką pamięci. Niektóre mikroprocesory realizują transfer między dwiema komórkami pamięci, a także grupowy transfer zawartości kilku rejestrów z pamięci. Na przykład mikroprocesory z rodziny 68 Motorola XXX wykonaj polecenieRUSZAJ SIĘ , który zapewnia transfer z jednej komórki pamięci do drugiej oraz poleceniePRZESUŃ , który zapisuje do pamięci lub ładuje z pamięci zawartość danego zbioru rejestrów (do 16 rejestrów). ZespółXCHG dokonuje wzajemnej wymiany zawartości dwóch rejestrów procesora lub rejestru i komórki pamięci.

Polecenia wejściowe W i wyjście NA ZEWNĄTRZ realizacji transferu danych z rejestru procesora do urządzenia zewnętrznego lub odbioru danych z urządzenia zewnętrznego do rejestru. Te polecenia określają numer urządzenia interfejsu (port we/wy), przez który przesyłane są dane. Zwróć uwagę, że wiele mikroprocesorów nie ma specjalnych instrukcji dostępu urządzenia zewnętrzne. W takim przypadku wprowadzanie i wyprowadzanie danych w systemie odbywa się za pomocą poleceniaMOV , który określa adres wymaganego urządzenia interfejsu. Tym samym urządzenie zewnętrzne jest adresowane jako komórka pamięci, a w przestrzeni adresowej przydzielana jest określona sekcja, w której znajdują się adresy urządzeń interfejsowych (portów) podłączonych do systemu.

Polecenia do operacji arytmetycznych. Główne polecenia w tej grupie to dodawanie, odejmowanie, mnożenie i dzielenie, które mają szereg opcji. Polecenia dodawania DODAJ i odejmowanie POD wykonać odpowiednie operacje zCposiadając dwa rejestry, rejestr i komórkę pamięci, lub używając operandu bezpośredniego. Drużyny OGŁOSZENIE C , SB b wykonać dodawanie i odejmowanie, biorąc pod uwagę wartość atrybutuC, ustawiony podczas tworzenia przelewu w trakcie wykonywania poprzedniej operacji. Za pomocą tych poleceń realizowane jest sekwencyjne dodawanie operandów, których liczba cyfr przekracza pojemność procesora. Zespół NEG zmienia znak operandu, przekształcając go w dopełnienie do dwóch.

Operacje mnożenia i dzielenia można wykonywać na liczbach ze znakiem (poleceniai UM, i DIV ) lub bez znaku (polecenia MUL, DIV ). Wynik operacji znajduje się w rejestrze. Podczas mnożenia (poleceniaMUL , IMUL ) daje wynik dwucyfrowy, który wykorzystuje dwa rejestry do dostosowania. Podczas dzielenia (poleceniaDIV , IDIV ) jako dywidendę stosuje się operand dwucyfrowy, umieszczony w dwóch rejestrach, w wyniku czego iloraz i reszta są zapisywane do dwóch rejestrów.

Polecenia logiczne . Prawie wszystkie mikroprocesory wykonują operacje logiczne AND, OR, Exclusive OR, które są wykonywane na bitach operandu o tej samej nazwie za pomocą poleceń ORAZ, LUB, x LUB . Operacje wykonywane są na zawartości dwóch rejestrów, rejestru i komórki pamięci, lub za pomocą operandu bezpośredniego. Zespół NIE Odwraca wartość każdego bitu operandu.

Polecenia przesunięcia. Mikroprocesory wykonują arytmetyczne, logiczne i cykliczne przesunięcia adresowanych operandów o jeden lub więcej bitów. Operand, który ma być przesunięty, może znajdować się w rejestrze lub lokacji pamięci, a liczba bitów przesunięcia jest określona przy użyciu operandu bezpośredniego zawartego w instrukcji lub określona przez zawartość określonego rejestru. Znak przeniesienia jest zwykle zaangażowany w realizację zmianyCw rejestrze statusu (SR lub EFLAGI), który zawiera ostatni bit operandu, który jest wyciągany z rejestru lub lokalizacji pamięci.

Polecenia porównawcze i testujące . Porównanie operandów odbywa się zwykle za pomocą poleceniaCMP , który wykonuje odejmowanie operandów z ustawieniem wartości cech N, Z, V, C w rejestrze statusu zgodnie z wynikiem. W takim przypadku wynik odejmowania nie jest zapisywany, a wartości argumentów nie ulegają zmianie. Późniejsza analiza uzyskanych wartości charakterystycznych pozwala określić wartość względną (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Niektóre mikroprocesory wykonują polecenie testowe TST , który jest wariantem instrukcji porównania z pojedynczym argumentem. Kiedy to polecenie jest wykonywane, znaki są ustawiane N, Z zgodnie ze znakiem i wartością (równą lub niezerową) adresowanego operandu.

Instrukcje obsługi bitów . Te polecenia ustawiają wartość atrybutuCw rejestrze stanu zgodnie z wartością testowanego bitubn w zaadresowanym operandzie. W niektórych mikroprocesorach, zgodnie z wynikiem testów, ustawiany jest znakZ. Numer bitu testowegonjest ustawiana albo przez zawartość rejestru określonego w poleceniu, albo przez bezpośredni operand.

Polecenia z tej grupy implementują różne opcje zmiany testowanego bitu BT utrzymuje wartość tego bitu niezmienioną.Command b T S po testach ustawia wartość bn=1, a polecenie b T C - oznaczający bn=0.Polecenie b T C odwraca wartość bitu bn po przetestowaniu.

Operacje zarządzania programem. Do sterowania programem używana jest duża liczba poleceń, wśród których są:

- bezwarunkowe polecenia przekazania sterowania;

- polecenia skoku warunkowego;

- polecenia do organizowania cykli programu;

- polecenia przerwania;

- polecenia zmiany funkcji.

Bezwarunkowego przekazania kontroli dokonuje dowództwoJMP , który ładuje się do licznika programuPCnowa zawartość, która jest adresem następnego polecenia do wykonania. Ten adres jest albo bezpośrednio określony w poleceniuJMP (adres bezpośredni) lub liczony jako suma aktualnej treściPCoraz offset określony w poleceniu, który jest liczbą ze znakiem (adresowanie względne). BoPCzawiera adres następnego polecenia programu, to ostatnia metoda ustawia adres przejścia, przesunięcie względem następnego adresu o podaną liczbę bajtów. Jeżeli przesunięcie jest dodatnie, to następuje przejście do kolejnych poleceń programu, jeśli przesunięcie jest ujemne, do poprzednich.

Podprogram wywoływany jest również przez bezwarunkowe przekazanie kontroli za pomocą poleceniaPOŁĄCZENIE (lub JSR ). Jednak w tym przypadku przed załadowaniem doPC nowa treść określająca adres pierwszej instrukcji podprogramu, konieczne jest zapisanie jej aktualnej wartości (adresu następnej instrukcji) w celu zapewnienia powrotu do programu głównego po wykonaniu podprogramu (lub do poprzedni podprogram podczas zagnieżdżania podprogramów). Instrukcje skoku warunkowego (gałęzie programu) są ładowane doPCnowa treść, jeśli spełnione są określone warunki, które są zwykle ustawiane zgodnie z aktualną wartością różnych atrybutów w rejestrze statusu. Jeśli warunek nie jest spełniony, wykonywane jest następne polecenie programu.

Polecenia zarządzania cechami zapewniają pisanie – odczytywanie zawartości rejestru statusu, w którym przechowywane są cechy, a także zmianę wartości poszczególnych cech. Na przykład procesory Pentium realizują polecenia LAHF oraz SAHF , który ładuje młodszy bajt, który zawiera znaki, z rejestru statusu EFLAG za niski bajt rejestru EAX i dopełnieniem małym bajtem EFLAGI z rejestru E Ax.. Polecenia CLC, STC ustawić wartości flagi transferu CF=0, CF=1 oraz komendy CMC powoduje odwrócenie wartości tej funkcji. Ponieważ cechy określają przebieg wykonywania programu podczas skoków warunkowych, instrukcje zmiany cechy są zwykle używane do sterowania programem.

Polecenia sterujące procesorem . Ta grupa obejmuje polecenia zatrzymania, braku działania oraz szereg poleceń, które określają tryb działania procesora lub jego poszczególnych bloków. ZespółHLT kończy wykonywanie programu i wprowadza procesor w stan zatrzymania, z którego wyjście następuje po otrzymaniu sygnałów przerwania lub restartu ( Resetowanie). Zespół NOP Instrukcja („pusta”), która nie powoduje wykonania żadnych operacji, służy do implementacji opóźnień programu lub wypełnienia luk powstałych w programie.

Zespoły specjalne CLI, STI wyłączyć i włączyć obsługę żądań przerwań. W procesorach Pentium służy do tego bit kontrolny (flaga)JEŚLI w rejestrze EFLAGI.

Wiele nowoczesnych mikroprocesorów wydaje polecenie identyfikacyjne, które pozwala użytkownikowi lub innym urządzeniom uzyskać informacje o rodzaju procesora zastosowanego w danym systemie. W procesorach Pentuim po to jest polecenie CPUID , podczas którego niezbędne dane o procesorze trafiają do rejestrów EAX,zły,ECX,EDX a następnie mogą być odczytywane przez użytkownika lub system operacyjny.

W zależności od trybów pracy zaimplementowanych przez procesor i określonych typów przetwarzanych danych, zestaw poleceń wykonywalnych może być znacznie rozszerzony.

Niektóre procesory wykonują operacje arytmetyczne BCD lub wykonują specjalne instrukcje korekcji wyników podczas przetwarzania takich liczb. Wiele wysokowydajnych procesorów obejmuje FPU - jednostka przetwarzania liczb C „zmiennoprzecinkowy”.

W wielu nowoczesnych procesorach zaimplementowano przetwarzanie grupowe kilku liczb całkowitych lub liczb. C „zmiennoprzecinkowy” jednym poleceniem zgodnie z zasadą SIMD („Pojedyncza instrukcja – wiele danych ”) - „Jedno polecenie – Dużo danych”. Jednoczesne wykonywanie operacji na kilku operandach znacznie zwiększa wydajność procesora podczas pracy z danymi wideo i audio. Takie operacje są szeroko stosowane w przetwarzaniu obrazu, przetwarzaniu sygnału audio i innych zastosowaniach. Aby wykonać te operacje, do procesorów wprowadzane są specjalne bloki, które implementują odpowiednie zestawy instrukcji, które w różnych typach procesorów ( Pentium, Athlon) dostał nazwęMMX (“ Milti-Rozszerzenie multimedialne ”) – Rozszerzenie Multimedialne,SSE(„Rozszerzenie Streaming SIMD”) – Streaming SIMD - przedłużenie, “3 DPrzedłużenie- Rozszerzenie 3D.

Cecha charakterystyczna procesorów firmy Intel , począwszy od modelu 80286, jest priorytetem kontroli dostępu do pamięci, który jest zapewniany, gdy procesor pracuje w trybie chronionego adresu wirtualnego -” Tryb obronny " (tryb obronny). Do realizacji tego trybu wykorzystywane są specjalne grupy poleceń, które służą do organizowania ochrony pamięci zgodnie z przyjętym algorytmem priorytetowego dostępu.

Programowanie na poziomie instrukcji maszynowych to minimalny poziom, na którym możliwe jest programowanie. System instrukcji maszynowych musi być wystarczający do realizacji wymaganych działań poprzez wydawanie instrukcji do sprzętu komputerowego.

Każda instrukcja obsługi maszyny składa się z dwóch części:

  • sala operacyjna – ustalanie „co robić”;
  • operand - definiowanie obiektów przetwarzania, „co z tym zrobić”.

Instrukcja maszynowa mikroprocesora, napisana w asemblerze, jest pojedynczą linią o następującej formie składniowej:

polecenie/dyrektywa etykiet argument(y) ;komentarze

W tym przypadku obowiązkowe pole w linii to polecenie lub dyrektywa.

Etykieta, polecenie/dyrektywa i operandy (jeśli występują) są oddzielone co najmniej jedną spacją lub znakiem tabulacji.

Jeśli polecenie lub dyrektywa muszą być kontynuowane w następnym wierszu, używany jest znak odwrotnego ukośnika: \.

Domyślnie język asemblerowy nie rozróżnia wielkich i małych liter w poleceniach lub dyrektywach.

Przykładowe wiersze kodu:

Odliczanie 1 ;Nazwa, dyrektywa, jeden argument
ruch, 0 ;Polecenie, dwa operandy
cbw ; Zespół

Tagi

Etykieta w asemblerze może zawierać następujące symbole:

  • wszystkie litery alfabetu łacińskiego;
  • liczby od 0 do 9;
  • znaki specjalne: _, @, $, ?.

Kropka może być użyta jako pierwszy znak etykiety, ale niektóre kompilatory odradzają ten znak. Zarezerwowane nazwy asemblera (dyrektywy, operatory, nazwy poleceń) nie mogą być używane jako etykiety.

Pierwszy znak na etykiecie musi być literą lub znakiem specjalnym (nie cyfrą). Maksymalna długość etykiety to 31 znaków. Wszystkie etykiety, które są napisane w wierszu, który nie zawiera dyrektywy asemblera, muszą kończyć się dwukropkiem: .

Drużyny

Zespół mówi tłumaczowi, jaką akcję powinien wykonać mikroprocesor. W segmencie danych polecenie (lub dyrektywa) definiuje pole, obszar roboczy lub stałą. W segmencie kodu instrukcja definiuje akcję, taką jak ruch (mov) lub dodanie (add).

dyrektywy

Asembler posiada szereg operatorów, które pozwalają kontrolować proces składania i generowania zestawienia. Operatorzy ci nazywają się dyrektywy . Działają tylko w procesie asemblacji programu i w przeciwieństwie do instrukcji nie generują kodów maszynowych.

operandy

Argument – obiekt, na którym wykonywane jest polecenie maszynowe lub operator języka programowania.
Instrukcja może mieć jeden lub dwa operandy lub wcale. Liczba argumentów jest domyślnie określona przez kod instrukcji.
Przykłady:

  • Brak operandów ret ;Return
  • Jeden operand inc ecx ;Increment ecx
  • Dwa operandy dodają eax,12 ;Dodaj 12 do eax

Etykieta, polecenie (dyrektywa) i operand nie muszą zaczynać się w żadnej konkretnej pozycji w łańcuchu. Zaleca się jednak zapisanie ich w kolumnie dla większej czytelności programu.

Operandy mogą być

  • identyfikatory;
  • ciągi znaków ujęte w pojedyncze lub podwójne cudzysłowy;
  • liczby całkowite w formacie binarnym, ósemkowym, dziesiętnym lub szesnastkowym.
Identyfikatory

Identyfikatory – sekwencje prawidłowych znaków używanych do oznaczania obiektów programu, takich jak kody operacji, nazwy zmiennych i nazwy etykiet.

Zasady pisania identyfikatorów.

  • Identyfikator może składać się z jednego lub więcej znaków.
  • Jako znaki możesz użyć liter alfabetu łacińskiego, cyfr i niektórych znaków specjalnych: _, ?, $, @.
  • Identyfikator nie może zaczynać się od cyfry.
  • Identyfikator może mieć do 255 znaków.
  • Tłumacz akceptuje pierwsze 32 znaki identyfikatora i ignoruje resztę.
Uwagi

Komentarze są oddzielone od linii wykonywalnej znakiem; . W tym przypadku wszystko, co jest napisane po średniku i do końca wiersza, jest komentarzem. Użycie komentarzy w programie poprawia jego przejrzystość, zwłaszcza gdy cel zestawu instrukcji jest niejasny. Komentarz może zawierać dowolne znaki, które można wydrukować, w tym spacje. Komentarz może obejmować całą linię lub podążać za poleceniem w tym samym wierszu.

Struktura programu montażowego

Program napisany w asemblerze może składać się z kilku części, zwanych moduły . Każdy moduł może zdefiniować 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 kodu, danych i stosu zadeklarowane odpowiednimi dyrektywami. Przed zadeklarowaniem segmentów należy określić model pamięci za pomocą dyrektywy .MODEL.

Przykład programu "nic nie robiącego" w asemblerze:

686P
. MODEL PŁASKI, STDCALL
.DANE
.KOD
POCZĄTEK:

GNIĆ
KONIEC START

Ten program zawiera tylko jedną instrukcję mikroprocesora. To polecenie to RET . Zapewnia prawidłowe zakończenie programu. Ogólnie rzecz biorąc, to polecenie służy do wyjścia z procedury.
Pozostała część programu związana jest z obsługą translatora.
.686P — Dozwolone są polecenia trybu chronionego Pentium 6 (Pentium II). Ta dyrektywa wybiera obsługiwany zestaw instrukcji asemblera przez określenie modelu procesora. Litera P na końcu dyrektywy mówi tłumaczowi, że procesor działa w trybie chronionym.
.MODEL FLAT, stdcall to płaski model pamięci. Ten model pamięci jest używany w systemie operacyjnym Windows. standardowe wywołanie
.DATA to segment programu zawierający dane.
.CODE to blok programu zawierający kod.
START to etykieta. W asemblerze dużą rolę odgrywają etykiety, czego nie można powiedzieć o nowoczesnych językach wysokiego poziomu.
KONIEC START – koniec programu i komunikat dla tłumacza, że ​​program należy uruchomić z etykiety START.
Każdy moduł musi zawierać dyrektywę END, która oznacza koniec kodu źródłowego programu. Wszystkie wiersze następujące po dyrektywie END są ignorowane. Pominięcie dyrektywy END generuje błąd.
Etykieta po dyrektywie END informuje kompilator o nazwie modułu głównego, od którego rozpoczyna się wykonywanie programu. Jeżeli program zawiera jeden moduł, etykietę po dyrektywie END można pominąć.

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!