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.
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.
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 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:
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:
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.
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.
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.
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:
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
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:
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
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ć:
Adres można przesłać na kilka sposobów:
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.
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 ;суммирование операнда с ячейкой памяти
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.
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:
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.