Programming | Pascal » Turbo Pascal - Turbo Assembler interfész

Datasheet

Year, pagecount:2000, 14 page(s)

Language:Hungarian

Downloads:1040

Uploaded:July 16, 2004

Size:132 KB

Institution:
-

Comments:

Attachment:-

Download in PDF:Please log in!



Comments

No comments yet. You can be the first!

Content extract

- TP-TA interfész/1 - Turbo Pascal - Turbo Assembler interfész Turbo Pascalból akkor hívunk assembly nyelven írt eljárást vagy függvényt, ha Pascalban nem- vagy nehezen lehet megírni, vagy a hatékonyság fontos, amit Pascal nyelven nem tudunk biztosítani. minden unit-nak saját kódszegmense van (max. 64 KB) Heap Heap Org Sseg: SPtr Sseg: 0 Verem (stack) Globális változók Típusos konstansok Dseg: 0 max. 64 KB, SS címzi, nem változik max. 64 KB, DS címzi, nem változik a pr. futása közben System unit kódszegmens .exe tartalma Unit-ok kódszegmens Főprogram kódszegmens Program Segment Prefix (PSP) Prefix Seg Alacsony címek 256 byte (program paraméterek, memória mérete, DOS environment( A Turbo Pascal memória használata A TP regiszter használata Ha eljárást vagy függvényt hívunk, 3 regiszter tartalmát kell megőriznünk: SS, DS, BP A BP (bázis pointer) mindig a hívott eljárás aktivációs rekordjára mutat. (Aktivációs rekord =

paraméterek, lokális változók, ideiglenesen tárolt adatok a veremben). Az SP-t az eljárásból kilépés előtt úgy kell beállítani, hogy a paraméterek ne maradjanak a veremben! Közeli (near) vagy távoli (far) eljáráshívás Near hívás: az eljárás ugyanabban a kódszegmensben van. Far hívás: az eljárás másik kódszegmensben van. A hívó programban az eljárás deklarációjának meg kell egyeznie az eljárás deklarációjával. - TP-TA interfész/2 - Turbo Pascal - Turbo Assembler együtt Pascal programban: . . . Procedure ASMproc(a: integer; b: real); far; external; {$L ASMproc.obj} Csak a legkülső szinten lehet deklarálni! Function ASMfunc(var x: string; z: byte): string; far; external; {$L ASMfunc.obj} . . . Asm programban: .model TPASCAL .code ASMproc PROC FAR <paraméterek> PUBLIC ASMproc ; TP-ben csak a PUBLIC szimbólumok láthatók! ; PUBLIC szimbólumok csak a kódszegmensben definiálhatók! . . . ASMproc ENDP EXTRN direktíva A

TA modul hozzáférhet bármely TP eljáráshoz, függvényhez, változóhoz és típusos konstanshoz, amelyet a főprogramban vagy a unit legkülső blokkjában deklaráltunk. TP deklarációk a: Byte b: Word c: Shortint d: Integer e: Real f: Single g: Double h: Extended i: Comp j: Pointer EXTRN A: EXTRN B: EXTRN C: EXTRN D: EXTRN E: EXTRN F: EXTRN G: EXTRN H: EXTRN I: EXTRN J: TA EXTRN deklarációk BYTE ; 1 byte WORD ; 2 byte BYTE WORD FWORD ; 6 byte szoftver Real DWORD ; 4 byte IEEE floating point QWORD ; 8 byte IEEE double floating point TBYTE ; 10 byte IEEE temporary floating point QWORD ; 8087 8-byte signed integer DWORD ; TP pointer - TP-TA interfész/3 - Turbo Pascal paraméterátadás-konvenciók Paraméterátadás a veremben történik. Kivétel: a Single, Double, Extended és Comp értékparamétereket a numerikus processzor hardver vermében kell átadni! A paraméterek sorrendjének egyeznie kell a deklarációban leírt sorrenddel. Értékparaméterek A skalár

típusok:  Boolean  Char  Shortint  Byte  Integer  Word  Longint  Résztartomány típusok  Felsorolás típusok a veremben lesznek átadva. A paraméter minimális hossza 2 byte! Real: 6 byte szoftver floating point a veremben (A 4 byte-nál nagyobb érték-paramétereket cím szerint adjuk át, és ha az eljárásban módosítja, az eljárásnak kell másolatot készítenie róluk!) Pointer: veremben: szegmens: ofszet ASM az LDS (Load Data Segment) és a LES (Load Extra Segment) utasításokkal veheti elő a veremből a pointer paramétereket. String: a string-re mutató pointer kerül a verembe. Ha az eljárás módosítja a string-et, belépéskor helyi másolatot kell készítenie. Record: Array: Set: ha a paraméter 1, 2 vagy 4 byte hosszú, akkor a veremben lesz átadva, egyébként pointer kerül a verembe. a string-hez hasonlóan kezeli - TP-TA interfész/4 - Változó paraméterek (Var) Mindig "far" (távoli) pointer kerül a

verembe. Veremkezelés A TP feltételezi, hogy a hívott eljárás minden paramétert kitakarít a veremből kilépés előtt. Ezt segíti a Ret n processzorutasítás, amely n byte-ot távolít el a veremből. Paraméterek elérése az ASM eljárásban. Paraméterek SP Return address: Near esetben = 2 byte Far esetben = 4 byte SS Paraméterek elhelyezkedése a veremben A paramétereket általában a BP regiszter címzésével használhatjuk. Procedure Myproc(i, j: integer); far; external; {$L Myproc.obj} .model TPASCAL .code Myproc PROC FAR i: WORD, j: WORD PUBLIC Myproc mov ax, i . . ret - TP-TA interfész/5 - i (2 byte) Paraméterek j (2 byte) Return address = 4 byte SP hívás után BP elmentve SS 2 érték paraméterek a veremben A verem vastag vonalakkal határolt része az eljárásba belépés pillanatát mutatja:  i értékparaméter  j értékparaméter  visszatérési cím (4 byte a távoli hívás miatt) Az eljárás paramétereit a BP-n

keresztül érjük el, mivel a BP-vel címzett adatok default szegmensregisztere az SS (veremszegmens regiszter). Az eljárásból kilépve viszont BP regiszter értékét meg kell őrizni. Ezért az eljárás első és utolsó utasításai push bp mov bp, sp . . . pop bp ret n ; BP regiszter mentése a verembe ; a BP-t az SP belépéskori értékére állítjuk ; az eljárás utasításai ; visszaállítjuk a BP értékét ; kiürítjük a veremből a paramétereket ; a ret utasítás leemeli a veremből a visszatérési címet, ; és ezen a címen folytatja a program végrehajtását A fenti példában a Myproc PROC FAR i: WORD, j: WORD deklaráció alapján a Turbo Assembler automatikusan beilleszti az eljárás elejére és végére a vastagon jelölt 2-2 utasítást. - TP-TA interfész/6 A mov ax, i utasítás automatikusan a mov ax, [bp + 8] utastásra fordul. A 8 byte-nyi eltolás az elmentett BP (2 byte) + visszatérési cím (4 byte) + "j" paraméter (2 byte)

összegéből adódik. - TP-TA interfész/7 - 1. példa Az eredetileg megírt program ; TP plus proc: Összead 2 Integer paramétert, az összeget a 3 paraméterben adja vissza .model TPASCAL ; Turbo Pascal code model .code TP plus proc far x: word, y:word, s:dword public TP plus mov ax, x add ax, y les di, s ; s címe -> es:di mov es:[di], ax ret TP plus endp end -------------------------------------------------------------------A lefordított Asm program tp plus.ASM 1 ; Összead 2 Integer paramétert, az összeget a 3 paraméterben adja vissza 2 0000 .model TPASCAL ; Turbo Pascal code model 3 0000 .code 4 0000 TP plus proc far x: word, y:word, s:dword 5 public TP plus 1 6 0000 55 PUSH BP 1 7 0001 8B EC MOV BP,SP 1 8 0003 8B 46 0C mov ax, x 9 0006 03 46 0A add ax, y 10 0009 C4 7E 06 les di, s ; s címe -> es:di 11 000C 26: 89 05 mov es:[di], ax 1 12 000F 5D POP BP 1 13 0010 CA 0008 RET 00008h 14 0013 TP plus endp 15 end Vastagon jeleztük az assembler kiegészítéseit.

-------------------------------------------------------------------A Pascal program Program TP pl; Var a, b, sum: integer; Procedure TP Plus(x, y :integer; var s: integer); far; external; {$L TP Plus.obj} Begin a:= 5; b:= 3; TP Plus(a, b, sum); WriteLn(Összeg=, sum); End. -------------------------------------------------------------------- - TP-TA interfész/8 - Függvény visszatérési értéke Típus függő! Skalár: 1 byte 2 byte 4 byte ha a paraméter hossza AL-ben AX-ben DX:AX-ben Real: DX:BX:AX -ben (6 byte) String: a hívó allokál ideiglenes tárterületet a visszatérési értéknek. A hívó elhelyez egy "far" pointert a verembe az első paraméter elé, amely erre a tárterületre mutat. Ez nem része a paraméterlistának, nem szabad a veremből eltávolítani! Pointer: DX:AX DX = szegmens, AX = ofszet - TP-TA interfész/9 - 2. példa Az eredetileg megírt program ; Összead 2 Integer paramétert, az összeget függvény értékként adja vissza

; A függvény értékét az AX-be kell tenni .model TPASCAL ; Turbo Pascal code model .code TP plusf proc far x: word, y:word public TP plusf mov ax, x add ax, y ; a visszatérési érték az AX-ben! ret TP plusf endp end -------------------------------------------------------------------A lefordított Asm program tp plusf.ASM 1 1 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; Összead 2 Integer paramétert, az összeget függvény értékként adja vissza ; A függvény értékét az AX-be kell tenni 0000 .model TPASCAL ; Turbo Pascal code model 0000 .code 0000 TP plusf proc far x: word, y:word public TP plusf 0000 55 PUSH BP 0001 8B EC MOV BP,SP 0003 8B 46 08 mov ax, x 0006 03 46 06 add ax, y 0009 5D POP BP 000A CA 0004 RET 00004h 000D TP plusf endp end Vastagon jeleztük az assembler kiegészítéseit. -------------------------------------------------------------------A Pascal program Program TP plf; Var a, b: integer; Function TP Plusf(x, y :integer):integer; far; external; {$L TP

Plusf.obj} Begin a:= 5; b:= 3; WriteLn(Összeg=, TP Plusf(a, b)); End. -------------------------------------------------------------------- - TP-TA interfész/10 - 3. példa Az eredetileg megírt program ; A paraméterként kapott string betűit nagybetűre csupa cseréli .Model TPASCAL ; Turbo Pascal code model .CODE upperc PROC FAR s: DWORD RETURNS Eredmeny :DWORD ; function upperc(s: string): string PUBLIC upperc lds si, s les di, Eredmeny cld lodsb stosb mov cl, al xor ch, ch jcxz u3 ; param string címe ; függvény-érték címe ; másolás a nagyobb címek felé ; load string hossz -> al ; string hossz tárolása ; string hossz -> cx lodsb cmp al, a jb u2 cmp al, z ja u2 sub al, a-A ; karakter betöltése ; ugrás, ha nem a . z stosb loop u1 ; karakter tárolás ; üres string u1: ; konvertál nagy betűre (20h) u2: u3: ret upperc endp end -------------------------------------------------------------------- - TP-TA interfész/11 A lefordított Asm

program upperc.asm 1 0000 .Model TPASCAL ; Turbo Pascal code model 2 0000 .CODE 3 0000 upperc PROC FAR s: DWORD RETURNS Eredmeny :DWORD 4 ; function upperc(s: string): string 5 PUBLIC upperc 6 1 7 0000 55 PUSH BP 1 8 0001 8B EC MOV BP,SP 1 9 0003 C5 76 06 lds si, s ; param string címe 10 0006 C4 7E 0A les di, Eredmeny ; függvény-érték címe 11 0009 FC cld ; másolás a nagyobb címek felé 12 000A AC lodsb ; load string hossz -> al 13 000B AA stosb ; string hossz tárolása 14 000C 8A C8 mov cl, al ; string hossz -> cx 15 000E 32 ED xor ch, ch 16 0010 E3 0E jcxz u3 ; üres string 17 0012 u1: 18 0012 AC lodsb ; karakter betöltése 19 0013 3C 61 cmp al, a ; ugrás, ha nem a . z 20 0015 72 06 jb u2 21 0017 3C 7A cmp al, z 22 0019 77 02 ja u2 23 001B 2C 20 sub al, a-A ; konvertál nagy betűre (20h) 24 001D u2: 25 001D AA stosb ; karakter tárolás 26 001E E2 F2 loop u1 27 0020 u3: 1 28 0020 5D POP BP 1 29 0021 CA 0004 RET 00004h 30 31 0024 upperc endp 32 end

-------------------------------------------------------------------A Pascal program Program upper; Var a :string; Function upperc(st: string): string; far; external; {$L upperc.obj} Begin a:= Kis Pista; WriteLn(Előtte : , a); WriteLn(Utána : , upperc(a)); End. -------------------------------------------------------------------- - TP-TA interfész/12 - 4. példa Az eredetileg megírt program ; A paraméterként kapott 2 tetszőleges (de azonos) típusú változó tartalmát felcseréli. ; A 3. paraméter a változók hossza byte-ban .Model TPASCAL ; Turbo Pascal code model .Code Exchange proc far valt1: dword, valt2:dword, darab:word PUBLIC exchange cld ; csere a nagyobb címek fel‚ mov dx, ds ; ds elment‚se lds si, valt1 ; 1. cim -> ds:si les di, valt2 ; 2. cim -> es:di mov cx, darab ; másolandó byte # shr cx, 1 ; alsó bit -> Carry jnc csere ; ugrás, ha páros számú byte mov al, es:[di] ; valt2 páratlan byte-ja movsb ; valt1 byte -> valt2 mov [si-1], al ;

valt2 byte -> valt1 jz vege ; vége, ha csak 1 byte volt csere: mov bx, -2 ; -2 tárolása csciklus: mov ax, es:[di] ; valt2 szava -> ax movsw ; valt1 szó -> valt2 mov [bx][si],ax ; valt2 szó -> valt1 loop csciklus ; ismétlés Vege: mov ds, dx ; Turbo Pascal ds visszaállítása ret exchange endp end -------------------------------------------------------------------- - TP-TA interfész/13 A lefordított Asm program exchange.ASM 1 0000 .Model TPASCAL ; Turbo Pascal code model 2 0000 .Code 3 0000 Exchange proc far valt1: dword, valt2:dword, darab:word 4 PUBLIC exchange 1 5 0000 55 PUSH BP 1 6 0001 8B EC MOV BP,SP 1 7 0003 FC cld ; csere a nagyobb címek fel‚ 8 0004 8C DA mov dx, ds ; ds elment‚se 9 0006 C5 76 0C lds si, valt1 ; 1. cim -> ds:si 10 0009 C4 7E 08 les di, valt2 ; 2. cim -> es:di 11 000C 8B 4E 06 mov cx, darab ; másolandó byte # 12 000F D1 E9 shr cx, 1 ; alsó bit -> Carry 13 0011 73 09 jnc csere ; ugrás, ha páros számú byte 14 0013 26:

8A 05 mov al, es:[di] ; valt2 páratlan byte-ja 15 0016 A4 movsb ; valt1 byte -> valt2 16 0017 88 44 FF mov [si-1], al ; valt2 byte -> valt1 17 001A 74 0B jz vege ; vége, ha csak 1 byte volt 18 001C csere: 19 001C BB FFFE mov bx, -2 ; -2 tárolása 20 001F csciklus: 21 001F 26: 8B 05 mov ax, es:[di] ; valt2 szava -> ax 22 0022 A5 movsw ; valt1 szó -> valt2 23 0023 89 00 mov [bx][si],ax ; valt2 szó -> valt1 24 0025 E2 F8 loop csciklus ; ismétlés 25 0027 Vege: 26 0027 8E DA mov ds, dx ; Turbo Pascal ds visszaállítása 1 27 0029 5D POP BP 1 28 002A CA 000A RET 0000Ah 29 002D exchange endp 30 end -------------------------------------------------------------------- - TP-TA interfész/14 A Pascal program Program tcsere; Type tan= record nev : string[20]; odij: integer end; Var a, b: tan; Procedure Exchange(var valt1, valt2; darab: word); far; external; {$L exchang.obj} Begin a.nev:= Kis Pista; a.odij:= 5000; b.nev:= Nagy Lajos; b.odij:= 10000; WriteLn(Előtte a: ,

a.nev, , aodij); WriteLn(Előtte b: , b.nev, , bodij); Exchange(a, b, sizeof(a)); WriteLn(Utána a: , a.nev, , aodij); WriteLn(Utána b: , b.nev, , bodij); End. --------------------------------------------------------------------