Význam assembleru dnes - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Odkud pochází fotografka Anne Erhard?

V dnešní soutěži hrajeme o:



Assembler

Význam assembleru dnes

asm

29. listopadu 2001, 00.00 | Programování aplikací na osobních počítačích v assembleru se již zcela jistě přehouplo přes vrchol své slávy a užitečnosti. Přesto má i dnes pochopení tohoto jazyka své opodstatnění.

Programování aplikací na osobních počítačích v assembleru se již zcela jistě přehouplo přes vrchol své slávy a užitečnosti. Přesto má i dnes pochopení tohoto jazyka své opodstatnění. Programování v RAD aplikacích programátorovi ušetří rutinní práci generováním kódu, který se v různých obměnách objevuje v každém programu, ale zároveň před ním umně skryje (ale zároveň vyřeší) množství problémů, které je v assembleru nutné pracně ošetřovat. Zájem o asm odkrývá spoustu technických detailů souvisejících s architekturou procesoru, komunikací s hardwarem, strukturou dat a posloupností kroků, které musí počítač provést, než např. vytiskne jednoduché "Ahoj". Pochopení fundamentů na kterých jsou vyšší jazyky vybudovány je dnes určitě největší přínos tohoto jazyka. Podobně jasko bývá pascal považován za dobrý nástroj k pochopení algoritmizace a základů programování, tak je assembler ideální nástroj k bližšímu prozkoumání celé řady pojmů, vztahů a principů na kterých jsou vyšší jazyky vybudovány. Přesto existují oblasti (a budou existovat určitě ještě dlouho), ve kterých je znalost assembleru nepostradatelná:
-debugging, dissasembling a cracking a ochrana proti němu
-tvorba virů a antivirů
-optimalizace algoritmů
-orientace v programu, ktery napsal někdo znalý assembleru
-programování překladačů
-programování OS
-programování ovladačů
-poznání pozadí programování ve vyšším jazyce
-navrhy nových čipů, procesorů,...

1. Proces tvorby .COM souboru
Proces vytvoření spustitelného souboru od zdrojového kódu je vysvětlen na obrázku:

Editor: Ke tvorbě zdrojového kódu lze použít jakýkoliv textový editor, který generuje čistý text, např. EDIT.COM nebo NotePad. Kromě toho bylo vytvořeno několik povětšinou freeware nebo shareware editorů, které najdete na Internetu, např. Aside nebo AsmEDIT. Zdrovové soubory vytvořené takovým editorem mají příponu .ASM.
Compiler: Compiler nebo česky překladač vytváří soubory .OBJ, které obsahují tzv. relativní kód počítače, ve kterém ještě nejsou známy všechny adresy, apod. Dalším možným výstupem je soubor .LST, ve kterém najdete zdrojový kód s očíslovanými řádky, příslušnými adresami, zakódovanými instrukcemi a co je nejdůležitějsí soubor obsahuje označené řádky spolu s chybami, které obsahují. Překladač od firmy Borland se nazývá Tasm.
Linker: Relativní adresy nahradí absolutními a vytvoří spustitelný soubor .COM. Soubor TLink.
Debugger: Ladící program, který umožňuje krokovat celý program, plus nabízí spoustu dalších důležitých informací. Soubor Td.
El. manuál: Elektronický manuál je nezbytnou pomůckou při tvorbě programů. Obsahuje informace, bez kterých se při programování v assembleru neobejdete. Na Internetu je ke stažení Sysman nebo ABShelp, apod.

1.1 Dávkový soubor - kompilace
Pro zjednodušení práce je výhodné vytvořit si následující dávkový soubor asm.bat:
C:\BP\BIN\TASM %1.asm /Z /la
C:\BP\BIN\TLINK %1.obj /Tdc /x
Překlad zdrojového souboru z jazyka symbolických adres do strojového kódu provedeme příkazem asm název_souboru, kde název souboru uvedeme bez přípony.

2.0 Direktivy překladače
Direktivy jsou součástí zdrojového kódu, nejsou součástí instrukčního repertoáru procesoru ale řídí činnost překladače. Je jich samozřejmě veliké množství, uveďme slespoň ty nejnutnější:
ASSUME - informace pro překladač o přiřazení bázových adres segmentů jednotlivým segmentovým registrům
SEGMENT, ENDS - začátek a konec segmentu
END - direktiva ukončující překlad
ORG - z anglického origin=vznik, počátek, označuje hodnotu čítače instrukcí (IP) pro následující instrukci.
EQU - obdoba const v pascalu, přiřadí symbolu číselné hodnoty nebo řetězce (př. PI EQU 3.1415)

2.1 Struktura .COM souboru
Soubor .COM se skládá z několika základních částí:
example SEGMENT ;zacatek segmentu kde example=nazev segmentu
ASSUME CS:example,DS:example ;prirazeni bazove adresy segmentu registrum DS a CS
ORG 100h ;odskok=nastaveni IP na hodnotu 100h
start:
JMP zacatek
; misto pro data programu
zacatek: ;zacatek kodu programu (sledu instrukci)
;misto pro kód programu
example ENDS ;konec segmentu example (v souborech typu .EXE muze byt i vice segmenu)
END start ;konec prekladu
Otázky možná vzbuzuje direktiva ORG 100h, proč začíná program až na adrese 100h? Programu v paměti přechází tzv. prefix programového segmentu (PSP), kde jsou na 100h=256 bajtech uloženy informace o stavu souboru, včetně např. parametrů příkazové řádky.

2.2 Popis .COM souboru
Velikost souboru .COM je omezena na jeden segment, ve kterém jsou uložene data, kód i zásobník. Přesná velikost souboru je tedy 216 -256(PSP) = 65280 bajtů. Registr SP se nastaví na hodnotu FFFEh (konec segmentu PSP). Ukládáním dat na zásobník může dojít k jeho přetečení do oblasti kódu nebo dat a způsobit tak pád systému.


3. Formát instrukce 8086
Pokud si v nějakém editoru otevřete přeložený soubor uvidíte v něm změť ASCII znaků. Jedná se o znakovou verzi strojového formátu instrukce. Tento formát se může skládat až ze šesti slabik. Nejdůležitější částí je operační kód, který je číselným převodem textového zápisu instrukce. Bity d, w mají různý význam, ale většinou určují velikosti operandů, informace vztahující se k 2.slabice, atd.. Část mód určuje typy operandů a část reg typ registru.Pole r/m určuje adresu operandu v paměti. Existence třetí až šesté slabiky záleží na typu instrukce, jejich obsahy zadává programátor.


3.1 Příklad strojového kódu
Mějme jednoduchý příklad, který vytiskne tři znaky A na pozici kurzoru na obrazovce:
CODE SEGMENT
ASSUME CS:CODE
ORG 100h
start:
mov bh, 0h ; cislo stranky obrazovky
mov al, 41h ; znak A
mov cx, 3h ; pocet opakovani
mov ah, 0Ah ; napis znak na pozici kursoru
int 10h ; sluzby obrazovky
mov ax, 4c00h ;EXIT, vystupni kod=0
int 21h ; ukonceni programu
CODE ENDS
END start
Pokud si příklad přeložíte a otevřete souborem edit.com uvidíte nepřehlednou směsici znaků:

Abychom pochopili co znamenají podívejme se na následující tabulku:
Edit.com převádí jednotlivá čísla podle ASCII tabulky na příslušné znaky. Zpětným převedením získáme čísla - strojový zápis instrukce, ze kterého můžeme určit symbolický zápis instrukce (funkce debuggeru) s jejími operandy. Součtem všech položek o velikosti jednoho bajtu získáme velikost souboru. Soubor samozřejmě můžeme editovat přímo změnou některého ASCII znaku na jiný. Příkladem takové změny je záměna znaku A na B a znaku ETX na $. Program potom místo tří znaků A vytiskne 35 znaků B. Důležité je ze souboru odstranit znak CR (carriage return), který tam editory za znak LF (line feed) většinou přidají.Všimněte si, že čísla velikosti word 0003h a 4c00h jsou v souboru uložena opačně, tzn., významnější bit (nižší) je uložen jako první. Nejprve uloží 03h a teprve potom 00h. To, že se explicitně zadané hodnoty ukládají stejně jako zapsané instrukce nás vede k možnosti zapsat stejný příklad následujícím způsobem:

CODE SEGMENT
ASSUME CS:CODE
ORG 100H
start:
Pole db 0B7h,00h,0B0h,41h,0B9h,03h,00h,0B4h,0Ah,0CDh,10h,0B8h,00h,4Ch,0CDh,21h
CODE ENDS
END start


4. Proměnné
Proměnná je pojmenované místo v paměti, ve kterém je uložena nějaká hodnota. Assembler umožňuje deklarovat několik typů proměnných:
DB (define byte) -proměnná o velikosti 1 bajtu (slabiky)
DW (define word) -proměnná o velikosti 2 bajtů (2 slabiky=slovo)
DD (define double word)-proměnná o velikosti 4 bajtů
DF,DP (define far byte) -proměnná o velikosti 6 bajtů
DQ (define quadword) -proměnná o velikosti 8 bajtů
DT (define tenbyte) -proměnná o velikosti 10 bajtů

4.1 Použití proměnných
Deklarace proměnné o velikosti jednoho bajtu s počáteční hodnotou 0Fh:
PROM DB 0Fh
Deklarace proměnné o velikosti dvou bajtů s nedefinovanou počáteční hodnotou:
PROM DW ?
Deklarace pole o velikosti 100 bajtů s nedeklarovanými hodnotami:
POLE DB 100 dup(?)
Deklarace pole o velikosti 100 * 3 bajty s opakujícími se hodnotami 5, 5, 7 :
POLE DB 100 dup(5,5,7)
Deklarace pole o velikosti 10 * 9 bajů; s opakujícím se řetězcem 'assembler' :
POLE DB 10 dup('assembler')
Deklarace řetězce o velikosti 7 bajtů:
RETEZEC DB 'priklad'
Nakonec jedno upozornění, před číselnými hodnotami v šestnáctkové soustavě musí znakům A,B,C,D,E,F vždy předcházet nějaká číslice a za číslem musí následovat symbol h.

Tématické zařazení:

 » Rubriky  » Assembler  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: