…meie igapäevast IT’d anna meile igapäev…

2007-03-18

Programmeerimiskeeled: Assembler

Filed under: Infotehnoloogia,Programmeerimine — Sander @ 14:22:58

Assembler… milline elegants ja kiirus. Ja milline aeglus kirjutamisel…

Iga programmeerija peab vähemalt veidi olema tuttav assembleriga – et saada aru, mis juhutub, kui sa oma kaunis RAD-keskkonnas „Compile” nuppu vajutad.

Tänapäeval pole assembler enam kuigi laialt kasutuses – vaid kohtades, kus kiirus tõesti oluline on, näiteks graafikamootorid (pixel shader‘id – ehkki ka nende jaoks on nüüd juba muud arendusvahendid olemas) ja teatud draiverites või nende osades. Samuti BIOS ja teatud meediakoodekid on kirjutatud assembleris.

Üheks põhjuseks assembleri populaarsuse vähenemises on kindlasti assembleri koodimise kiirus, mis üldjuhul isegi C’le kümnetes kordades alla jääb. Teiseks põhjuseks on kompilaatorite areng – C/C++ kompilaatorid on saanud nii heaks, et puudub vahe, kas kirjutad koodi assembleris või C’s – ehk, C on uus assembler.

Ning kolmas põhjus on loomulikult lihtsalt arvutite kiiruse kasv. Kui MS-DOS 6.22 on täielikult kirjutatud assembleris (lähtekood on saadaval siit), siis juba Windowsi esimesed versioonid olid kirjutatud C’s, kasutades embedded assemblerit vajaduse korral. Ning väidetavasti on Windows 98’st edasi kirjutatud suur osa kasutajaliidesest üldse Visual Basicus – see olevat (taaskord, väidetavasti) ka Windows ME probleemide üheks allikaks.

***

Minu tutvus assembleriga algas üheksakümnendate keskpaigas – siis kui tegin tutvust ka C’ga. Aeg-ajalt oli vaja kirjutada pisikesi jupikesi assemblerit C sisse – näiteks rebuutida arvutit või suhelda hiirega. Ega ma palju seda ei osanud – enamus oli raamatutest pärit näited või mujalt koodist „laenatud” asjad.

Millalgi üheksakümnendate lõpus tutvusin assembleriguru Iczelioniga. Iczelion kirjutas assembleris koodi umbes sama kiiresti, kui tavalised inimesed kirjutavad teksti – see tähendab, et piirajaks oli trükkimise kiirus…

Iczelion kirjutas mulle vajaduse korral assembleris dll’e ja ka assemblerit, mida ma sain Delphi või C++ koodi sisse embeddida. Kiirus on nendel asjadel fenomenaalne, nõnda näiteks suudab SearchBoti poolt kasutatav dll otsida tekstifailidest kiirusega tunduvalt rohkem kui 100MB/s – see on wildcard otsing paljudest pisikestest tekstifailidest. Enamik aega kulub seejuures failide avamisele ja sulgemisele…

Üks tuttav kirjutas katseks VC++ 6’s asenduse – selle kiiruseks oli umbes pool Iczelioni dll’ist. Ise kirjutasin Delphis sarnase katsetuse – ning kiiruseks oli umbes kolmandik. Nagu öeldakse, kommentaarid on liigsed…

***

Viimasel ajal pole enam üldse assembleriga kokku puutunud – ega seda kirjutanud. Ega ei oskaks ka enam, kui aus olla – peaksin päris algusest peale uuesti õppima. Aga pole vaja ka olnud, kõrgkeelte aeg on käes.

Vanast peast hea meenutada „Aga meie pidime omal ajal isegi hiire draiveri assembleris kirjutama…”

4 kommentaari »

  1. ASM rokib! Kuigi ma töötan programmeerijatega igapävasel koos ei taha ma programmeerijaks saada aga minu parimad elamused seoses programmeerimisega just Assambleriga seotud. Koolis sai seda mikrokontrollerite programmeerimiseks kasutatud ja kooli sisesel praktikal püütud luua tabloo mida juhtis minu poolt Assambleris täiendatud kivike. Viimane muidugi kunagi valmis ei saanud. Aga nii mõnigi teine asi sai ja lahe oli igast väikseid programmi juppe kokku keerata ja siis vaadata mida kurat nüüd juhtuma hakkab.

    kommentaar kirjutas kixs — 2007-03-18 @ 17:14:18 | Vasta

  2. Asmi stardipaugu andis minu jaoks aastal 93 kahes .exe numbris ilmunud dosi debugi artiklid. Hiljem on ka PIC-ide ja AVR-ide koodi näpitud. Olid ajad…
    Asmi tähtsus ongi arusaamises, kuidas tegelikult proses programmike käib, ning mida tegelikult kiirus tähendab.
    Tuleb meelde kunagine mudavestlus vanainimeste asja teemal erinevates programmeerimiskeeltes. Asm loomulikult võidutses kiiruses ja lihtsuses.
    @DO
    push in;
    pop out;
    jmp @DO;

    kommentaar kirjutas Fog — 2007-03-21 @ 12:22:09 | Vasta

  3. Assemblerit läheb siiski tänapäevalgi vaja (vähemalt lugemisoskuse tasemel) vahest debuggeriga mõne (mitte tingimata enda tehtud) proge sisse vaatamiseks :)
    Või siis selleks, et vaadata ja kiruda kui mõttetu masinkoodi JIT kompilaator jälle kokku keerand on :

    kommentaar kirjutas Coder — 2007-04-11 @ 20:06:39 | Vasta

  4. Hetkel(07.2007) ma veel x86 asmi ei oska(olgu-olgu, sai
    kunagi kuskil praksis midagi…), aga mul tuli tööjuures
    üks jõle kaval kala ette, mida ma ei GDB-ga(GNU debugger) välja ei õnnestunud
    uurida. Ütleme nii, et ma jõudsin kohta, kus minu koodis olnud
    rida, mis programmi kokku varistab, oli ümbritsetud
    minu poolt antud std::cout ridadega, GDB-l on magasin(“stack”) segi ja GDB bt annab hoopis vea kuskil C++ standardteegis.

    Minu jaoks oli küll väga õpetlik kõrvalt näha, kuidas
    mu üks juhendajatest, Paavo Helde, kirjutas rahumeeli
    C++ koodi sisse
    asm(“int $3”), mis peatab sunnib GDB käituma, nagu seal oleks peatuspunkt, ning siis disassemble käsuga välja uuris, et ma olin kogemata gcc-le söötnud sse3 käskude genereerimise argumendi. Antud CPU aga ei toetanud sse3 käske.

    Tegelikult ilmus kokkuvarisemisel konsoolile
    küll teade “illegal instruction”, aga juu see siis kedagi meist tol hetkel ei veennud.

    Ühesõnaga, kokkuvõte: ASM-i läheb vaja kõrgtasemelt leiduvate räigeimate ja salapäraseimate probleemide lahendamiseks. Antud juhtumil tuli asmi uurimisel välja, millist konsooliparameetrit ei või kompilaatorile anda.

    kommentaar kirjutas Martin Vahi — 2007-07-30 @ 02:29:30 | Vasta


RSS feed for comments on this post. TrackBack URI

Lisa kommentaar

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Muuda )

Twitter picture

You are commenting using your Twitter account. Log Out / Muuda )

Facebook photo

You are commenting using your Facebook account. Log Out / Muuda )

Google+ photo

You are commenting using your Google+ account. Log Out / Muuda )

Connecting to %s

Create a free website or blog at WordPress.com.