Język złożenia. Polecenia asemblera i podstawy

08.04.2019

W artykule omówiono podstawy języka asemblera w odniesieniu do architektury win32. Jest to symboliczny zapis kodów maszynowych. W każdym komputerze elektronicznym najniższym poziomem jest sprzęt. Tutaj zarządzanie procesami odbywa się z instrukcjami lub instrukcjami w języku maszynowym. To właśnie w tym obszarze ma działać asembler.

Programowanie asemblera

Pisanie programu w asemblerze jest niezwykle trudnym i kosztownym procesem. Aby stworzyć skuteczny algorytm, potrzebujesz głębokiego zrozumienia działania komputera, znajomości szczegółów poleceń, a także zwiększonej uwagi i dokładności. Wydajność jest krytycznym parametrem do programowania w asemblerze.

Jak programuje się na asemblerze

Główną zaletą języka asemblera jest to, że pozwala on tworzyć krótkie i szybkie programy. Dlatego jest z reguły wykorzystywany do rozwiązywania problemów specjalistycznych. Potrzebujesz kodu, który działa sprawnie z komponentami sprzętowymi lub potrzebujesz programu wymagającego pamięci lub środowiska wykonawczego.

Rejestry

Rejestry w języku asemblera nazywane są komórkami pamięci umieszczonymi bezpośrednio na chipie z jednostką ALU (procesor). Cechą tego typu pamięci jest szybkość dostępu do niej, która jest znacznie szybsza niż pamięć RAM komputera. Jest również nazywany ultra-szybką pamięcią RAM (PopS lub SRAM).

Istnieją następujące typy rejestrów:

  1. Rejestry ogólnego przeznaczenia (RON).
  2. Flagi.
  3. Wskaźnik polecenia
  4. Rejestr segmentów.
Rejestry zgromadzeń

Istnieje 8 rejestrów ogólnego przeznaczenia, każdy po 32 bity.

Do rejestrów EAX, ECX, EDX, EBX można uzyskać dostęp w trybie 32-bitowym, 16-bitowym - AX, BX, CX, DX, a także 8-bitowym - AH i AL, BH i BL itd.

Litera "E" w nazwach rejestrów oznacza Rozszerzony (rozszerzony). Same imiona są związane z ich nazwiskami w języku angielskim:

  • Rejestr akumulatorów (AX) - dla operacji arytmetycznych.
  • Rejestr licznika (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 na górze stosu.
  • Stack Base Pointer register (BP) - dla wskaźnika podstawy stosu.
  • Rejestr indeksu źródłowego (SI) - dla wskaźnika nadawcy (źródła).
  • Rejestr adresu przeznaczenia (DI) - dla odbiorcy.

Specjalizacja Język asemblerowy RON jest warunkowy. Mogą być używane w dowolnych operacjach. Jednak niektóre polecenia są w stanie używać tylko niektórych rejestrów. Na przykład polecenia pętli używają ESX do przechowywania wartości licznika.

Rejestr flag. Oznacza to bajt, który może przyjmować wartości 0 i 1. Kombinacja wszystkich flag (jest ich około 30) pokazuje stan procesora. Przykłady flag: Carry Flag (CF) - Carry flag, Overflow Flag (OF) - overflow, Flaga zagnieżdżona (NT) - flaga zagnieżdżania zadań i wiele innych. Flagi są podzielone na 3 grupy: status, zarządzanie i system.

Rejestry flag procesorów

Indeks poleceń (EIP - Wskaźnik instrukcji). Ten rejestr zawiera adres instrukcji, która musi zostać wykonana w następnej kolejności, chyba że określono inaczej.

Rejestry segmentów (CS, DS, SS, ES, FS, GS). Ich obecność w asemblerach jest podyktowana specjalną kontrolą pamięci RAM w celu zwiększenia jej wykorzystania w programach. Dzięki nim możliwe było zarządzanie pamięcią do 4 GB. W architekturze Win32 nie ma potrzeby stosowania segmentów, ale nazwy rejestrów są zachowywane i używane w inny sposób.

Stos

Jest to obszar pamięci przydzielony do wykonywania procedur. Osobliwością stosu jest to, że najnowsze zapisane w nim dane są dostępne do czytania jako pierwsze. Lub innymi słowy: pierwsze wpisy na stosie są pobierane jako ostatnie. Możesz sobie wyobrazić ten proces jako wieżę przeciągów. Aby uzyskać kontroler (dolny pionek u podstawy wieży lub którykolwiek z nich w środku), musisz najpierw usunąć wszystko, co leży na górze. I, odpowiednio, ostatni element umieszczony na wieży, jest usuwany pierwszy podczas analizy wieży. Ta zasada organizacji pamięci i pracy z nią jest podyktowana jej ekonomią. Stos jest stale czyszczony i za każdym razem używa go jedna procedura.

Praca w stosie w asemblerze

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

Identyfikator w języku programowania asemblera ma takie samo znaczenie jak w każdym innym. Łacińskie litery, cyfry i symbole "_", ".", "?", "@", "$" Są dozwolone. W tym przypadku wielkie 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 z podstawami 2, 8, 10 i 16. Każdy assembler rozpoznaje dowolny inny wpis liczb jako identyfikator.

Dozwolone jest używanie zarówno apostrofów, jak i cytatów przy pisaniu danych znakowych. Jeśli musisz podać jeden z nich w ciągu znaków, reguły są następujące:

  • w linii ujętej w apostrofy, cytaty są wskazane raz, apostrof - dwa razy: "nie może", "powiedział" być albo nie być ";
  • w przypadku ciągu znaków ujętego w cudzysłowy reguła jest odwrotna: podwójne cudzysłowy są duplikowane, apostrofy są oznaczone jako: "nie można", "Mój ulubiony pasek to" "Czarny kot" "".

Aby wskazać komentarze w języku asemblera, użyty zostanie symbol średnika - ";". Dopuszczalne jest użycie komentarzy zarówno na początku linii, jak i po komendzie. Komentarz kończy się znakiem nowej linii.

Dyrektywa równoważności jest używana w podobny sposób do innych wyrażeń stałych. Równoważność jest wskazana w następujący sposób:

  EQU  

Tak więc w programie wszystkie wystąpienia zostanie zastąpiony przez w miejscu, w którym można wskazać liczbę całkowitą, adres, ciąg lub inną nazwę. Dyrektywa EQU jest podobna w swojej pracy do #define w C ++.

Dyrektywy dotyczące danych

Języki wysokiego poziomu (C ++, Pascal) są wpisywane. Oznacza to, że używają danych, które mają określony typ, są funkcje do ich przetwarzania itp. W języku programowania asembler, nie ma czegoś takiego. Istnieje tylko 5 dyrektyw dotyczących definicji danych:

  1. DB - Bajt: przydziel 1 bajt dla zmiennej.
  2. DW - Word: wybierz 2 bajty.
  3. DD - Podwójne słowo: wybierz 4 bajty.
  4. DQ - słowo czwarte: wybierz 8 bajtów.
  5. DT - Dziesięć bajtów: przydziel 10 bajtów dla zmiennej.

Litera D oznacza Zdefiniuj.

Dowolna dyrektywa może być używana do deklarowania dowolnych danych i tablic. Jednak w przypadku łańcuchów zalecane jest DB.

Składnia:

  DQ [, ]   DQ [, ]   DQ [, ] 

Jako operand dopuszczalne jest stosowanie cyfr, symboli i znaku zapytania - "?", Oznaczającego zmienną bez inicjalizacji. Rozważ przykłady:

 real1 DD 12.34char db 'c'ar2 db '123456',0 ; массив из 7 байтnum1 db 11001001b ; двоичное числоnum2 dw 7777o ; восьмеричное числоnum3 dd -890d ; десятичное числоnum4 dd 0beah ; шестнадцатеричное числоvar1 dd ? ; переменная без начального значенияar3 dd 50 dup (0) ; массив из 50 инициализированных эл-товar4 dq 5 dup (0, 1, 1.25) ; массив из 15 эл-тов, инициализированный повторами 0, 1 и 1.25 

Polecenia (instrukcje)

Składnia poleceń asemblera lub instrukcji asemblera wygląda następująco:

    

Etykieta (etykieta :) musi kończyć się dwukropkiem i może być umieszczona w osobnej linii. Etykiety są używane w odniesieniu do poleceń w programie.

Instrukcje wskazują czynności do wykonania. W asemblerach operacje są przedstawiane w formie skrótów literowych w celu ułatwienia zrozumienia. Instrukcje można również nazwać mnemonikami.

W roli argumentów operacji mogą być:

  • rejestry dostępne przez ich nazwy;
  • stałe;
  • adresy.

Więcej informacji o adresach

Adres można przesłać na kilka sposobów:

  1. W postaci nazwy zmiennej, która w asemblerze jest synonimem adresu.
  2. Jeśli zmienna jest tablicą, wówczas dostęp do elementu tablicy następuje przez nazwę jej zmiennej i przesunięcia. Dostępne są 2 formy: [<nazwa> + <przesunięcie>] i <nazwa> [<przesunięcie>]. Zwróć uwagę, że przesunięcie nie jest indeksem w tablicy, ale rozmiarem w bajtach. Sam programista musi zrozumieć, ile musi być przesunięcie w bajtach, aby uzyskać pożądany element tablicy.
  3. Możesz użyć rejestrów. Aby uzyskać dostęp do pamięci, w której zapisywany jest rejestr, należy użyć nawiasów kwadratowych: [ebx], [edi].
  4. [] - nawiasy pozwalają na użycie wyrażeń złożonych w sobie, aby obliczyć adres: [esi + 2 * eax].

W asemblerach adres jest przesyłany w nawiasach kwadratowych. Ponieważ zmienna jest również adresem, może być używana z nawiasami kwadratowymi lub bez nich.

Adres w asemblerze

Ponadto istnieją skróty w asembler: r dla rejestrów, m dla pamięci i i dla operandu. Skróty te są używane z liczbami 8, 16 i 32, aby wskazać rozmiar argumentu: r8, m16, i32 itd.

 add i8/i16/i32, m8/m16/m32 ;суммирование операнда с ячейкой памяти 

Polecenie mov lub do przodu

Ta instrukcja jest główną z poleceń asemblera. Umożliwia zapisanie do rejestru wartości innego rejestru, komórki pamięci lub stałej. Zapisuje również wartość rejestru lub stałej do komórki pamięci. Składnia poleceń:

 MOV ,  MOV ,  

Istnieją inne polecenia w procesorze do realizacji transferu. Na przykład XCHG jest poleceniem do wymiany operandów według wartości. Ale z punktu widzenia programisty wszystkie są realizowane za pomocą podstawowego polecenia MOV. Rozważ przykłady:

 MOV i, 0 ; Записать в i значение 0MOV ECX, EBX ; Пересылка значения EBX в ECX 

W postaci argumentu może działać jako rejestr i komórka pamięci. Jednakże, jeżeli zawartość dwóch rejestrów może zostać zmieniona, wówczas nie ma dwóch komórek pamięci. Należy zadbać o to, aby operandy były tej samej wielkości. Zwróć też uwagę, że polecenie MOV nie zmienia wartości flag.

Polecenie MOV w asemblerze

Toolkit

Dalsze teoretyczne badania asemblera mogą być trudne, więc powinieneś pomyśleć o narzędziach używanych do tworzenia programów z nim. Tutaj zobaczysz tylko krótką listę popularnych narzędzi:

  • Borland Turbo Asembler (TASM) to jedno z najpopularniejszych narzędzi. Dobry do rozwoju pod DOS i zły dla Windows.
  • Microsoft Macro Assembler (MASM) to pakiet do programowania w języku asemblerowym w środowisku Windows. Istnieje zarówno osobno, jak i jako wbudowana funkcja 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 C ++.
  • Netwide Assembler (NASM) to popularny darmowy assembler do architektury Intela.
Programowanie asemblera

Istnieje wiele narzędzi. W tym przypadku należy zwrócić szczególną uwagę, że nie ma jednolitego standardu dla składni asemblera. Istnieją 2 najbardziej odpowiednie: składnia AT & T, koncentruje się na procesorach produkcyjnych innych niż Intel, i odpowiednio, składni Intel.

Pomimo pozornej złożoności, asembler jest prostym językiem programowania, który jest łatwy do zrozumienia. Dlatego możesz bezpiecznie korzystać z literatury edukacyjnej na temat podobieństwa "asemblera dla manekinów" i nauczyć się tego wspaniałego języka.