Loading presentation...
Prezi is an interactive zooming presentation

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

MAŠINSKI JEZIK-ASEMBLER-VIŠI PROGRAMSKI JEZICI

No description
by

Katarina Savic

on 5 January 2016

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of MAŠINSKI JEZIK-ASEMBLER-VIŠI PROGRAMSKI JEZICI

Asembler
Obrnuti proces pretvaranja mašinskog u assembler kod se naziva "disasembliranje".
Mašinski jezik
Mašinski jezik ili mašinski kod je kolekcija mašinskih instrukcija predstavljenih u binarnom obliku, tj. u vidu nizova 0 i 1. Mašinski jezik je u određenu ruku primitivan programski jezik. Procesor može da razume i izvršava samo mašinski kod.
Programi pisani u mašinskom jeziku se ne prevode, jer su već u obliku prilagođenom datom hardveru, odnosno arhitekturi sistema.
Programi pisani u drugim jezicima, da bi se izvršili, moraju se dovesti na nivo mašinskog koda, što se postiže raznim prevodiocima.
Da bi softver mogao da radi, odgovarajući mašinski kod mora da se smesti u memoriju.
Pisanje programa direktno u mašinskom jeziku bio bi veoma naporan i dugotrajan proces. Takođe tumačenje mašinskog koda je teško i podložno greškama. Programeri bi morali voditi računa o svakom bitu i datoj instrukciji. Takođe bi bilo i veoma teško snalaziti se u nepreglednim kolonama i redovima nula i jedinica.
Zbog toga danas se retko programira na mašinskom jeziku.
Asemblerski jezik može da sadrži i iskaze koji se ne izvršavaju, već služe kao komande asembleru pri generisanju mašinskog koda.
Asemblerski jezik je hardverski zavisan, tj. svaki tip procesora ima svoj asemblerski jezik.
Umesto sa registrima, memorisjkim lokacijama, stekovima, ovi jezici rade sa varijablama, nizovima, objektima, složenim aritmetičkim i logičkim izrazima, petljama, funkcijama, potprogramima i dr.
Primeri: Basic, COBOL, FORTRAN, C, C++, Java, Visual Basic, Pearl, PHP, Python, ...

Da bi se kod pisan na višem programskom jeziku preveo u izvršni, mašinski, tj. objektni kod koriste se prevodioci (compilers).
Imaju viši nivo apstrakcije u odnosu na asemblerski jezik.
Viši programski jezici
Linkeri (linkers) služe da od više modula sa objektnim kodom proizvedu modul za unos u memoriju (load module).
Asembler je program svih programa, alat svih alata, on je ozbiljno oružje u rukama pravog programera.
-- ADD op1, op2 -- sabiranje (op1 = op1 + op2)
add eax, 4 ; eax=eax+4

-- SUB op1, op2 -- oduzimanje (op1 = op1 - op2)
sub bx, 10 ; ebx=ebx-10

-- AND op1, op2 -- bitovska logička konjukcija (op1 = op1 & op2)
-- OR op1, op2 -- bitovska logička disjunkcija (op1 = op1 | op2)
-- XOR op1, op2 -- bitovska logička ekskluzivna disjunkcija (op1 = op1 ^ op2)
-- NOT op -- bitovska negacija (op = ~op)
-- MUL op -- množenje neoznačenih celih brojeva (edx:eax = eax * op)
-- IMUL op -- množenje označenih celih brojeva (edx:eax = eax * op)
-- DIV op -- deljenje neoznačenih celih brojeva
(eax = edx:eax / op, edx = edx:eax % op)
-- IDIV op -- deljenje označenih celih brojeva
(eax = edx:eax / op, edx = edx:eax % op)
-- NEG op -- promena znaka (op = -op)

-- INC op -- uvećanje (op = op + 1)
-- DEC op -- umanjenje (op = op - 1)

-- SHL op1, op2 -- shift-ovanje ulevo (op1 = op1 << op2). op2 je konstanta.
-- SHR op1, op2 -- shift-ovanje udesno (logičko) (op1 = op1 >> op2).
op2 je konstanta.
-- SAR op1, op2 -- shift-ovanje udesno (aritmetičko) (op1 = op1 >> op2).
op2 je konstanta.

Oznaka edx:eax znači 64-bitni ceo broj čiji su viši bitovi u edx a niži u eax.

Aritmeticko logicke instrukcije:


-- CMP -- upoređivanje (oduzimanje bez upisivanja rezultata)
-- TEST -- testiranje bitova (bitovska konjukcija bez upisivanja rezultata)
Instrukcije poređenja:


-- JMP op -- bezuslovni skok na adresu op (memorijski operand)
-- CALL op -- bezuslovni skok uz pamćenje povratne adrese na steku.
-- RET -- skida sa steka adresu i skače na tu adresu.
-- JZ op -- skače ako je rezultat prethodne instrukcije nula.
-- JE op -- skače ako je rezultat prethodnog poređenja jednakost
(ekvivalentno sa JZ)
-- JNZ op -- skače ako je rezultat prethodne operacije različit od nule
-- JNE op -- skače ako je rezultat prethodnog poređenja različitost
(ekvivalentno sa JNZ)
-- JA op -- skače ako je rezultat prethodnog poređenja veće
(neoznačeni brojevi)
-- JB op -- skače ako je rezultat prethodnog poređenja manje
(neoznačeni brojevi)
-- JAE op -- skače ako je rezultat prethodnog poređenja veće ili jednako
(neoznačeni brojevi)
-- JBE op -- skače ako je rezultat prethodnog poređenja manje ili jednako
(neoznačeni brojevi)
-- JG op -- skače ako je rezultat prethodnog poređenja veće
(označeni brojevi)
-- JL op -- skače ako je rezultat prethodnog poređenja manje
(označeni brojevi)
-- JGE op -- skače ako je rezultat prethodnog poređenja veće ili jednako
(označeni brojevi)
-- JLE op -- skače ako je rezultat prethodnog poređenja manje ili jednako
(označeni brojevi)

Slično, postoje i negacije gornjih instrukcija uslovnog skoka: JNA, JNB, JNAE,
JNBE, JNG, JNL, JNGE, JNLE.

Instrukcije kontrole toka:

.intel_syntax noprefix
.text
.global fact

fact:
# Prolog funkcije
enter 0,0

cmp dword ptr [ebp + 8], 0
je exit_recursion

## Pozivamo rekurzivni poziv fact(n - 1).
mov eax, [ebp + 8]
dec eax
push eax
call fact
add esp, 4

## Množimo povratnu vrednost rekurzivnog poziva (eax) sa n. Time se dobija n!.
mul dword ptr [ebp + 8]
jmp done

exit_recursion:
## Izlaz iz rekurzije.
mov eax, 1

done:
## Epilog funkcije.
leave
ret

program koji sabira dva broja

.intel_syntax noprefix
.text
.global saberi

saberi:

## Prolog funkcije
push ebp
mov ebp, esp

mov eax, [ebp + 8]
add eax, [ebp + 12]

## Epilog funkcije
pop ebp
ret

#include <stdio.h>

int main()
{
int x, y;

scanf("%d %d", &x, &y);
printf("%d\n", x+y);

return 0;
}

u C-u bi taj program izgledao ovako
## NAPOMENA: Direktiva .global označava da se labela saberi može koristiti od strane linker-a prilikom povezivanja sa ostalim objektnim fajlovima, tj. da funkcije iz drugih fajlova mogu vršiti skokove na tu labelu. Ovo je korisno kod pozivanja funkcija, pa se zato obično labela koja označava početak funkcije označava kao globalna.

## NAPOMENA: instrukcija mov premešta drugi operand u prvi.
## NAPOMENA: instrukcija add sabira svoja dva operanda i zbir smešta u prvi.

Parametri funkcije:
##
## -- int x -- [ebp + 8]
## -- int y -- [ebp + 12]

.intel_syntax noprefix

.text

.global max

max:

enter 0,0

mov eax, [ebp + 8]
mov ecx, [ebp + 12]
cmp eax, ecx

jge a_greater

mov eax, ecx

a_greater:

leave
ret
program za računanje max 2 broja
u C-u bi to izgledalo ovako:


#include<stdio.h>
int main()
{
int a,b,c;
int max;
printf("Unesite 2 cela broja\n");
scanf("%d%d",&a,&b);
max=(a>b)?a:b;
printf("max=%d\n",max);
}



.intel_syntax noprefix
.text
.global nzd

nzd:
enter 0,0

mov eax, [ebp + 8]
mov ecx, [ebp + 12]

loop:

cmp ecx, 0
je end_loop

xor edx, edx
div ecx ## dobijemo neko edx novo

mov eax, ecx ## u a je b
mov ecx, edx ## u b je ostatak

jmp loop
end_loop:

leave
ret


NZD
u C-u
#include<stdio.h>
int main()
{
int a,b,pom;
printf("Unesite 2 broja\n");
scanf("%d%d",&a,&b);
// a>b nzd(a,b=nzd(b,a%b),nzd(r,0)=r)

if (a<b)
{
pom=a;
a=b ;
b=pom;
}
while (b!=0)
{
pom=a%b;
a=b;
b=pom;
}
printf("nzd je : %d\n",a);
scanf("%d",&a);
return 0;
}

faktorijel rekurzivno
#include <stdio.h>

int faktorijel(int n)
{
if (n==0)
return 1;
return n*faktorijel(n-1);
}

int main()
{
int x;

scanf("%d", &x);
printf("%d", faktorijel(x));

return 0;
}
Prednosti asemblerskog jezika
Olakšava programiranje na višim programskim jezicima, jer programeri znaju šta se dešava u računaru. Programeri će koristeći ovaj jezik bolje naučiti i razumeti kako kompjuter radi.
Pokazuje kako se podaci čuvaju u memoriji.
Programi napisani u ASM-u se odlikuju mogućnosću slanja direktnih komandi procesoru kao i iskorisćavanju celog dijapazona računarske arhitekture.
Pokazuje interakciju programa sa OS, procesorom, I/O jedinicama,...
Ono što je prednost ASM-a nad većinom jezika je taj što vas u ASM programiranju sprečava jedino vaš hardware jer ASM kao jezik nije ograničen sve dok ga računar može podržavati.
Pošto ti programi rade praktično na nivou mašinskog koda, i sa sobom nemaju pomoćne konstrukcije, generalizacije koda i za mašinu slične "nebitne" stvari, oni su mnogo manji i brži od programa napisanih u nekom "konvencionalnom" programskom jeziku.
Primena asemblerskog jezika
Iako programiranje u višim programskim jezicima ima svoje prednosti, u nekim slučajevima je neohodno korišćenje asemblerskog jezika.
Programiranje u asemblerskom jeziku može rezultovati mašinskim kodom koji je mnogo kraći i brži od koda nastalog primenom viših programskih jezika.
Primeri primene: sistemski programi (kompajleri, drajveri), embedded sistemi**, prenosive aplikacije, aplikacije sa vrlo ograničenim resursima,...
**Embedded sistemi su računarsko bazirani sistemi ugrađeni u okviru drugog sistema, za koga obezbeđuju bolju funkcionalnost i performanse.
Prednosti viših programskih jezika
Imaju veću ekspresivnost i konciznost.

Zahtevaju manje vremena za razvoj softvera.
Omogućavaju lakše debagovanje i verifikaciju koda.
Omogućavaju lakše održavanje koda.
Veća je mogućnost prenosivosti koda.

Pružaju veću pouzdanost i sigurnost.



-- PUSH op -- postavljanje na stek (sub esp, 4 ; mov [esp], op)
-- POP op -- skidanje sa steka (mov op, [esp] ; add esp, 4)
-- PUSHA -- postavlja sve registre opšte namene na stek
-- POPA -- skida sa steka 8 vrednosti i smešta ih u registre opšte namene


Instrukcije za rad sa stekom:

## NAPOMENA: Adresa vrha steka se tokom izvršavanja programa čuva u registru esp. Vrednost ovog registra (a samim tim i adresa vrha steka) se može menjati uobičajenim instrukcijama opšte namene, kao i za sve ostale registre. Takođe, ovaj registar se menja i implicitno, od strane instrukcija za rad sa stekom (push, pusha, pop, popa) kao i instrukcija za rad sa potprogramima (enter, leave, call i ret). Stek na Intel-ovoj arhitekturi "raste" prema NIŽIM adresama, tako da se prilikom dodavanja podataka na stek esp registar umanjuje, dok se prilikom skidanja sa steka esp registar uvećava.
## NAPOMENA: Instrukcija push ebp smešta vrednost registra ebp na vrh steka (automatski ažurirajući vrednost pokazivača vrha steka, tj. registar esp)


## NAPOMENA: Instrukcija pop ebp skida sa vrha steka jednu četvorobajtnu vrednost (ažurirajući automatski adresu vrha steka u esp registru) i smešta je u registar ebp.

Zbog efikasnosti, na stek uvek treba postavljati 32-bitne vrednosti.
-- ENTER N, 0 je ekvivalentno sa:

push ebp
mov ebp, esp
sub esp, N

-- LEAVE je ekvivalentno sa:

mov esp, ebp
pop ebp
Instrukcije koje se koriste u
prologu i epilogu funkcije:
-- registri ESI, EDI i EBX pripadaju pozivajućoj funkciji. Pozvana funkcija mora sačuvati na steku njihove vrednosti, ako ih koristi. Pozivajuća funkcija može računati na vrednosti ovih registara, nezavisno od poziva drugih funkcija.



-- registri EAX, ECX i EDX pripadaju pozvanoj funkciji. Pozvana funkcija ne mora čuvati njihove vrednosti. Pozivajuća funkcija ne sme računati da se njihove vrednosti neće promeniti prilikom poziva drugih funkcija.

-- argumenti se prenose preko steka, tako što pozivajuća funkcija na stek postavlja argumente u obrnutom poretku (sa desna na levo). Pozivajuća funkcija je takođe odgovorna za njihovo uklanjanje sa steka nakon povratka iz pozvane funkcije.
-- Povratna vrednost se ostavlja u registru EAX.
Asemblerski program
Asemblerski program se sastoji od sekvence asemblerskih iskaza.
Svaki iskaz se piše u posebnoj liniji.
Svaka linija može da sadrži četiri polja.
Svaka linija može počinjati labelom -- identifikatorom za kojim sledi dvotačka. Labela se mora nalaziti na početku linije (uz eventualne vodeće beline). Svakoj labeli se u fazi prevođenja dodeljuje adresa instrukcije ili podatka koji sledi neposredno nakon labele u kodu. Labele se kasnije mogu koristiti kao memorijski operandi. Npr može se koristiti u drugim linijama koda za skok na liniju sa lebelom (npr. add ecx, L, ili jmp L, gde je L neka labela).

kod operacije -- skraćenica za operaciju
operand -sadrži podatak ili dodatnu informaciju za kod operacije

U skadu sa Intel-ovom sintaksom, odredišni operand instrukcije se uvek navodi kao PRVI operand. Tako, instrukcija mov ebp, esp kopira sadržaj registra esp u ebp, dok instrukcija add eax, ebx sabira registre eax i ebx i zbir smešta u eax.
Komentari u asembleru služe za pisanje objašnjenja. Počinju znakom ##. Sve počev ## od tog znaka pa do kraja linije se ignoriše.
Najosnovnija asemblerska instrukcija je instrukcija MOV. Ona pomera podatak sa jedne lokacije na drugu (poput operatora dodele u višem jeziku; :=, =). Uzima dva operanda:

primer:
mov dest, src - Podatak src kopira u dest.
mov eax, 3 ; smeštanje broja 3 u EAX registar, 3 je neposredan operand
mov ebx, eax ; smeštanje vrednosti EAX u registar EBX

Restrikcije je veličina operanada, tj. uslov da operandi moraju biti iste dužine. Ne može se vrednost iz EAX registra (16 bita) smestiti u EBX registar (8 bita).

Instrukcija transfera:
Druga instrukcija je LEA op1, op2 -- učitavanje adrese, pri čemu je drugi operand uvek memorijski operand.
Mašinski jezik se često mesa sa asemblerskim jezikom. Asembler je programski jezik niskog nivoa, međutim, mnogo je napredniji u odnosu na mašinski jezik. Da bi se olakšalo pisanje programa, uveden je asemblerski jezik koji predstavlja simboličku reprezentaciju mašinskog jezika.
Asemblerski jezik ili jednostavno asembler  je računarski jezik za pisanje softvera, koji se pozivom kompajlera ili interpretatora konvertuje u mašinski jezik sačinjen samo od jedinica i nula koje računar može da razume. Iako se asemblerski jezik sastoji od prepoznatljivih mnemoničkih oznaka i smislenih reči koje čovek bolje razume i njima može lakše da upravlja, programiranje na njemu nije jednostavno.
Programi napisani na asemblerskom jeziku se brže izvršavaju od programa pisanih na višim programskim jezicima, kao što su Basic, COBOL ili FORTRAN, koji se lakše uče i na kojima je mnogo lakše programirati. Biranje programskog jezika često predstavlja kompromis između lakoće i brzine.
Intel-ova 32-bitna arhitektura ima 8 32-bitnih registara: EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP. Ovi registri su generalno opšte namene, mada u praksi neki imaju specijalne uloge. Tako na primer, ESP se uvek koristi kao pokazivač vrha sistemskog steka, EBP je pokazivač tekućeg okvira steka. Ostali registri u nekim situacijama mogu imati specijalne uloge (npr. pri množenju i deljenju se uvek implicitno koriste registri EAX i EDX, dok se pri radu sa stringovima za pokazivače uvek koriste registri ESI i EDI).
Asemblerski kod se sastoji asemblerskih DIREKTIVA i INSTRUKCIJA. Direktive se razlikuju od instrukcija po tome što počinju tačkom. Direktive obično ne proizvode kod već najčešće opisuju način na koji se obavlja prevođenje.



Neke često korišćene direktive:


.intel_syntax noprefix -- označava da se koristi Intel-ova sintaksa.
.text -- označava početak zone sa tekstom.
.data -- označava početak zone sa statičkim podacima.
.int n -- emituje u objektni fajl ceo broj n
.asciz str -- emituje u objektni fajl bajtove karaktera iz kojih se sastoji string str, kao i terminirajuću nulu.
.global label -- označava labelu kao globalnu, čime se omogućava linker-u da poveže

-- Ostale linije koje nisu direktive se smatraju instrukcijama. Instrukcija se sastoje iz mnemonika i zarezima razdvojenih operanada.

-- Prazne linije se ignorišu.

Neke od glavnih mana takvih programa su loša čitljivost, (posebno izraženo pri velikim projektima)

Složenost koda i praktično nemogućnost konvertovanja istog koda na drugu procesorsku arhitekturu.

Zbog tih mana se asembler danas koristi samo u sistemima realnog vremena i ostalim specifičnim sistemima.
Ali Asember ima i MANE :
povratna vrednost se ostavlja u registru EAX
MAŠINSKI JEZIK-
ASEMBLER
-VIŠI PROGRAMSKI JEZICI


student:
Katarina Savić 53/2012
profesor:
Miroslav Marić
Hvala na pažnji!
1/24
2/24
3/24
4/24
5/24
6/24
7/24
8/24
9/24
10/24
11/24
12/24
13/24
14/24
15/24
16/24
17/24
18/24
19/24
20/24
21/24
22/24
23/24
24/24
Full transcript