Asamblarea programelor

Publicat deMadalina Marcu

Motto:
‘Assembly is the language that before you can shoot yourself in the foot you have to invent the gun, hand, leg, and foot.’

In aceasta lucrare dorim sa transcriem un program in sursa pentru TASM. TASM vine de la TURBO assembler si este un compilator de assembler care ne ofera diferite facilitati, de la evidenta adreselor, pana la optimizarea codului (?!). Principalele avantaje sunt posibilitatea scrierii codului intr-un editor civilizat (nu ca la arhaicul debug) si calculare automata a adreselor de memorie. Momentan vom transcrie programul si vom da o explicatie scurta la fiecare linie. TASM este mult mai complex decat il voi prezenta aici, dar il voi prezenta mai pe larg pe parcurs. Iata codul:

.model tiny
.code 
               org 100h
start:
               mov dx, offset text
               mov ah, 09h
               int 21h
               mov ax, 4c00h
               int 21h
text          db 'Hello World!$'
end start

      Parca nu exista modificari majore, nu ? Totusi iata ce a aparut:

.model tiny

      Linia aceasta se pune la inceputul codului si explica compilatorului ca programul care intentionam noi sa-l facem este un program care isi pastreaza toate datele (codul, stack, buffer, date suplimentare) intr-un singur segment de memorie. Toate programele com sunt model tiny (mai exista modelele small, medium, large, huge, dar acestea sunt pentru fisiere exe). Eu personal sunt de parere ca ceea ce nu incape intr-un tiny n-ar trebui programat in assembler, deci toate programele care le vom folosi ca exemple vor fi model tiny.

.code

      Aceasta linie explica compilatorului ca ceea ce va gasi el mai jos este codul programului si va trebui sa-l trateze ca atare.

org 100h

      Aceasta linie explica compilatorului ca noi vom intentiona sa compilam respectivul program ca un fisier com. Fisierele com sunt incarcate de sistemul de operare direct in memorie (asta inseamna ca un fisier com contine exact imaginea programului din memorie in momentul executarii acestuia) intr-un segment liber de memorie, incepand cu adresa 0100h. Deci noi va trebui sa spunem compilatorului ca prima instructiune are adresa 0100h (si nu 0). Compilatorul necesita aceasta informatie pentru a calcula adresele la care se afla datele si adresele de salt absolut.

start... end start

      Indica inceputul si sfarsitul programului. Intre start si end start (sau ori ce alt label) trebuie sa se afle toate functiile, subfunctiile, codul, date…etc a programului.
      Apoi urmeaza codul. In cod, sigurul lucru ciudat exte acel mov dx, offset text. Daca ne uitam mai jos, vedem ca textul nostru a primit un label (text). Deci practic ceea ce am zis noi se traduce in: pune in DX adresa (offset se traduce mai degraba ca ‘la ce distanta de mine’) textului text. Deci, in loc sa calculam noi unde se afla respectivul text (cum am facut pana acum) compilatorul face asta pentru noi.
      Acum cred ca am sa abandonez Hello World, pentru ca deja am invatat destule pe spinarea lui. Urmatorul program care il propun va face urmatoarele: va primi in linia de comanda 1 argument (o parola). Apoi va citi datele de la tastatura (fisier) si le va encripta folosind parola si va scrie pe ecran (fisier) rezultatul (vom privi tastatura ca un fisier si ecranul tot ca un fisier pentru ca intrarea si iesirea pot fi redirectionate).
      La acest program apar mai multe probleme. De exemplu, cum aflam ce a primit programul in linia de comanda:
      Poate va ganditi ca exista o functie speciala pentruasa cea… s-ar putea, dar eu nu o cunosc. Dar ceea ce cunosc este ca sistemul de operare creaza inainte sa execute un program un Program Segment Prefix lung de 100h bytes (h de la HEXA). N-am sa va spun ce contine acest PSP pentru ca gasesti aceste lucruri in carti de scoala. Ce am sa va spun este ca in byteul 80h se afla lungimea argumentului primit de program (normal, in hexa) si incepand cu byteul 81h (pana la 100h)se afla chiar argumentul. Deci ceea ce trebuie sa faca programul nostru pentru a afla argumentul cu care a fost lansat, este sa citeasca byteul 80h si sa citeasca atatea caractere din memorie, incepand cu 81h.
      O alta problema ar fi, cum se citesc fisierele (tastatura).
      Ultima problema ar fi metoda de encryptare a fisierului. Sa nu va imaginat ca acum o sa aflati algoritmul blowfish sau ecryptarea PGP… Am decis sa folosesc o metoda ‘didactica’, care are si avantajul ca este reversibila folosind acelasi program (respecitv mai rulati programul o data pe fisierul criptat, cu aceeasi cheie si obtineti fisierul original). Aceasta metoda minune este metoda xor (‘SAU EXCLUSIV’) si se invata in clasa a 9-a (?!) capitolul logica matematica. Voi indica un tabel cu actiunea comenzii xor. (De mentionat ca xor acctioneaza la nivel de bit, deci tabelul se refera la biti):

sursa1 | 1 | 1 | 0 | 0 | 
sursa2 | 0 | 1 | 0 | 1 |
--------------------------
rezulta| 1 | 0 | 0 | 1 |

      Instructiunea XOR este definita asa:

XOR  dest,src
exclusive OR (toggle dest bits which are 1s in src)
dest<-(dest ^ src)

      Cam asta ar fi totul. Acum codul sursa (pentru cei care chiar vor sa invete, sa incerce prima data sa faca o schema logica a programului si sa incerce sa o transcrie in assembler si unde nu stiu sa se uite la programul meu):

Mentiune speciala:

      Cam asta ar fi un cod functional. Codul se compileaza (asambleaza) cu comanda ‘tasm cod.asm’ care va genera un fisier obj iar apoi acest fisier se transforma in program com prin comanda ‘tlink cod.obj /t’.
      Pentru a folosi programul pe fisiere, il vom apela asa:

program.com parola outfile
 

      Linia <infile >outfile redirectioneaza intrarea de la fisierul infile iar iesirea pe fisierul outfile. Asfel vom obtine un fisier numit outfile, criptat cu ‘parola’. Pentru a decripta fisierul rulam incodata criptarea cu aceeasi parola, dar inlocuind infile cu numele fisierului criptat.
      Momentan programul este functional, dar nu icercati sa criptati cu el documente ultrasecrete pentru ca poate fi spart in 30 de minute. Oricum, e bun de ascuns pozele alea de ochii parintilor 🙂
      Chiar daca majoritatea codului a fost explicata deja, apar unele elemente noi. Acestea vor fi dezbatute in numarul viitor, unde vom si extinde aria de functionalitate a programului.
 

NOTA IMPORTANTA:
 ARTICOLELE PUBLICATE IN PAGINA DE REFERATE AU SCOP DIDACTIC SI SUNT ELABORATE IN URMA UNEI DOCUMENTARI SUSTINUTE. ESTE STRICT INTERZISA PRELUAREA ARTICOLELOR DE PE SITE SI PREZENTAREA LOR LA ORELE DE CURS. Referatele din aceasta sectiune sunt trimise de diferiti colaboratori ai proiectului nostru. Referatele va sunt prezentate pentru COMPLETAREA STUDIULUI INDIVIDUAL, si va incurajam si sustinem sa faceti si voi altele noi bazate pe cercetari proprii.

Prezentare generala AMD Athlon

AMD Athlon este primul membru a celei de-a 7-a generatii de procesoare destinate sistemelor workstation, server si desktop. Nucleul contine multiple decodoare de intructiuni x86, un Level One (L1) cache de 128 KB, 3 sisteme pipelined pentru calcule integer, 3 sisteme...

Ceasul Bluetooth

Fiecare dispozitiv Bluetooth are un ceas propriu, nativ, care determină momentele de salt al frecvenţei pentru transceiver. Este un ceas pe 28 de biţi care nu este niciodată ajustat ori oprit. El ticăie de 3200 de ori pe secundă, sau odată la fiecare 312,5s; altfel...

Adresa de dispozitiv Bluetooth (BD_ADDR)

Am putea spune că adresa de dispozitiv Bluetooth (BD_ADDR – Bluetooth Device Address) este cea mai statică entitate a unui dispozitiv Bluetooth şi că este inscripţionată electronic în fiecare astfel de unitate. Este o adresă pe 48 de biţi, unică pentru fiecare...

Link Controller-ul şi nivelul Baseband

Probleme ca ce date să se transmită şi când, ce date să se aştepte a fi recepţionate şi când, ce frecvenţă purtătoare şi ce putere de transmisie să se utilizeze, depăşesc competenţa nivelului radio şi sunt responsabilităţile link controller-ului care execută...

Nivelul radio

Sistemul Bluetooth operează în banda industrială, ştiinţifică şi medicală (ISM – Industrial,Scientific and Medical) de 2,4 GHz. Benzile ISM poartă acest nume întru-cât sunt benzi de frecvenţă cu un statut special, în care lucrează wireless echipamentele din domeniile:...

Protocoalele de transport

Un dispozitiv Bluetooth reprezintă acea entitate fizică (cum ar fi un telefon digital, un computer notebook) ce conţine aplicaţii care pot comunica folosind tehnologia wireless cu acelaşi nume, încorporată în acelaşi dispozitiv. Se înţelege prin aceasta că în...

Grupul aplicaţiilor

Unele dintre protocoalele prezentate anterior ca făcând parte din grupul protocoalelor de mijloc, de exemplu protocoalele pentru interoperabilitate create de IrDA: IrOBEX şi IrMC sunt considerate de unii specialişti ca fiind protocoale de nivel aplicaţie. Totuşi nu la...

Grupul protocoalelor de mijloc

Protocoalele din acest grup folosesc serviciile oferite de nivelurile inferioare, de transport, pentru ca la rândul lor să ofere nivelurilor aplicaţie interfeţe standard prin care să comunice cu nivelurile de transport. Fiecare dintre nivelurile din acest grup...

Grupul protocoalelor de transport

Aceste protocoale dezvoltate de către SIG pentru transportul fluxurilor de date şi audio între dispozitivele comunicante vor fi prezentate parcurgând stiva de sus în jos, adică din punctul de vedere al unui dispozitiv care transmite, şi potrivit căruia traficul este...

Specificaţia Bluetooth examinată

Stiva de protocoale BluetoothPartea centrală (core) a specificaţiei Bluetooth, adică volumul 1 al acesteia cuprinde în cea mai mare parte stiva de protocoale. Potrivit acestor protocoale dispozitivele se pot localiza unele pe altele într-o anumită suprafaţă, se pot...

S-ar putea sa iti placa…

Prezentare generala AMD Athlon

AMD Athlon este primul membru a celei de-a 7-a generatii de procesoare destinate sistemelor workstation, server si desktop. Nucleul contine multiple decodoare de intructiuni x86, un Level One (L1) cache de 128 KB, 3 sisteme pipelined pentru calcule integer, 3 sisteme...

Ceasul Bluetooth

Fiecare dispozitiv Bluetooth are un ceas propriu, nativ, care determină momentele de salt al frecvenţei pentru transceiver. Este un ceas pe 28 de biţi care nu este niciodată ajustat ori oprit. El ticăie de 3200 de ori pe secundă, sau odată la fiecare 312,5s; altfel...

Adresa de dispozitiv Bluetooth (BD_ADDR)

Am putea spune că adresa de dispozitiv Bluetooth (BD_ADDR – Bluetooth Device Address) este cea mai statică entitate a unui dispozitiv Bluetooth şi că este inscripţionată electronic în fiecare astfel de unitate. Este o adresă pe 48 de biţi, unică pentru fiecare...