Ú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 Pra

Podobné dokumenty
Úroveň strojového kódu procesor Intel Pentium Úvod Štruktúra procesorov Intel Pentium Základné inštrukcie Vetvenia a cykly Praktické programovanie jed

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

Microsoft PowerPoint - Prog_p08.ppt

Zobrazenie čísiel v počítači Celé nezáporné čísla - čísla bez znamienka dvojková sústava iné používané sústavy - šestnástková a osmičková BCD kódovani

NÁVRH UČEBNÝCH OSNOV PRE 1

enum

Katalóg cieľových požiadaviek k maturitnej skúške

DediĊnosť

03_ControlFlow.dvi

Súkromné gymnázium, Česká 10, Bratislava INFORMATIKA

Algoritmizácia a programovanie - Príkazy

Organizácia počítačových systémov Procesory Vnútorná pamäť Vonkajšie pamäte Vstupné a výstupné zariadenia Autor: Peter Tomcsányi Niektoré práva vyhrad

Identity Lifecycle Management

Informačné technológie

Prezentace aplikace PowerPoint

Vnútorná reprezentácia údajových typov

Paralelné algoritmy, cast c. 2

Priebeh funkcie

ECDL Syllabus V50 SK-V01

PowerPoint Presentation

Microsoft PowerPoint - OOP_prednaska_10.pptx

MO_pred1

CviĊenie z PTS

8 Cvičenie 1.1 Dokážte, že pre ľubovoľné body X, Y, Z platí X + Y Z = Z + Y X. 1.2 Dokážte, že pre ľubovoľné body A, B, D, E, F, G afinného priestoru

MATEMATICKÁ OLYMPIÁDA NA STREDNÝCH ŠKOLÁCH 54. ročník, školský rok 2004/2005 Zadania úloh 3. kola kategórie P 1. súťažný deň Na riešenie úloh máte 4.5

Microsoft Word - skripta3b.doc

Microsoft Word shm_ popadic.doc

1 Rekurencie este raz riesenia niektorych rekurencii z cvik. mame danu rekurenciu napr T (n) = at ( n b ) + k. idea postupu je postupne rozpisovat cle

Objektovo orientované programovanie

Paralelné algoritmy, cast c. 3

Analýza toku dát Ján Šturc Zima 2010 Kompilátory

Pokrocilé programovanie XI - Diagonalizácia matíc

Photo Album

Paralelné algoritmy, cast c. 3

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

Autoregresné (AR) procesy Beáta Stehlíková Časové rady, FMFI UK Autoregresné(AR) procesy p.1/22

User:Andrej Sedlacek

Jadrova fyzika - Bc.

Externé mediálne karty Používateľská príručka

Pokročilé programovanie mikropočítačov v jazyku C. Diel č.2 Publikované: , Kategória: Mikroprocesory Skúmame ADCčko Ahoj

4. Pravidlo ret azenia. Často sa stretávame so skupinami premenných, ktoré zložitým spôsobom závisia od iných skupín premenných. Pravidlo ret azenia p

Žiadosť o licenčnú zmluvu na podujatie Na adrese v sekcii hlavného menu kliknete na položku Používatelia. Zobrazí sa blokové menu,

Súhrnné špecifikácie

Snímka 1

Hardwarové prerušenie Nasledujúci kód ukazuje inštaláciu obsluhy časovača vrátane jeho inicializácie // inicializace časovače, přerušení každou milise

VSDC Free Video Editor stručný návod na používanie Link na sťahovanie softvéru: K prog

ŤAHÁK PRAKTICKÁ ČASŤ Prerekvizity: LINUX: WINDOWS: Inštalácia Oracle VirtualBoxu a vytvorenie virtuálneho stroja /návod nižšie/ Operačný system Window

PowerPoint Presentation

História

Chemical Business NewsBase

Microsoft Word - typ_S_1_Priklad.doc

midterm2014_1

2

Predmet: Počítačové systémy a siete Charakteristika predmetu Žiak sa oboznámi sa so základným princípom fungovania počítača, rozvinie koncept Von Neum

Operačné systémy Prednáška č. 2 Windows 95 Windows 95 má povesť ľahko ovládateľného systému pre užívateľov a ťažkého systému pre programátorov. Začiat

Metodika práce s gitom Spôsob práce s gitom V projekte sa budú udržovať dve hlavné vetvy: - Master - Hlavná vetva, ktorá odráža otestovaný funkčný kód

Slide 1

Teória pravdepodobnosti Zákony velkých císel

Školský vzdelávací program Základná škola s materskou školou Šarišské Michaľany 6. UČEBNÝ PLÁN 6.1 Inovovaný učebný plán ISCED 1 Platnosť od

Snímka 1

N Á R O D N Á R A D A S L O V E N S K E J R E P U B L I K Y VI. volebné obdobie Návrh Zákon z , ktorým sa mení a dopĺňa zákon č. 580/2004 Z. z.

III. Diferenciálny počet funkcie viac premenných (Prezentácia k prednáškam, čast B) Matematická analýza IV (ÚMV/MAN2d/10) RNDr. Lenka Halčinová, PhD.

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY FAKULTA INFORMAČNÍCH TECHNOLOGIÍ ÚSTAV INFORMAČNÍCH SYSTÉMŮ FACULTY OF INFORMATION TECHNOL

Prezentace aplikace PowerPoint

Funkcionálne programovanie Cvičenie 9 Funkcionálne programovanie v Jave Sergej Chodarev 22. november 2017 Technická Univerzita v Košiciach

Informačná a modelová podpora pre kvantifikáciu prvkov daňovej sústavy SR

Novinky v OpcDbGateway 5.0

Microsoft Word - Algoritmy a informatika-priesvitky02.doc

Library of Compression Algorithms

Multithreading a komunikácia medzi procesmi a threadmi, Časová závislosť, kritická sekcia a vzájomné vylúčenie, súvislosti medzi týmito pojmami Riešen

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Relačné a logické bázy dát

N desitka.indd

Verejná súťaž

Operačná analýza 2

Vostro 3750 Technický hárok s informáciami o nastavení a funkciách

Úvod do mobilného operačného systému ANDROID

Študijný program (Študijný odbor) Školiteľ Forma štúdia Téma Elektronické zbraňové systémy (8.4.3 Výzbroj a technika ozbrojených síl) doc. Ing. Martin

Matej Kendera - PDF, word, lucene, java

(Pom\371cka k p\370\355prav\354 v\375ukov\351 hodiny s podporou Classroom Managementu \(Matematika\))

1 Portál pre odborné publikovanie ISSN Heuristický adaptívny PSD regulátor založený na miere kmitavosti Šlezárová Alexandra Elektrotechnika

Olympiáda v informatike ročník (2018/2019) riešenia krajského kola kategória A Priebeh krajského kola Krajské kolo 34. ročníka Olymp

prijimacky 2014 MAT 4rocne ver A.doc

Podvojné účtovníctvo, fakturácia a sklad ekasa: štandardný predaj priamo z programu Pri predaji s priamym napojením na softvér je potrebné mať online

Popis textového formátu a xsd schémy na zasielanie údajov podľa 27 ods. 2 písm. f) zákona (formu na zaslanie údajov si zvolí odosielateľ údajov) Texto

AM_Ple_LegReport

Microsoft Word - 6 Výrazy a vzorce.doc

Úrad pre dohľad nad zdravotnou starostlivosťou Žellova 2, Bratislava Dátové rozhranie pre externý subjekt MV SR Strana 1 z 10 Dátové rozhranie

bakalarska prezentacia.key

(Microsoft Word Zadanie na s\372\235a\236 KROS DESIGN AWARD .doc)

Microsoft Word - Argumentation_presentation.doc

Viacnásobne použitelné oblasti spolahlivosti pre viacrozmernú kalibráciu

Operačná analýza 2

Praktické paralelné programovanie v jazykoch C# 4.0 a C++

Úvod do lineárnej algebry Monika Molnárová Prednášky 2006

Neineárne programovanie zimný semester 2018/19 M. Trnovská, KAMŠ, FMFI UK 1

SK MATEMATICKA OLYMPIADA 2010/ ročník MO Riešenia úloh domáceho kola kategórie Z4 1. Doplň do prázdnych políčok čísla od 1 do 7 každé raz tak,

1

Prepis:

Ú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/ 1/13

Adresovanie pamäte Opakovanie: operand inštrukcie môže byť priamy (konštanta, číslo), register alebo pamäťový. 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, musíme ho nejako adresovať. 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. 2/13

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; j je na adrese 1534 i je na adrese 1530 j i 1534 1533 1532 1531 1530 MOV EAX,[1534] ADD EAX,5 MOV [1530],EAX Priama adresa je číslo v hranatých zátvorkách 3/13

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. 4/13

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. alebo aj int *a 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 na cvičeniach s tatrabotom: http://dai.fmph.uniba.sk/courses/pphw/ex/3.php 5/13

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 6/13

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) long i; short a[5]; int main() { a[i] = i+1; 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á). 7/13

Bázovaná a indexovaná adresa Prvky polí prijatých ako parameter Ak je parameter pole, tak funkcia dostane vždy smerník na pole, 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. 8/13

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: 9/13

Šiesty príklad reťazec ako parameter metóda posúvania adresy Naprogramujte assemblerovú funkciu: void zamen(char * a, char x, char y) ktorá v zamení v reťazci a všetky výskyty hodnoty x hodnotou y. asm { mov ebx, a // p = a; mov dl, x // mov dh, y // a1: mov al, [ebx] // while (*p!= 0) { cmp al, 0 // je a3 // cmp dl, [ebx] // if (x == *p) jne a2 // mov [ebx], dh // *p = y; a2: inc ebx // p++; jmp a1 // a3: Reťazec je vlastne pole prvkov typu char. Za posledným znakom reťazca je znak s kódom 0. Preto nepotrebujeme vedieť dĺžku dopredu, ale musíme ju "zistiť" v cykle typu while. 10/13

Siedmy 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: 11/13

Ôsmy 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 do poľa indexy pristupujeme pomocou posúvania smerníka 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 a pristupujeme bázovanou a indexovanou adresou 12/13

Adresovanie pamäte Ďalšie informácie Najviac jeden operand smie byť v pamäti MOV [EAX+2],[EBX+4] CMP [EBX],n V adrese nesmú byť guľaté zátvorky ani premenné: MOV EAX, [EBX+(ECX-1)*4] MOV EAX, [EBX+n*4] Treba roznásobiť: MOV EAX, [EBX+ECX*4-4] Treba najprv uložiť n do nejakého registra Určenie dĺžky operandu (keď kompilátor nevie): INC [EBX] MOV [EDX+8],0 MOV BYTE PTR [EDX+8],0 MOV WORD PTR [EDX+8],0 MOV DWORD PTR [EDX+8],0 nie je jasná dĺžka operandu. Skutočný Intel assembler by hlásil chybu. Ale visual Studio vtedy predpokladá, že operand má jeden bajt! operand má jeden bajt operand má dva bajty operand má štyri bajty 13/13