n-pr H 5 C 6 CHCl 2 Pascal és assembler

Hasonló dokumentumok
A számok kiírása is alapvetően karakterek kiírásán alapul, azonban figyelembe kell venni, hogy a számjegyeket, mint karaktereket kell kiírni.

Stack Vezérlés szerkezet Adat 2.

Assembly Rekurzív függvények, EXE, C programok. Iványi Péter

assume CS:Code, DS:Data, SS:Stack Start mov dl, 100 mov dh, 100 push dx Rajz

Paraméter átadás regisztereken keresztül

Assembly utasítások listája

találhatók. A memória-szervezési modell mondja meg azt, hogy miként

Programozás alapjai. 10. előadás

assume CS:Code, DS:Data, SS:Stack Start: xor di, di mov si, 1 Torles int 10h mov dl, 40 xor bh, bh mov ah, 02h Kesleltet int 16h

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Gyakorló feladatok. /2 Maradék /16 Maradék /8 Maradék

Máté: Assembly programozás

PE/COFF fájl formátum

A 32 bites x86-os architektúra regiszterei

A PC vagyis a személyi számítógép. XIV. rész

Adatelérés és memóriakezelés

Balaton Marcell Balázs. Assembly jegyzet. Az Assembly egy alacsony szintű nyelv, mely a gépi kódú programozás egyszerűsítésére született.

Archi2 Gyak. (Processzorok Utasításszintű Kezelése) 2014 ősz

Szemantikai elemzés. konzisztenciájának vizsgálata a szemantikai elemzés feladata lesz.

Processzorok Utasításszintű Kezelése tavasz

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Az assembly nyelv sor-orientált nyelv, tehát minden sorba pontosan egy utasítás kerül. Egy sor mezőkből áll a következőképpen:

Előszó avagy Murphy és az optimizmus. Tartalomjegyzék

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Algoritmizálás és adatmodellezés tanítása 1. előadás

code segment para public 'code' assume cs:code, ds:code, es:nothing, ss:nothing

Programozás alapjai. 7. előadás

Máté: Assembly programozás

Assembly Utasítások, programok. Iványi Péter

Assembly Címzési módok. Iványi Péter

Assembly. Iványi Péter

Programozás alapjai. 5. előadás

8. gyakorlat Pointerek, dinamikus memóriakezelés

Delphi programozás IV.

Megszakítások és kivételek

Mi az assembly? Gyakorlatias assembly bevezető. Sokféle assembly van... Mit fogunk mi használni? A NASM fordítóprogramja. Assembly programok fordítása

Rendezések. A föltöltés nemcsak az r-re vonatkozik, hanem az s-re is. Ez használható föl a további rendezések

A regiszterek az assembly programozás változói. A processzor az egyes mőveleteket kizárólag regiszterek közremőködésével tudja végrehajtani.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Assebly feladatok SHR SHL NOT NEG AND XOR. Ezt követően ismertetni kell a szoftver megszakítás fogalmát és szükségességét.

PASzSz. Dr. Kotsis Domokos

Aritmetikai utasítások I.

Bevezetés a C++ programozási nyelvbe

Irvine eljárások. ClrScr - Törli a képernyő tartalmát és a kurzort a képernyő bal felső sarkába helyezi (Clear Screen).

GÁBOR DÉNES FŐISKOLA PREZENTÁCIÓ. Vezetőtanár: Ágoston György 2002/ szemeszter. 222 lap

Assembly programozás levelező tagozat

Máté: Assembly programozás

Dr. Máté Eörs docens. Képfeldolgozás és Számítógépes Grafika Tanszék Árpád tér 2. II. em

Eljárások, függvények

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

Programozás I. 5. Előadás: Függvények

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

[cimke:] [feltétel] utasítás paraméterek [; megjegyzés]

Eljárások és függvények

Java II. I A Java programozási nyelv alapelemei

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

7. fejezet: Mutatók és tömbök

Assembly programozás levelező tagozat

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Assembly. Iványi Péter

Java II. I A Java programozási nyelv alapelemei

A C++ szigorúbban kezeli a típuseltéréseket, mint a C nyelv Lehetséges típuskonverziók:

Programozás C++ -ban 2007/7

Programozás I gyakorlat

Közismereti informatika 2.zh T-M szakirány

Kivételkezelés a C++ nyelvben Bevezetés

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

Informatika terméktervezőknek

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Delphi programozás III.

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

A programozás alapjai 1 Rekurzió

Informatika 1 2. el adás: Absztrakt számítógépek

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

Memóriakezel. riakezelés s I. A memória címzése; A memória felosztása; Abszolút változó (rádefiniálás); Memóriatömbök. dr.

A C programozási nyelv VI. Parancssori argumentumok File kezelés

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Bevezetés a programozásba. 9. Előadás: Rekordok

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Alprogramok, paraméterátadás

Karunkról Kari digitális könyvtár

Bevezetés a programozásba Előadás: A const

A feladat. A főprogram

Programozás II. 4. Dr. Iványi Péter

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

Intel x86 utasításkészlet

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Programozási nyelvek Java

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

1. Egyszerű (primitív) típusok. 2. Referencia típusok

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Algoritmusok Tervezése. 4. Előadás Visual Basic 1. Dr. Bécsi Tamás

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Átírás:

súlyosan károsította a magzatot, (a gyerekek csökevényes végtagokkal születtek). A teratogén hatást az S-(-) enatiomér hordozza, míg az R-(+) hatástalan. Az 1-metil-5-fenil-5-propilbarbitursav egyik enatiomere hasznos nyugtató, míg a másik görcsös állapotot idéz elõ. Ma már kötelezõ minden királis gyógyszer sztereoizomérjeinek vizsgálata, e nélkül equilein S-(-)-talidomid forgalmazását nem engedélyezik. Megjegyzendõ, hogy ismerünk olyan eseteket is, mikor az enantiomérek biológiai hatása nem különbözik egymástól, sõt a racemát lehet hatásosabb, mint az összetevõk aktivitása külön-külön. A szintéziseknél keletkezõ racemátok fele szerencsés esetektõl eltekintve inaktív, vagy egyenesen káros hatású. Például a kloramfenikol nevû antibiotikumnak csak az ú.n. treo-formája: (-)-2(R)-diklór-acetamido-1(R)-p-nitrofenilpropándiol-1,3 aktív, a (+)antipodnak nincs antibiotikus hatása. ogy a termelés felét ne veszítsék el, ezt racemizálják, majd a racemátot választják. l 2 n-pr 5 6 3 2 2 Klorámfenikol 1-metil-5-fenil-5-propilbarbitursav A felsorolt példákból latható, hogy a sztereokémia egyike a kémia legdinamikusabban fejlõdõ ágazatának, megvalósításai szép példái az elmélet és a gyakorlat összekapcsolódásának. antz András Pascal és assembler agyobb, komplexebb programok írásakor szükségünk lehet assembler, gépi kódú utasítások használatára magas színtû programozási nyelvek keretén belül. A Borland Pascal nagyon megkönnyíti a nyelv gépi szintû felhasználását is. A kapcsolat többféleképpen valósulhat meg: 1. Registers típusú változók használatával, 2. Inline direktíva segítségével, 3. A belsõ assembler segítségével, 4. Külsõ.BJ állomány hozzáfûzésével. 1. A Registers típus A Registers típus a DS unit egyik típusa. Ez a típus az összes regisztert deklarálja: type Registers = record case Integer of 0: (AX, BX, X, DX,, SI, DI, DS, ES, Flags: Word); 1: (AL, A, BL, B, L,, DL, D: Byte); 102 2001-2002/3

Ezt a típust az Intr és MsDos eljárások használják. Mi a kívánt értéket elhelyezzük valamelyik regiszterbe, majd megszakítást hívunk. Az Intr eljárás általános, a MsDos eljárás a $21-es DS megszakítást hívja. A szegmensek címének meghatározására is megvannak a megfelelõ függvények (Sseg, Dseg, Sseg, Seg, fs, Ptr, Addr). Szintaxisok: procedure Intr(Intrr: byte; var R: Registers); procedure MsDos(var R: Registers); Példaprogram: A következõ program egy karaktersort ír ki, megszakítást használva. {pasint.pas} program PasInt; uses Dos; const uzenet: string[6] = 'Szia!$'; var Regs: Registers; Regs.A := $09; Regs.DS := Seg(uzenet); Regs.DX := fs(uzenet) + 1; Intr($21, Regs); 2. Az Inline direktíva Az Inline direktíva gépi kódú utasítások beszúrását teszi lehetõvé. Szintaxisa: Inline(kód1/kód2/kód3/...) A kód1, kód2,... gépi kódú utasítások. A gép automatikus méretdetektálást végez, de a méretet mi is beállíthatjuk a < illetve > karakterekkel. A < karakter azt jelenti, hogy byte hosszúságú kódot generál a soron következõ utasításnak, a > karakter pedig azt, hogy word méretû kódot generál. Példa: A következõ utasítás egy ugrás a betöltõkódra, vagyis újraindítja a gépet: Inline($EA/$00/$00/$FF/$FF). 3. A belsõ assembler A Borland Pascal tartalmaz egy belsõ assemblert is, amely megengedi, hogy bizonyos programsorok direkt assembler nyelvben íródjanak. Ezeket a programrészeket az... fenntartott szavak közé kell írni. Ezt nevezzük ASM blokknak. A beépített assembler felismeri az assambly nyelv minden utasítását, direktíváira azonban már itt nincs szükség (equ, assume, stb.). A programsorokba Pascal típusú kommentárokat fûzhetünk. A ;-nek itt is elválasztó szerepe van. Például: A következõ program a Pascal belsõ assemblerét használja {pas.pas} program PasAsm; var a, b, c: integer; write('a = '); readln(a); write('b = '); readln(b); add ax, bx mov c, ax writeln('a + b = ', c); mul bx mov c, ax writeln('a * b = ', c); 2001-2002/3 103

A belsõ assemblert nem csak fõprogramban, hanem eljárásokban és függvényekben is használhatjuk, sõt a Pascal megenged teljesen assemblerben írt eljárásokat és függvényeket is. Ez esetben a hagyományos fejléc deklarálása után az assembler standard direktívát kell írni, majd a függvény, eljárás testét az szóval kezdeni és az end-del befejezni. Az assembler direktíva használatakor a fordítóprogram bizonyos kódoptimizálásokat hajt végre. Például nem generál kódot az érték szerinti paraméterátadáskor, ezt egyenesen a regiszterekbe másolja, a függvények visszatérõ értéke az AX regiszterben lesz, a fordítóprogram nem foglal le veremhelyet a függvények, eljárások számára. Példaprogram: {fugg.pas} program FuggAsm; function sszeg(a, b: integer): integer; assembler; add ax, bx var a, b: integer; write('a = '); readln(a); write('b = '); readln(b); writeln('a + b = ', sszeg(a, b)); Egy ASM blokk belsejében hozzáférhetünk az összes regiszterhez, tartalmukat módosíthatjuk, a Pascal fordítóprogram azonban használja a, SP, DS, SS regisztereket, így ha használni kivánjuk õket, elõször el kell menteni a tartalmukat, majd a blokkból való kilépéskor visszaállítáni. A regiszter módosítása esetén már nem lesz hozzáférési lehetõségünk az eljárás vagy függvény lokális változóihoz vagy paramétereihez. A DS regiszter módosításakor a globális változókkal tartott kapcsolatok szakadnak meg. Egy speciális eset a függvény visszatérõ értéke. Ez egy lokális változóban van jelen, amelyet a fordítóprogram automatikusan generál. Ez a változó a @Result. E változó mellett még két változót generál a fordítóprogram, a @ode és @Data-t. Ezekben az aktuális kód, illetve adatszegmens címei vannak és a SEG operátorral közösen lehet õket használni. a a lokális változók, vagy a paraméterek nevei megegyeznek az assembler valamilyen fenntartott szavával, akkor ezeket a & operátorral lehet megváltoztatni. ASM blokkból hívhatunk más Pascalban megírt eljárásokat, függvényeket is, ezeknek a paramétereit a vermen keresztül kell átadni. ASM blokkon belül típuskonverzió is végre hajtható. Példaprogram: {hiv.pas} program Asmiv; procedure Kiir(a: char); writeln(a); xor ax, ax mov al, byte(&ch) push ax call Kiir procedure Kiiro(ch: char); assembler; Kiiro('a'); iklusok, ugrások szervezésére címkékre van szükségünk. A belsõ assembler értelmez mind lokális, mind globális címkéket. A lokális címkék csak az ASM blokkon belül láthatóak. Ezek Pascal típusú azonosítók, amelyeket a @ jel elõz meg és a : követ. A globális címkéket a label fenntartott szóval kell deklarálni és blokkok közötti ugrásokra használjuk. A belsõ assembler nem ad lehetõséget lokális, belsõ változók deklarálására. Azonban a DB, DW, DD direktívákat használva belsõ adatokat deklarálhatunk a kódszeg- 104 2001-2002/3

mensben. Az adatokat egy címke kell, hogy megelõzze és a címeiket az FFSET operátor segítségével kapjuk meg. Példaprogram: {adat.pas} program AsmAdat; procedure Uzen(kod: integer); assembler; cmp kod, 0 push ds jne @uzen1 mov dx, offset @uzenet0 jmp @kilep @uzenet0: db 'Az eljaras parametere: 0 ' db 13, 10, '$' @uzen1: mov dx, offset @uzenet1 jmp @kilep @uzenet1: db 'Az eljaras parametere: 1 ' db 13, 10, '$' @kilep: push cs pop ds mov ah, 09h int 21h pop ds Uzen(0); Uzen(1); 4. Külsõ.BJ állomány hozzáillesztése a programhoz A Pascal lehetõséget nyújt arra is, hogy külsõ.bj állományt hozzáilleszünk a programhoz. Ezt a {$L allomanynev} direktívával tehetjük. Így szorosabbá vált a Pascal és a külsõ assembler, a TASM kapcsolata. A külsõ állományban deklarált függvények, eljárások external típusúnak kell, hogy legyenek. A paraméterátadást a Pascal a vermen keresztül végzi a következõképpen: ha érték szerinti paraméterátadás van, akkor a verembe kerülnek az értékek a felsorolás sorrendjében, ha címszerinti átadásról van szó, vagy olyan értékrõl, amely nem fér a verembe, akkor a verembe ezeknek a címe kerül, offszetcím, szegmenscím alakban. A Pascal ezen kívül még a verembe helyezi az -t, S-et, ha FAR típusú hívásról van szó és a -t. Ezután a lokális változók kerülnek a verembe. A verem tehát a következõ alakú: lokális változók S ha FAR paraméterek A függvény visszatérõ értéke az AL-be kerül, ha byte, az AX-be, ha word típusú, illetve a DX:AX-be, ha ennél hosszabb. 2001-2002/3 105

Vegyük a következõ példát: function sszeg(a, b: integer; var c: integer): integer; far; var x, y: integer; A verem tartalma a következõ: A függvény visszatérõ értéke pedig az AX-ben lesz. Az eljárások, függvények automatikusan elvégzik a következõ utasítássorozatokat: ívásnál: push mov, SP sub SP, lokális változók hossza Befejezéskor: mov SP, pop RET paraméterhossz Ezért ügyeljünk tehát, ha megváltoztatjuk a DS,, SS, SP értéket, visszatéréskor állítsuk vissza. y x S offszet cím c segmens cím c b a y x S offszet cím c segmens cím c b a Példaprogram: A következõ Pascal program egy stringet olvas be, ezt átadja egy külsõ.bj állományban elhelyezett függvénynek, amely elõször kiírja, a kiíráshoz egy Pascalban írt eljárást használ, majd nagybetûssé alakítja és visszaadja a Pascal programnak. Elõször tehát assembler-ben kell megírnunk a forrásszöveget: {pasobj.} code segment para public 'code' assume cs:code extrn WriteStr public UpStr UpStr proc push bp mov bp, sp les dx, dword ptr[bp+4] push es push dx call near ptr WriteStr push ds lds si, dword ptr[bp+4] les di, dword ptr[bp+8] mov cx, [si] lodsb stosb c2: lodsb cmp al, 'a' jl c1 cmp al, 'z' jg c1 sub al, 32 c1: stosb loop c2 veg: pop ds pop bp ret 4 UpStr endp code ends end Ezt.BJ állománnyá fordítjuk: t pasobj., majd megírjuk a Pascal programot: {pasobj.pas} program Pasbj; function UpStr(s: string): string; external; {$L PASBJ.BJ} procedure WriteStr(s: string); writeln('a karaktersor: ', s); var s: string; write('kerek egy karaktersort: '); readln(s); writeln(upstr(s)); Kovács Lehel 106 2001-2002/3