Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

Podobné dokumenty
Strojový kód, assembler, emulátor počítača

Úroveň strojového kódu 32-bitový procesor Intel Pentium

Úroveň strojového kódu procesor Intel Pentium Úvod

Úroveň strojového kódu procesor Intel Pentium Zásobník a konvencie volania

Úroveň strojového kódu procesor Intel Pentium Zásobník a konvencie volania

Operačný systém Úvodná prednáška

Jednoduchá správa pamäte

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

ISU Cvičení 3. Marta Čudová

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

Segmentovanie a stránkovanie v procesoroch Intel Pentium

Metóda vetiev a hraníc (Branch and Bound Method)

IT právo2015. Nový Autorský zákon a zmluvnévzťahy Clouda právo Zodpovednosťza internetový obsah , Technopol, Bratislava

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Programovanie.NET, C++ - najbližšie termíny:

Programovanie v jazyku C - to chce dynamiku

Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/YOS: Přednáška I / 21

Blokové a prúdové šifry

Diplomový projekt. Detská univerzita Žilinská univerzita v Žiline Matilda Drozdová

Objektovo orientované programovanie v C# ERIK KUČERA METÓDY VÝPOČTOVEJ INTELIGENCIE PREDNÁŠKA 3

Pravdepodobnosť. Rozdelenia pravdepodobnosti

Kvadratické funkcie, rovnice, 1

Základy algoritmizácie a programovania

Konfigurácia IP Bell 02C Dverný vrátnik a FIBARO Home Center 2

Programovanie v jazyku C - pole treba poorat...

Adresní mody procesoru

x86 assembler and inline assembler in GCC

Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

8. Relácia usporiadania

Katolícka univerzita v Ružomberku Pedagogická fakulta. programovací jazyk ASSEMBLER. 1. ročník IN-FY

Užívateľský manuál Technický server SKGA ročná kontrola HCP

Assembler - 1.část. poslední změna této stránky: Zpět

ISU Cvičení 7. Marta Čudová

M úlohy (vyriešené) pre rok 2017

15. Príkazy vetvenia

Obsah. Reprezentácia údajov v počítači. Digitalizácia číselnej informácie. Digitalizácia znakov a textovej informácie.

To bolo ľahké. Dokážete nakresliť kúsok od prvého stromčeka rovnaký? Asi áno, veď môžete použiť tie isté príkazy.

AR, MA a ARMA procesy

Programovanie I. Úvod do programovania Mgr. Stanislav Horal, Katedra informatiky, FPV, UCM

Import cenových akcií FRESH

OBOZNÁMTE SA S VAŠÍM TELEFÓNOM

MATLAB (1) - úvod do programovania vedeckých problémov. LS 2017, 8.predn.

Informácie o telefonovaní do zahraničia

POSTUP GENEROVANIA ŽIADOSTI O KVALIFIKOVANÝ CERTIFIKÁT POMOCOU PROGRAMU COMFORTCHIP.

Spracovanie informácií

Úvod. Instrukce musí obsahovat: typ operace adresu operandu (operandů) typ operandů modifikátory adresy modifikátory operace POT POT

Struktura a architektura počítačů (BI-SAP) 7

MOCNINY A ODMOCNINY Eva Zummerová

Registry 32 bitové pro všeobecné použití: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP.

OBOZNÁMTE SA S VAŠÍM TELEFÓNOM

Task, async, await METÓ DY VÝPOČTOVEJ INTELIGENCIE A C# FA K ULTA E L E K T ROTECHNIKY A INFORMATIKY S LOVENSKÁ T E CHNICKÁ U NIVERZITA

Kombinatorická pravdepodobnosť (opakovanie)

Limita funkcie. Čo rozumieme pod blížiť sa? y x. 2 lim 3

Multiplexor a demultiplexor

Polia a matice v jazyku C. Michal Kvasnica

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Programovanie v jazyku C - struktury a polia

Modul Kontrolné programy

Externé zariadenia Používateľská príručka

Informačný list 1. Čo je energia? Všetci potrebujeme energiu! Energia doma

Lineárne nerovnice, lineárna optimalizácia

Beáta Stehlíková Časové rady, FMFI UK, 2013/2014. CvičenievR-kuI.:ARIMAmodely p.1/15

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Matice. Matica typu m x n je tabuľka s m riadkami a n stĺpcami amn. a ij. prvok matice, i j udáva pozíciu prvku

Import Excel Univerzál

ČÍSELNÉ RADY. a n (1) n=1

INTERNET BANKING. Platby cez Internet banking VŠETKO, ČO JE MOŽNÉ. with.vub.sk, Bank of

Príklad ponuky: Riešenie: vrch. hodnota 3 hodnota 2 hodnota 1

Imagine. Popis prostredia:

Postup pri aktivácii elektronickej schránky na doručovanie pre právnické osoby, ktoré nie sú zapísané do obchodného registra

Ak stlačíme OK, prebehne výpočet a v bunke B1 je výsledok.

TEÓRIA FARIEB, FAREBNÉ MODELY

Pracovné prostredie MS EXCEL 2003.

3 Determinanty. 3.1 Determinaty druhého stupňa a sústavy lineárnych rovníc

Prevody z pointfree tvaru na pointwise tvar

značky spájame spojnicami, šípka musí byť ak ...

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

Studentove t-testy. Metódy riešenia matematických úloh

Zvyškové triedy podľa modulu

TELCO PH 578. telefónny prístroj. Návod na obsluhu Návod na obsluhu Návod na obsluhu VLASTNOSTI:

Procesor z pohledu programátora

Matematika Postupnosti

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Začínam so zadaním z NEPOUŽÍVAME ROZSAH POKIAĽ HO MUSÍME PRESKOČIŤ

Opakování programování

7.CVIČENIE. Základy HTML

RIEŠENIE NIEKTORÝCH ÚLOH LINEÁRNEJ ALGEBRY V PROSTREDÍ MS EXCEL. 1. Zadáme prvky matice A a B do buniek pracovného hárku zošita MS Excel

MANUÁL K PROGRAMU MATEMATIKA 2.0 STIAHNUTIE A INŠTALÁCIA PROGRAMU:

Finančný manažment, finančná matematika a účtovníctvo

2. Nahratie mapy pre Locus Map - formát sqlite alebo mbtiles do zariadenia (telefón, tablet) s OS Android.

Automatický timer pre DX7 návod na inštaláciu a manuál

TomTom Referenčná príručka

Programovanie v jazyku C - funkcie a makra

Plánovanie procesov a vlákien

Kombinatorická pravdepodobnosť (opakovanie)

ALGORITMY A PROGRAMOVANIE VO VÝVOJOVOM PROSTREDÍ LAZARUS. Vývojové prostredie Lazarus, prvý program

Automatické pohony na brány

Operačná analýza 2-12

Vytvorenie používateľov a nastavenie prístupov

Architektury CISC a RISC, uplatnění v personálních počítačích

Transkript:

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Praktické programovanie assemblerových funkcií Autor: Peter Tomcsányi, Niektoré práva vyhradené v zmysle licencie Creative Commons http://creativecommons.org/licenses/by-nc-sa/3.0/

Adresovanie pamäte Keď je operand inštrukcie v operačnej pamäti, hovoríme mu pamäťový operand Aby vedel procesor nájsť pamäťový operand, musí poznať jeho adresu Pamäťové operandy zodpovedajú premenným vo vyšších programovacích jazykoch Preto tvorcovia strojového kódu navrhujú také spôsoby adresovania, aby sa pomocou nich dali adresovať všetky druhy premenných, ktoré poznáme z vyšších programovacích jazykov.

Priama adresa Jednoduchá globálna premenná Globálne premenné sú premenné deklarované mimo funkcií. Kompilátor im pridelí pevné miesto v pamäti, teda pevnú adresu. V našom príklade predpokladajme, že premenná i je na adrese 1530 a premenná j je hneď za ňou na adrese 1534 (skutočné čísla môžu byť, pravdaže, iné a závisia od toho, aké ďalšie premenné a procedúry sme pred nimi deklarovali ako aj od algoritmu prideľovania adries pre premenné v kompilátore). long i,j; int main() { i = j+5; MOV EAX,[1534] ADD EAX,5 MOV [1530],EAX j je na adrese 1534 i je na adrese 1530 j i 1534 1533 1532 1531 1530 Priama adresa je číslo v hranatých zátvorkách

Nepriama adresa použitie smerníka v C Smerník (pointer) je premenná, ktorá neobsahuje hodnotu, ale adresu nejakej inej premennej. Keď používame smerník na prístup k hodnote premennej, tak vlastne nevieme, na akej adrese je uložená naša premenná, ale vieme, na akej adrese je uložená jej adresa. To sa nazýva nepriame adresovanie. void p(long *x, long n) { *x = n; MOV EAX, x MOV EDX, n MOV [EAX],EDX Takéto adresovanie parametrov x a n je tiež prístup do pamäti, vysvetlíme ho ale až neskôr. Ulož hodnotu EDX do pamäťového miesta, ktorého adresa je v EAX Nepriama adresa je meno registra v hranatých zátvorkách Priama a nepriama adresa teoreticky stačia na adresovanie ľubovoľných dátových štruktúr a polí. Pre zjednodušenie programovania a prekladu z vyšších jazykov však majú procesory Intel aj zložitejšie spôsoby adresovania.

Piaty príklad pole ako parameter metóda posúvania smerníka najprv v C Naprogramujte funkciu: int max_prvok_c(int a[], unsigned int n) Jej výsledkom je hodnota najväčšieho prvku v poli a, ktoré má dĺžku n. int max_prvok_c(int a[], int n) { int i,m; int *p; p = a; m = *p; for (i = n - 1; i > 0; i--) { p++; if (*p > m) m = *p; return m; Podobne ste sa učili pracovať s poľom v minulom semestri v tejto prednáške: http://dai.fmph.uniba.sk/courses/pphw/ex/3.php

Piaty príklad pole ako parameter metóda posúvania adresy v assembleri Naprogramujte funkciu: long max_prvok(long a[], unsigned long n) Jej výsledkom je hodnota najväčšieho prvku v poli a, ktoré má dĺžku n. asm { mov ebx, a // p = a; mov eax, [ebx] // m = *p; mov ecx, n dec ecx // for (i = n - 1; i > 0; i--) { jecxz a3 // riesime situaciu ked je n == 1 a1: add ebx, 4 // p++; cmp [ebx], eax // if (*p > m) jle a2 mov eax, [ebx] // m = *p; a2: loop a1 // a3: // return m

long i; short a[5]; int main() { a[i] = i+1; Indexovaná adresa Prvok globálneho poľa Globálnemu poľu pridelí kompilátor pevné miesto v pamäti, teda pevnú adresu jeho prvého prvku. Ak máme deklaráciu poľa: typ a[max]; a začína v pamäti na adrese adr(a), tak adresa i-teho prvku a sa vypočíta: adr(a[i]) = adr(a)+i*sizeof(typ) V EDX máme spočítanú adresu a[i], preto môžeme použiť nepriamu adresu MOV AX,[1530] INC AX MOV EDX,[1530] ADD EDX,EDX ADD EDX,1534 MOV [EDX],AX a[4] a a[3] a[2] a[1] a[0] i MOV AX,[1530] INC AX MOV EDX,[1530] MOV [EDX*2+1534],AX 1534 1533 1532 1531 1530 2 je sizeof(short) Indexovaná adresa má tvar [reg*c+k] kde reg je 32-bitový register, c je 1, 2, 4 alebo 8 a k je konštanta (môže byť aj záporná).

Bázovaná a indexovaná adresa Prvky polí prijatých ako parameter Ak je parameter pole, tak funkcia dostane vždy smerník na pole (to vieme už z minulého semestra), teda vlastne dostane adresu prvého prvku. Pri adresovaní prvkov potom môže použiť najzložitejší spôsob adresovania - bázovanú a indexovanú adresu void f(long a[], long n) { long i; a[i] = i + 1; MOV ECX,i INC ECX MOV EDX,i MOV EAX,a MOV [EAX+EDX*4],ECX Do ECX sme spočítali hodnotu i+1 Bázovaná a indexovaná adresa má tvar [r1+r2*c+k] r1 a r2 sú 32-bitové registre, c je 1, 2, 4 alebo 8 a k je konštanta (môže byť aj záporná). Jednotlivé členy môžu byť zapísané aj v inom poradí. Ako indexový register je použitý EDX, do ktorého sme si uložili hodnotu premennej i. Ako bázový register je použitý EAX, do ktorého sme si uložili adresu začiatku poľa z parametra a.

Piaty príklad pole ako parameter Bázovaná a indexovaná adresa Naprogramujte funkciu: long max_prvok_ind(long a[], long n) Jej výsledkom je hodnota najväčšieho prvku v poli a, ktoré má dĺžku n. asm { mov ebx, a mov eax, [ebx] mov ecx, n dec ecx jecxz a3 a1: cmp eax, [ebx + ecx * 4] jge a2 mov eax, [ebx + ecx * 4] a2: loop a1 a3:

Šiesty príklad pole ako parameter metóda posúvania adresy Naprogramujte assemblerovú funkciu: void zamen(long a[], long n, long x, long y) ktorá v zamení v poli a všetky výskyty hodnoty x hodnotou y. asm { mov ebx, a // p = a; mov edx, x // mov eax, y // mov ecx, n // for (i = n; i > 0; i--) { jecxz a3 // // ak je nahodou n == 0 a1: cmp edx, [ebx] // if (x == *p) jne a2 mov [ebx], eax // *p = y; a2: add ebx, 4 // p++; loop a1 // a3:

Šiesty príklad pole ako parameter Bázovaná a indexovaná adresa Naprogramujte assemblerovú funkciu: void zamen_ind(long a[], long n, long x, long y) ktorá v zamení v poli a všetky výskyty hodnoty x hodnotou y. asm { ebx + (ecx-1)*4 = ebx + ecx*4-4 mov ebx, a mov edx, x mov eax, y mov ecx, n // for i in range(n,0,-1): jecxz a3 // # ak je nahodou n == 0 a1: cmp edx, [ebx+ecx*4 4] // if P == a[i-1]: jne a2 mov [ebx+ecx*4 4], eax // a[i-1] = y a2: loop a1 // # koniec cyklu for a3:

Siedmy príklad Kedy naozaj potrebujeme bázovanú a indexovanú adresu Naprogramujte assemblerovú funkciu: void vynuluj(long a[], long n, long indexy[], long m) ktorá v v poli a (dĺžky n)vynuluje všetky prvky na indexoch, ktoré dostane v poli indexy (dĺžky m). asm { mov ebx, a mov edx, indexy // p = indexy; mov ecx, m // for (i = m; i > 0; i--) { jecxz a3 // # ak je nahodou m == 0 a1: mov eax, [edx] // eax = *p; mov [ebx + eax*4], 0 // a[eax] = 0; add edx, 4 // p++; a2: loop a1 // a3: do poľa indexy pristupujeme pomocou posúvania smerníka do poľa a pristupujeme bázovanou a indexovanou adresou