Class: Assembly 101 by Tr nightowl Inregistrat de: LtKer. vap0r Editat de: Ker. adtrace, LtKer. vap0r Data: 2002.11.24 Copyright: Acest Class/Log este proprietatea Cyberarmy (www.cyberarmy.net) ************************************************************** Acest log a fost editat de catre Universitate Cyberarmy. Liniile de text cu oamenii care intra si ies de pe canal,schimbarile de nick au fost sterse. Cateva linii care nu apartineau de lectie au fost sterse ************************************************************** nightowl: Ar trebui sa avem un IDE, sau doar folosim notepad-ul sau un alt editor text. doar editorul text e bine si bine-nteles assembler-ul Ei bine, va urez Bun venit la "Introducere in Assembly" Atat timp cat acesta este considerat ca fiind un subiect de nivel incepator Vreau sa clarific ca daca nu ati mai facut un limbaj de programare inainte vi se va parea greu de mers in assembly. Prin aceasta nu vreau sa spun ca va va fi imposibil sa invatati assembly, doar ca duceti lipsa de cateva cunostinte fundamentale care sunt acumulate in acest curs. Daca va aflati in aceasta situatie luati o carte buna despre ori C ori C++. Eu pot recomanda "The Complete Idiots Guide to C++" ca fiind o carte directa. In timp ce materialul predat de mine e original, daca doriti sa faceti o lectura serioasa pt voi pe acest subiect va recomand cartea: Assembly Language Step-by-Step: Programming in DOS and Linux De Jeff Duntemann o puteti gasi la orice librarie buna dar voi face public numarul ISBN mai tarziu Unele din lucrurile cu care ne vom ocupa astazi sunt ce este exact limbajul assembly de unde a aparut (o scurta istorie) cateva dintre avantajele si dezavantajele assembly-ului in alte cuvinte de ce l-ai folosi in final vom asambla primul nostru program deci fara prea multa zarva sa aruncam o privire la ce este limbajul assembly Assembly este un limbaj de programare de nivel jos este cam cel mai de jos limbaj de programare, mai putin daca doresti sa programezi in limbajul masinii ceea ce este posibil, dar nu este recomandat Setul de instructiuni la care ne vom uita este pentru x86 asta inseamna ca orice masina windows poate sa il manevreze 386, 486, Pentium etc sa trecem mai departe Limbajul Assembly a evoluat de la primii cercetatori in domeniul computerelor care trebuiau sa codeze in limbajul masinilor avand la baza 0 si 1 aceasta nu era foarte usor de inteles si necesita mult timp limbajul assembly este defapt un set de formule care corespund direct unor numere care computerul le intelege deci mov ax, 023h este mult mai usor de inteles decat 0101010111011011 bine-nteles assembly-ul a evoluat de atunci fiecare procesor nou aduce cu el mai multa putere si prin urmare mai multe instructiuni posibile ... Avantajele Assembly-ului As putea intra in detalii despre avantajele assembly-ului dar nu voi face asta pentru ca poate fi rezumat in 3 cuvinte Control Viteza si Marime fiecare dintre acestea este unde assembly-ul are avantajul in fata altor limbaje de programare bineinteles sunt dezavantaje care sa compenseze cu avantajele exista 2 laturi la fiecare ban... la assembly se rezuma la 2 lucruri 1. Ai un cod mai putin portabil si binari-uri in timp ce in C++ poti pune sursele pe cam orice sistem de operare si le va compila nu va ganditi ca puteti folosi codul care a fost proiectat sa ruleze sub x86 (DOS/Windows) si sub Mac nu se va intampla va trebui sa rescrieti tot programul a doua este Complexitatea in C++ ca sa faci o declaratie if este un lucru simplu if(asta si asta) { fa asta si asta } dar nu exista nimic asemanator in assembly va trebui sa invatati sa faceti fiecare pas la cel mai elementar nivel ex 1. verificarea conditiilor 2. daca este adevarat fa cod altfel sari peste cod sper ca nu am speriat prea multi oameni dezavantajele sunt cu mult depasite de beneficii este un anumit sens de putere care este castigat bootand computerul prin rularea unui program in windows dos-prompt am sa va calauzesc prin crearea rimului vostru program dar inainte de asta am sa raspund la intrebari va rog sa le adresati in #questions si imi vor fi transmise mie deci daca aveti intrebari despre prima parte acum este momentul (->xwyzard) codul care il folosim azi se va compila in linux? nu este destinat pentru dos ne vom ocupa de linux mai tarziu in acest curs datorita faptului ca este mai complex (->shab|class) limbajul ASM arata diferit sub procesoare diferite si daca asa ce il schimba da arata in partea cea mai mare poate fi impartit in tipuri majore dar sunt diferente minore chiar si intre 2 pentiumuri codul de care ne vom ocupa noi este generic deci nu trebuie sa va faceti griji atata timp cat aveti un pc cu windows si mai tarziu cu Linux JagWire:#questions- ar fi posibil sa auzim care sunt avantajele? le-am spus dar mai multe detalii sunt bune control: in assembly aveti un control fara precedent asupra partii hardware nici un alt limbaj nu permite o schimbare atat de usoara intre scrierea directa in memoria video si jocul cu ceasul hardweare sau cel putin nu la fel de usor ca in assembly (->C-Hunter[Away]) este codul masinii acelasi pentru toate computerele (SGIs, Alpha, Macs, Intel, AMD etc)? nu codul masinii difera si el de aceea instructiunile in assembly difera deoarece corespund direct cu instructiunile codului masinii ultima intrebare (->Archer) aproximativ peste cat timp vei preda despre assembly in linux? ca sa ma intorc atunci :) In jumatatea a doua a cursului dar elementele de baza vor fi preadate aici deci daca nu stai la prima jumatate a cursului nu vei intelege partea a doua multe lucruri care le vom invata in prima jumatate vor functiona si in linux doar nu primul program din cauza faptului ca utilizeaza o comanda dos care nu exista sub linux .... mergem mai departe voi scrie programul linie cu linie daca exista o problema in codul scris aici o versiune care functioneaza va fi disponibila dupa curs impreuna cu log-urile cursului il voi scrie intreg iar apoi vom trata componentele ; numele sursei: hello.asm ; numele executabilului: hello.com ; ; versiunea: 0.1 ; creat: 15/10/02 ; ultima modificare: 24/11/02 ; scris de: Nightowl ; descriere: un simplu program dos care afisaza un sir text pe ecran [bits 16] ; generare de cod de 16 biti [org 0100h] ; punctul de start al codului in memorie [section .text] ; sectiune ce contine codul ce urmeaza a fi executat start: mov dx, hellomsg ; incarca mesajul in registriul dx mov ah, 09h int 21h mov ax, 4ch int 21h [section .data] hellomsg db "Welcome to Assembly", 13,10, "$" si asta a fost am lasat pe dinafara o parte din comentarii care luau prea mult timp sa le scriu dar vor fi in programul care il puteti downloada si voi explica mai intai cum puteti compila asta iar dupa aceea fiecare parte din program ... Primul lucru pe care il veti observa este ca acest program e destul de simplu fara a pune la socoteala toate comentariile care leam facut la inceput sunt doar cam cinci linii de cod executabil acest program daca va intrebati poate fi compilat folosind comanda nasm -f bin -o .com al meu ar fi nasm -f bin hello.asm -o hello.com asta va va lasa cu un program care il puteti rula in dos prompt si cu conditia ca nu l-am stricat pe undeva va produce un program care tipareste linia de text pe ecran "start:" este o simpla eticheta in programe mai complexe vor fi folosite pentru a sari parti din program "mov dx, hellomsg" incarca mesajul aflat la sfarsitul programului in registriul dx al CPU-ului daca nu stiti ce este un registri atunci nu va faceti probleme pentru ca acesta este subiectul uneia dintre urmatoarele doua lectii ne vom ocupa de registrii in detaliu asa ca nu va voi bate acum la cap 09h-ule aflat in instructiunea urmatoare este identificatorul functiei de dos care tipareste pe ecran 21h-ule este ultimul lucru de care ne vom ocupa int este prescurtarea de la interrupt (a intrerupe) permite dos-ului sa preia controlul asupra programului pentru a tipari tesxtul pe ecran dupa ce aceasta s-a realizat va reda controlul programului urmatoarele doua linii sunt sfarsitul si spun dos-ului ca poate avea control asupra coputerului din nou in final [section .data] hellomsg db "Welcome to Assembly", 13,10, "$" hellomsg este numele variabilei spre deosebire de C++ nu este un tip doar marimea db inseamna define byte exista si alte tipuri de care ne vom ocupa mai tarziu dar deja depasesc timpul asa ca am sa inchei stiu ca sunt oameni care trebuie sa mearga la culcare ... si vreau sa imi cer scuze pentru orice inconsecventa. Aceasta este prima mea lectie asa ca am sa ma ascund in spatele inexperientei :P