Język asemblera. Polecenia i złożenia zespołów

W artykule omówiono podstawy języka asemblera w odniesieniu do architektury win32. Reprezentuje symboliczny zapis kodów maszynowych. W każdym komputerze najniższym poziomem jest sprzęt. Tutaj kontrola procesu odbywa się za pomocą poleceń lub instrukcji w języku maszynowym. Właśnie w tym obszarze asembler ma działać.

Programowanie asemblera

Pisanie programu asemblera jest niezwykle trudnym i kosztownym procesem. Aby stworzyć skuteczny algorytm, potrzebujesz głębokiego zrozumienia pracy komputera, znajomości szczegółów zespołu, a także większej uwagi i dokładności. Wydajność jest krytycznym parametrem dla programowania asemblera.
Główną zaletą języka asemblera jest to, że pozwala on tworzyć krótkie i szybkie programy. Z tego powodu stosuje się go z reguły do ​​rozwiązywania wysoce wyspecjalizowanych zadań. Wymagany jest kod działający wydajnie ze składnikami sprzętowymi lub program wymagający pamięci lub środowiska wykonawczego.

Rejestry

Rejestry w asemblerze językowym zwane komórkami pamięci umieszczonymi bezpośrednio na krysztale za pomocą jednostki ALU (procesor). Osobliwością tego rodzaju pamięci jest szybkość jej obiegu, która jest znacznie szybsza niż pamięć RAM komputera. Jest również nazywany superszybką pamięcią RAM (SRAM lub SRAM).


Istnieją następujące rodzaje rejestrów:
  • Rejestry ogólne (RON).
  • Flagi.
  • Wskaźnik poleceń.
  • Segmentuje rejestry.
  • Jest 8 rejestrów ogólnego przeznaczenia, każdyrozmiar 32 bity. Dostęp do rejestrów EAX, ECX, EDX, EBX można wykonać w trybie 32-bitowym, 16-bitowym AX, BX, CX, DX i 8-bitowym AH i AL, BH i BL, itp. Litera " E "w nazwach rejestrów oznacza Rozszerzony (rozszerzony). Same nazwy są powiązane z ich nazwami w języku angielskim:
  • Rejestr akumulatorów (AX) - dla operacji arytmetycznych.
  • Rejestr liczników (CX) - dla zmian i cykli.
  • Rejestr danych (DX) - dla operacji arytmetycznych i operacji we /wy.
  • Rejestr podstawowy (BX) - dla wskaźnika do danych.
  • Rejestr wskaźnika stosu (SP) - dla wskaźnika stosu górnego.
  • Rejestr wskaźnika bazy stosu (BP) - dla wskaźnika podstawowego stosu.
  • Rejestr indeksu źródeł (SI) - dla indeksu nadawcy (źródło).
  • Rejestr indeksu celu (DI) - dla odbiorcy.
  • Specjalizacja asemblera języka RON jest warunkowa. Mogą być używane w dowolnej operacji. Jednak niektóre polecenia są w stanie zastosować tylko niektóre rejestry. Na przykład polecenia pętli używają ESX do przechowywania wartości licznika. Rejestr flag. Odnosi się to do bajtu, który może przyjąć wartości 0 i 1. Zbiór wszystkich flag (około 30) wskazuje stan procesora. Przykłady flag: Carry Flag (CF) - flaga transferu, flaga przepełnienia (OF) - przepełnienie, flaga zagnieżdżona (NT) - flaga zadań zagnieżdżania i wiele innych. Flagi są podzielone na 3 grupy: stan, zarządzanie i system.

    Command Point (EIP - Wskaźnik instrukcji). Ten rejestr zawiera adres instrukcji, który musi zostać wykonany w następnej kolejności, jeśli nie ma innych warunków. Rejestry segmentów (CS, DS, SS, ES, FS, GS). Ich obecność w asemblerze jest podyktowana specjalną kontrolą pamięci operacyjnej, aby ją zwiększyćużywać w programach. Dzięki nim możesz zarządzać pamięcią do 4 GB. W architekturze Win32 zniknęła potrzeba segmentów, ale nazwy rejestrów są zachowywane i używane inaczej.

    Stack

    Jest to obszar pamięci przeznaczony do pracy z procedurami. Cechą stosu jest to, że ostatnie zapisane w nim dane są odczytywalne jako pierwsze. Lub innymi słowy: pierwsze rekordy stosu są wyodrębniane przez ostatnie. Wyobraź sobie ten proces jako wieżę warcabów. Aby uzyskać kontroler (dolny pionek na podstawie wieży lub inny w środku), musisz najpierw usunąć wszystkie kłamstwa z góry. I odpowiednio, ten ostatni jest umieszczony na wieży kontrolera, podczas gdy parsowanie wieży jest usuwane jako pierwsze. Taka zasada organizowania pamięci i pracy z nią dyktowana jest przez jej gospodarkę. Stos jest stale czyszczony iw każdej chwili używa go jedna procedura.

    Identyfikatory, całkowite liczby, symbole, komentarze, równoważność

    Identyfikator w języku programowania asemblera ma takie samo znaczenie jak w każdym innym. Dozwolone jest używanie łacińskich liter, cyfr i znaków "_", ".", "?", "@", "$". Duże i małe litery są równoważne, a kropka może być tylko pierwszym znakiem identyfikatora. Liczby całkowite w asemblerze można określić w systemach odniesienia o podstawie 2810 i 16. Każdy inny wpis liczbowy będzie uważany za identyfikator przez kompilator asemblera. W zapisie danych symbolicznych dozwolone jest stosowanie zarówno apostrofów, jak i cytatów. Jeśli musisz podać jeden z nich w ciągu znaków, wówczas następujące zasady:
  • na linii,apostrofami, cudzysłów wskazują raz apostrof - dwukrotnie: „może„t”,«powiedział: «Być albo nie być»»;
  • do linii podjętej nóg, pleców reguł, powielane cytaty , apostrofy są określane jako: „nie może”, „Mój ulubiony bar jest” „Black Cat” „-” Użyjmy komentarze na początku „
  • , komentując instrukcje w asemblerze wykorzystuje średnik.”. linia, a po zespole. Koniec linii comment feed. dyrektywę równoważności używany w podobny sposób jak w innych językach wskazywać konstantnыe wyraz. equi alentnist wyświetlane w następujący sposób:

    EQU,

    W ten sposób program wszystkie zdarzenia zostanie zastąpiony przez, w miejscu, gdzie jest to możliwe punktu całkowitej . adres linia lub dyrektywą EQU nazwa jest podobna do pracy w #define języku C ++

    Związek pośredni. Script asynchroniczny = „//pagead2.googlesyndication.com/pagead/js /adsbygoogle.js">

    & lt; skrypt & gt; (adsbygoogle = window.adsbygoogle || []). push ({});
    ,

    Dyrektywa Danych

    języki wysokiego poziomu (C ++, Pa) został naciśnięty. Oznacza to, że używają danych określonego typu, istnieją funkcje ich przetwarzania itp. W języku programowania nie ma asemblera. Istnieje tylko 5 dyrektyw dotyczących definicji danych:

    1. DB - Bajt: wybierz 1 bajt dla zmiennej.
    2. DW-Word wybierz 2 bajty.
    3. ​​
    4. DD - Double word select 4 bytes.
    5. DQ - Quad słowo, aby wybrać 8 bajtów.
    6. DT - dziesięć bajtów: wybierz 10 bajtów dla zmiennej.

    Litera D oznacza Zdefiniuj.

    Do zadeklarowania jakichkolwiek danych i tablic można zastosować dowolną dyrektywę. Jednak w przypadku ciągów zalecamy używanie DB.

    program

    DQ, [ ]

    , jako argumenty operacji dopuszcza się stosowanie numerów a znak zapytania "?" oznacza zmienną bez inicjalizacji. Rozważmy następujący przykład:

    real1 DD 1234
    znak db 'C'
    dB Ar2 '123456' 0; Tablica 7 bajt
    num1 dB 11001001b; liczba binarna
    nr 2 dw 7777o; liczba ósemkowa
    liczba3 dd -890d; liczba dziesiętna
    num4dd 0beah; liczba szesnastkowa
    var1 dd? ; zmienna bez wartości początkowej
    ar3 dd 50 dup

    ; inicjowane Tablica 50 E-nia
    , Ar4 dq 5 dup (011,25); tablicą 15 E-ing inicjowane powtórzeń 0 1 i 125

    zespoły (instrukcje)

    ,

    składni poleceń montażu lub asemblera instrukcji w następujący sposób:

    , (74 )
    Związek pośredni typu skrypt = "text /JavaScript" & gt;
    zmienna blockSettings13 = {blockID "R-A-116722-13" renderTo "yandex_rtb_R A-116722-13" horizontalAlign :! 1async :! 0};

    jeżeli (document.cookie.indexOf ("abmatch =") i GT = 0) {
    blockSettings13 = {blockID "RA 116722-13" renderTo „yandex_rtb_R A-116722- 13”horizontalAlign :! 1statId: 7async :! 0};
    }

    ! Zastosowanie (a, b, c, d, e) {A [c] = a [c] || [] do [C] .Push (funkcja () {Ya .Context.AdvManager.render (blockSettings13)}), e = b.getElementsByTagName ("scenariusz")d = b.createElement ("scenariusz") d.type = "text /JavaScript" d.src = "//an.yandex.ru/system/context.js",d.async=!0e.parentNode.insertBefore(d,e)}(this,this.document,"yandexContextAsyncCallbacks");
    ,
    , [; komentarz]

    etykiet (label :) zawsze kończy okrężnicy i może ułożone w osobnej linii. Etykiety są używane w odniesieniu do poleceń wewnątrz programu.

    Instrukcje określają operację do wykonania. W asemblerze operacje są przedstawiane w formie skrótów alfabetycznych w celu ułatwienia zrozumienia. Instrukcje można również nazwać kodami mnemonicznymi.

    Poniższe operandy mogą działać jako argumenty:

    • rejestry, które są adresowane według ich nazw;
    • stałe;
    • adresy.

    Więcej informacji o adresach

    Adresy można przesyłać na kilka sposobów:

    1. W formie nazwy zmiennej, która w asemblerze jest synonimem adresu.
    2. Jeżeli zmienna jest tablicą, odniesienie do elementu tablicy ze względu na nazwę zmiennej i przesunięcie. Dostępne są 2 formy: [+] i []. Należy pamiętać, że przesunięcie nie jest indeksem w tablicy, ale rozmiarem w bajtach. Sam programista musi zrozumieć, ile zrobić przesunięcie w bajtach, aby uzyskać pożądany element tablicy.
    3. Możesz użyć rejestrów. Aby uzyskać dostęp do pamięci, która przechowuje rejestru, należy użyć nawiasów kwadratowych: [ebx], [edi].
    4. [] - uchwyty umożliwiają stosowanie złożonych ekspresji w sobie do obliczania adresu: [ESI + 2 * eax].

    W adresie asemblera jest przesyłany w nawiasach kwadratowych. Biorąc pod uwagę, że zmienna jest również adresem, może być używana zarówno w nawiasach kwadratowych, jak i bez.

    ,

    Ponadto nacięcia asemblera są następujące: R - do rejestru, m - dla pamięci i - dla argumentu. Skróty stosowane są z numerami 816 i 32 w celu wskazania wielkości operandu. R8 M16 i32 i tak dalej D.

    dodano i8 /i16 /i32 M8 /M16 /M32; podsumowujący argument z komórek pamięci ,

    : mov zespołu lub przeniesienie

    instrukcji jest to główne zespoły montażowe. Pozwala na zapisanie w rejestrze wartości innego przypadku lub komórki pamięci lub stałej. Ona również pisze do komórki pamięcirejestruj wartość lub stałą. Składnia polecenia:

    MOV,

    W procesorze są inne polecenia do wykonania przekazywania. Na przykład XCHG jest poleceniem do wymiany wartości operandów. Ale z punktu widzenia programisty wszystkie są realizowane za pomocą polecenia podstawowego MOV. Spójrzmy na przykłady:

    MOV i, 0; Wpisz i wartość 0
    MOV ECX, EBX; Wysyłanie wartości EBX do ECX


    Operand może działać jako rejestr i komórka pamięci. Jednakże, jeśli zawartość dwóch rejestrów może być uporządkowana, to dwie komórki pamięci - nie. Należy uważać, aby operandy były tego samego rozmiaru. Zwróć też uwagę, że polecenie MOV nie zmienia wartości flag.

    Toolkit

    Dalsze badania teoretyczne asemblera mogą być trudne, więc należy pomyśleć o narzędziach użytych do opracowania programów przy jego pomocy. Oto krótka lista popularnych narzędzi:
  • Borland Turbo Assembler (TASM) jest jednym z najpopularniejszych narzędzi. Dobry do rozwijania w systemie DOS i zły - w systemie Windows.
  • Microsoft Macro Assembler (MASM) to pakiet do programowania w asemblerze w środowisku Windows. Istnieje zarówno w izolacji, jak i w postaci wbudowanej funkcji w środowisku Visual Studio. Asembler i języki wysokiego poziomu są często kompatybilne. W tym sensie, że ten drugi może bezpośrednio korzystać z asemblera. Na przykład z ++.
  • Netwide Assembler (NASM) to popularny darmowy assembler do architektury Intela.
  • Dostępnych jest wiele narzędzi. Należy zauważyć, że nie ma jednegostandardowy asembler składni. Istnieją 2 najbardziej odpowiednie: AT & T-syntax koncentruje się na procesorach Intel i, odpowiednio, składni Intel. Pomimo pozornej złożoności, asembler jest prostym językiem programowania, który pozwala zrozumieć, co nie działa. Dlatego bezpiecznie jest korzystać z literatury edukacyjnej w formie "asemblera dla manekinów" i uczyć się tego wspaniałego języka.

    Powiązane publikacje