Jazyk sestavení. Assembler příkazy a základy

8. 4. 2019

Článek se bude zabývat základy jazyka assembleru ve vztahu k architektuře win32. Jedná se o symbolický záznam strojních kódů. V každém elektronickém počítači je nejnižší úroveň hardware. Zde se řízení procesů provádí s pokyny nebo pokyny v jazyce stroje. Právě v této oblasti má assembler fungovat.

Programování assembleru

Psaní programu do assembleru je velmi náročný a nákladný proces. Chcete-li vytvořit efektivní algoritmus, potřebujete hluboké pochopení provozu počítače, znalost detailů příkazů a zvýšenou pozornost a přesnost. Efektivita je kritickým parametrem pro programování v assembleru.

Jak programovat na assembleru

Hlavní výhodou jazyka assembleru je, že vám umožňuje vytvářet krátké a rychlé programy. Proto se zpravidla používá k řešení specializovaných problémů. Potřebujete kód, který funguje efektivně s hardwarovými komponentami, nebo potřebujete program, který vyžaduje paměť nebo runtime.

Registru

Registry v jazyce assembleru se nazývají paměťové buňky umístěné přímo na čipu s procesorem ALU (procesorem). Funkcí tohoto typu paměti je rychlost přístupu k němu, která je mnohem rychlejší než paměť RAM počítače. Také se nazývá ultrarýchle paměti RAM (PopS nebo SRAM).

Existují následující typy registrů:

  1. Registry pro obecné účely (RON).
  2. Vlajky.
  3. Příkazový příkaz
  4. Segmentové registry.
Montážní registry

K dispozici je 8 univerzálních registrů, z nichž každý má 32 bitů.

EAX, ECX, EDX a EBX registru jsou přístupné v 32bitovém režimu, 16bitové - AX, BX, CX, DX a také 8bitové - AH a AL, BH a BL atd.

Písmeno "E" ve jménech registrů znamená Rozšířený. Samotná jména se vztahují k jejich jménům v angličtině:

  • Registr akumulátorů (AX) - pro aritmetické operace.
  • Čítač (CX) - pro směny a cykly.
  • Datový registr (DX) - pro aritmetické a I / O operace.
  • Registr základny (BX) - pro ukazatel na data.
  • Registr ukazatelů zásobníků (SP) - pro ukazatel na horní část zásobníku.
  • Stack Base Pointer register (BP) - pro indikátor základny stohu.
  • Index registru zdroje (SI) - pro ukazatel odesílatele (zdroje).
  • Rejstřík cílového indexu (DI) - pro příjemce.

Specializační jazyk sestavování RON je podmíněn. Mohou být použity v jakýchkoli operacích. Některé příkazy však mohou používat pouze určité registry. Například příkazy smyček používají ESX k uložení hodnoty čítače.

Registrovat vlajky. To znamená bajt, který může mít hodnoty 0 a 1. Kombinace všech příznaků (asi 30 z nich) ukazuje stav procesoru. Příznaky vlajky: Přenášení vlajky (CF) - vlajka Carry, Overflow Flag (OF) - přetečení, Nested Flag (NT) - příznak hnízdění úloh a mnoho dalších. Vlajky jsou rozděleny do tří skupin: stav, správa a systém.

Registry příznaků procesoru

Příkazový index (EIP - instrukční ukazatel). Tento registr obsahuje adresu instrukce, která musí být provedena dále, pokud není uvedeno jinak.

Segmentové registry (CS, DS, SS, ES, FS, GS). Jejich přítomnost v assembleru je diktována speciální kontrolou paměti RAM, aby se zvýšilo jeho využití v programech. Díky nim bylo možné spravovat paměť až na 4 GB. V architektuře Win32 není potřeba segmentovat, ale názvy registrů se zachovávají a používají se jinak.

Stack of

Toto je paměťová oblast přidělená pro běhové procedury. Zvláštností zásobníku je, že nejprve k němu jsou k dispozici nejnovější údaje. Jinými slovy: první položky zásobníku jsou načteny poslední. Tento proces si můžete představit jako věž výkresů. Chcete-li získat kontrolu (spodní věž ve spodní části věže nebo ve středu), musíte nejprve odstranit vše, co leží nahoře. A v důsledku toho je poslední část, která byla položena na věži, odstraněna nejprve při analýze věže. Tento princip organizování paměti a práce s ní je diktován její ekonomikou. Hromada je neustále vymačkána a vždy používá jeden postup.

Stack práce v assembleru

Identifikátory, celá čísla, symboly, komentáře, ekvivalence

Identifikátor v assembleru programovacích jazyků má stejný význam jako v jakémkoli jiném. Latinské písmena, čísla a symboly "_", ".", "?", "@", "$" Jsou povoleny. V tomto případě jsou velká a malá písmena ekvivalentní a bodka může být pouze první znak identifikátoru.

Celá čísla v assembleru mohou být specifikována v referenčních systémech se základnami 2, 8, 10 a 16. Jakýkoli jiný záznam čísel bude assemblerem považován za identifikátor.

Je povoleno používat písmena apostrofů i uvozovek. Pokud potřebujete zadat jednu z nich v řetězci znaků, jsou tato pravidla následující:

  • v řádku uzavřeném v apostrofech jsou citáty označeny jednou, apostrof dvakrát: "nemůže", "řekl" být nebo ne být ";
  • pro řetězec uzavřený v uvozovkách je pravidlo opak: dvojité uvozovky jsou duplikovány, apostrofy jsou označeny tak, jak je: "nemohl", "můj oblíbený bar je" "černá kočka" "" ".

Chcete-li označit poznámky v jazyce assembleru, použije se středníkem symbol - ";". Přípustné jsou komentáře jak na začátku řádků, tak po příkazu. Komentář končí novým řádkem.

Směrnice o rovnocennosti se používá podobným způsobem jako jiné konstantní výrazy. Ekvivalence je uvedena takto:

  EQU  

Tak v programu všechny výskyty bude nahrazen na jejímž místě je možné uvést celé číslo, adresu, řetězec nebo jiný název. Směrnice EQU je ve své práci #define podobná v jazyce C ++.

Datové směrnice

Jazyky na vysoké úrovni (C ++, Pascal) jsou zadány. To znamená, že používají data, která mají určitý typ, existují funkce pro jejich zpracování atd. V programovacím jazyku assembler neexistuje žádná taková věc. Existuje pouze 5 směrnic pro definici dat:

  1. DB - Byte: přidělit 1 bajt pro proměnnou.
  2. DW - slovo: vyberte 2 bajty.
  3. DD - Dvojité slovo: vyberte 4 bajty.
  4. DQ - Quad slovo: vyberte 8 bajtů.
  5. DT - Deset bajtů: přidělit 10 bajtů proměnné.

Písmeno D znamená Definovat.

Jakákoli směrnice může být použita pro deklarování jakýchkoli dat a polí. Pro řetězce se však doporučuje DB.

Syntaxe:

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

Jako operand je povoleno používat čísla, symboly a otazník - "?", Označení proměnné bez inicializace. Zvažte příklady:

 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 

Příkazy (instrukce)

Syntaxe příkazů assembleru nebo instrukcí assembleru je následující:

    

Označení (štítek :) musí skončit dvojtečkou a může být umístěno na samostatném řádku. Štítky se používají k označení příkazů v rámci programu.

Pokyny uvádějí operaci, která má být provedena. V assembleru jsou operace uvedeny ve formě písmen zkratky pro usnadnění porozumění. Pokyny mohou být také nazývány mnemonií.

V roli operandů mohou být příkazy:

  • registrů přístupných jejich jmény;
  • konstanty;
  • adresy.

Více o adresách

Adresa může být přenášena několika způsoby:

  1. Ve formě názvu proměnné, která je v assembleru synonymem pro adresu.
  2. Pokud je proměnná pole, přístup k prvku pole se uskutečňuje přes název jeho proměnné a posunutí. Existují 2 formy: [<název> + <offset>] a <name> [<offset>]. Všimněte si, že offset není index v poli, ale velikost v bajtech. Programátor sám musí pochopit, kolik musí být v bajtech proveden offset, aby se získal požadovaný prvek pole.
  3. Můžete použít registry. Pro přístup do paměti, ve které je registr uložen, musíte použít hranaté závorky: [ebx], [edi].
  4. [] - závorky umožňují použití složitých výrazů uvnitř sebe pro výpočet adresy: [esi + 2 * eax].

V assembleru se adresa vysílá přes hranaté závorky. Vzhledem k tomu, že proměnná je také adresa, může být použita s hranatými závorkami nebo bez nich.

Adresa v assembleru

Navíc existují zkratky v assembleru: r pro registru, m pro paměť a i pro operand. Tyto zkratky se používají s čísly 8, 16 a 32 pro označení velikosti operandu: r8, m16, i32 atd.

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

Příkaz Mov nebo dopředu

Tato instrukce je hlavní mezi příkazy assembleru. Umožňuje zapsat do registru hodnotu jiného registru, paměťové buňky nebo konstanty. Rovněž zapisuje hodnotu registru nebo konstantu do paměťové buňky. Syntaxe příkazů:

 MOV ,  MOV ,  

Existují i ​​další příkazy v procesoru k implementaci přenosu. Například XCHG je příkaz pro výměnu operandů podle hodnot. Ale z pohledu programátora jsou všechny implementovány prostřednictvím základního příkazu MOV. Zvažte příklady:

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

Ve formě operandu může fungovat jako registr a paměťová buňka. Pokud však obsah těchto dvou registrů může být znovu uspořádán, neexistují dva paměťové buňky. Je třeba dbát na to, aby operandy měly stejnou velikost. Pamatujte také, že příkaz MOV nemění hodnotu příznaků.

Příkaz MOV v assembleru

Nástrojová sada

Další teoretická studie assembleru může být obtížná, takže byste měli uvažovat o nástrojích používaných k vývoji programů s ním. Zde uvidíte pouze seznam oblíbených nástrojů:

  • Borland Turbo Assembler (TASM) je jedním z nejoblíbenějších nástrojů. Dobré pro vývoj v prostředí DOS a špatné pro Windows.
  • Microsoft Macro Assembler (MASM) je balíček pro vývoj v jazyce sestavení v prostředí Windows. Existuje samostatně a jako vestavěná funkce v prostředí Visual Studio. Assembler a jazyky vysoké úrovně jsou často kompatibilní. V tom smyslu, že tento může přímo použít assembler. Například C ++.
  • Netwide Assembler (NASM) je populární bezplatný assembler pro architekturu Intel.
Programování assembleru

Existuje mnoho nástrojů. V tomto případě je třeba si uvědomit, že neexistuje jednotný standard pro syntaxi sestav. Existují dva nejpoužívanější syntaxe: AT & T syntaxe, zaměřená na výrobní procesory jiné než Intel, a tedy syntaxi Intel.

Přes zjevnou složitost, assembler je jednoduchý programovací jazyk, který je snadno pochopitelný. Proto můžete bezpečně používat vzdělávací literaturu o podobnosti "assembleru pro figuríny" a učit se tento nádherný jazyk.