;**************************************************************************** ; ; CTRL ; ; Tarvittavien CTRL-koodien m„„ritys: ; cr EQU 0DH ; telan palautus lf EQU 0AH ; rivin vaihto ;**************************************************************************** ; ; PASCAL - aliohjelmien tarvitsemia makroja ja m„„rityksi„: ; IF1 ;------------------- tulostetaan muistimalli -------------------------- IFDEF FARPROG %OUT K„„nnet„„n FAR PROC tyyppiseksi ELSE %OUT K„„nnet„„n NEAR PROC tyyppiseksi ENDIF ENDIF ;---------------------------- parametrien koot -------------------------- ; Parametrien koot pinossa: IFDEF FARPROG proc_size EQU <2 DUP(?)> ; Paluuosoitteen koko sanoina ELSE proc_size EQU <1 DUP(?)> ENDIF char EQU <2 DUP(?)> ; vain LO tavu kiinnostaa byte_ EQU <2 DUP(?)> ; vain LO tavu kiinnostaa boolean EQU <2 DUP(?)> ; vain LO tavu kiinnostaa ;---------------------------- PASCAL PROC ------------------------------- PASCAL_PROC MACRO nimi ; ; Makrolla aloitetaan Pascal-aliohjelma. Mik„li k„„nn”ksess„ on ; optio /DFarProg, niin t„ll”in aliohjelmasta k„„nnet„„n FAR-tyyppinen. ; ; Aliohjelman nimi m„„ritell„„n samalla julkiseksi. ; IFDEF FARPROG nimi PROC FAR ELSE nimi PROC NEAR ENDIF PUBLIC nimi ENDM ;------------------------------- pinossa -------------------------------- pinossa MACRO pinon_nimi,old_BP,eka_parametri,funktio ; ; Makrolla kerrotaan parametripinon nimi ja p„„asiallinen muoto. ; ; Input: pinon_nimi - parametripinon nimi, t„ytyy olla <>-suluissa ; old_BP - paikka, johon alkuper„inen BP on talletettu ; eka_param - 1. parametrin nimi parametripinossa ; funktio - mik„li pinon viimeiseksi on m„„ritelty ; funktion vaatima palaustusosoite, niin ; se ilmoitetaan 4. parametrill„ jos erisuuri ; kuin tyhj„. ; Output: ; Muuttuu: arvot: parametrit, lokaali_koko ; ; Esimerkki: jos Pascalissa: ; PROCEDURE koe(VAR a:INTEGER; b:CHAR; c:INTEGER); EXTERNAL; ; niin m„„ritell„„n pino seuraavasti: ; ; parametri_pino STRUC ; lokaali_1 DW ? ; mik„li tarvitaan 2 lokaalia muuttujaa ; lokaali_2 DW ? ; old_BP DW ? ; paluu DW proc_size ; c DW ? ; b DB char ; a DD ? ; parametri_pino ENDS ; pinossa ,old_BP,c ; ; Pinoon viitataan my”hemmin k„skyill„: ; MOV CX,p.c ; MOV AL,p.b ; LES DI,p.a ; ; HUOM! pascal_begin -makro kutsuu yleens„ t„t„ ; ; Vastaava funktiom„„ritys: ; FUNCTION koe(b:CHAR; c:INTEGER):INTEGER; EXTERNAL; ; niin m„„ritell„„n pino seuraavasti: ; ; parametri_pino STRUC ; lokaali_1 DW ? ; mik„li tarvitaan 2 lokaalia muuttujaa ; lokaali_2 DW ? ; old_BP DW ? ; paluu DW proc_size ; c DW ? ; b DB char ; funktio DD ? ; Tosin tulos tulee AX:ss„! ; parametri_pino ENDS ; pinossa ,old_BP,c,funktio ; ; IFB parametrit = (SIZE pinon_nimi) - eka_parametri ELSE parametrit = (SIZE pinon_nimi) - eka_parametri - 4 ENDIF lokaali_koko = old_BP ENDM ;------------------------------- p -------------------------------------- ; M„„ritys, jotta pinoon voidaan viitata edell„ esitetyll„ tavalla. p EQU <[BP-lokaali_koko]> ;------------------------------ pascal_begin ---------------------------- pascal_begin MACRO pinon_rakenne,rekisterit ; ; Makroa kutsutaan Pascal-aliohjelmaan tultaessa. ; ; Input: pinon_rakenne - ks. pinossa-makro. Pit„„ olla <>-suluissa. ; rekisterit - rekisterit, jotka t„ytyy tallettaa pinoon, ; jos enemm„n kuin yksi, niin <>-suluissa ; lokaali_koko - globaali arvo t„m„n hetkiselle pinon ; lokaalien muuttujien koolle, helpointa ; asettaa 'pinossa'-makrolla ; Output: pino, BP ; Muuttuu: pino, BP,SP ; K„ytt„„: push_reg- ja pinossa-makroja ; ; Esimerkki: pascal_begin <,old_BP,c>, ; ; pascal_begin:n ansiosta pino on seuraava (pinossa-esimerkin tapauksessa): ; ; SP -> DS ; lokaali_1 [BP-04], [BP-03] ; lokaali_2 [BP-02], [BP-01] ; BP -> vanha BP ; RET-osoite [BP+02], [BP+03] ; c:n arvo [BP+04], [BP+05] ; b:n arvo [BP+06] [BP+07] tyhj„ ; a:n ofs osoite [BP+08], [BP+09] ; a:n seg osoite [BP+0A], [BP+0B] ; ... ; pinossa pinon_rakenne PUSH BP ;; Alkuper„inen BP talteen MOV BP,SP ;; BP osoittamaan talletettuun BP:hen IF lokaali_koko ;; Jos lokaaleja muuttujia tarvitaan, SUB SP,lokaali_koko ;; niin tila niille varataan pinosta. ENDIF push_reg ;; K„ytett„v„t rekisterit pinoon. ENDM ;---------------------------- pascal_end -------------------------------- pascal_end MACRO rekisterit ; ; Makroa kutsutaan Pascal-aliohjelmasta poistuttaessa. ; ; Input: rekisterit - rekisterit, jotka on talletettu pinoon, ; jos enemm„n kuin yksi, niin <>-suluissa ; parametrit - globaali arvo t„m„n hetkiselle pinosta ; osoitettujen kutsuparametrien koolle, helpointa ; asettaa 'pinossa'-makrolla ; lokaali_koko - globaali arvo lokaalin muistialueen koolle. ; Output: pino, BP, CS:IP ; Muuttuu: pino, BP,SP,CS,IP ; K„ytt„„: pop_reg-makroa ; ; Esimerkki: pascal_end ; pop_reg ;; Talletetut rekisterit pois pinosta. IF lokaali_koko MOV SP,BP ;; Lokaalit muuttujat pois pinosta. ENDIF POP BP ;; Alkuper„inen BP IF parametrit ;; Mik„li aliohjelmassa oli parametrej„, RET parametrit ;; otetaan ne pois pinosta paluun yhteydess„. ELSE RET ENDIF ENDM ;--------------------------- ota os ------------------------------------- otaos MACRO muuttuja,reg LOCAL next ; ; Makrolla lasketaan koodisegmentiss„ olevan muuttujan ajonaikainen osoite ; rekisteriin. ; ; Input: muuttuja - muuttuja, jonka osoite lasketaan ; reg - rekisteri, johon tulos laitetaan ; Output: reg ; Muuttuu: liput,reg ; CALL next ; next:in ajonaikainen osoite pinoon. next: POP reg ; => saadaan t„m„n k„skyn osoite ADD reg,(OFFSET muuttuja)-(OFFSET next) ; + muuttujan ja POP reg:in v„li. ENDM ;------------------------------ v„liin ---------------------------------- valiin MACRO reg,ala,yla ; asetetaan reg v„lille ala<=reg<=yl„ LOCAL ei_pieni,ei_iso CMP reg,ala JGE ei_pieni MOV reg,ala ei_pieni: CMP reg,yla JLE ei_iso MOV reg,yla ei_iso: ENDM ;------------------------------- push_reg ------------------------------ push_reg MACRO rekisterit ; ; Makrolla laitetaan listassa rekisterit luetellut rekisterit pinoon. ; ; Input: rekisterit ; Muuttuu: SP ; ; Kutsu esim. push_reg ; IRP reg, PUSH reg ENDM ENDM ;------------------------------- pop_reg ------------------------------ pop_reg MACRO rekisterit ; ; Makrolla otetaan listassa rekisterit luetellut rekisterit pinosta. ; ; Input: rekisterit ; Muuttuu: SP, rekisterit ; ; Kutsu esim. pop_reg ; IRP reg, POP reg ENDM ENDM ;**************************************************************************** ; ; M S - D O S ; ; MS-DOSin kutsuissa tarvittavia makroja ja m„„rityksi„: ; read_kbd_and_echo EQU 01H tulosta_DSDX EQU 09H lopetus EQU 4CH ;---------------------------- MS-DOS ------------------------------- MS_DOS MACRO funktio,parametri ; ; Makrolla kutsutaan MS-DOS k„ytt”j„rjestelm„n funktiota funktio. ; Mik„li parametrikentt„ on m„„ritelty, laitetaan parametri AL- ; rekisteriin. ; ; Input: funktio, parametri ; Output: riippuu kutsusta ; Muuttuu: riippuu kutsusta, ainakin AX ; ; Esimerkki: ; MS_DOS lopetus,0 ; lopetetaan ohjelma. Ei virhett„. ; MOV AH,funktio IFNB IFDIFI , MOV AL,parametri ENDIF ENDIF INT 21H ENDM ;------------------------- tulosta_jono ---------------------------- tulosta_jono MACRO segmentti,osoite,talleta ; ; Makrolla tulostetaan muistipaikasta jono alkava merkkijono n„yt”lle. ; Jonon t„ytyy loppua $-merkkiin! ; Parametrin osoite t„ytyy olla muistipaikan nimi tai rekisteri DX, ; jossa on osoite tulostettavan jonon 1. merkkiin. ; Mik„li parametri talleta ei ole tyhj„, talletetaan kaikki makrossa ; mahdollisesti muuttuvat rekisterit. ; ; Input: segmentti,osoite,talleta ; Output: n„yt”lle ; Muuttuu: jos talleta<>'' ei mit„„n, muuten AX, DX ja DS ; ; Esimerkki: ; viesti DB 'Anna luku >','$' ; ... ; tulosta DS,viesti ; IFNB push_reg ENDIF IFDIFI , MOV AX,segmentti MOV DS,AX ENDIF IFDIFI , MOV DX,OFFSET osoite ENDIF MS_DOS tulosta_DSDX IFNB pop_reg ENDIF ENDM var EQU CS:[BX] ; v.p1 => CS:[BX+p1] ;**************************************************************************** ; ; C - aliohjelmien tarvitsemia makroja ja m„„rityksi„: ; ;---------------------------- C PROC ------------------------------------- C_PROC MACRO nimi ; ; Makrolla aloitetaan C-aliohjelma. Mik„li k„„nn”ksess„ on ; optio /DFarProg, niin t„ll”in aliohjelmasta k„„nnet„„n FAR-tyyppinen. ; ; Aliohjelman nimi m„„ritell„„n samalla julkiseksi. ; IFDEF FARPROG nimi PROC FAR ELSE nimi PROC NEAR ENDIF PUBLIC nimi ENDM ;------------------------------ c_begin ------------------------------------ c_begin MACRO pinon_rakenne,rekisterit ; ; Makroa kutsutaan C-aliohjelmaan tultaessa. Ks. pascal_begin ; ; Esimerkki: c_begin <,old_BP,c>, ; pascal_begin , ENDM ;--------------------------------- c_end -------------------------------- c_end MACRO rekisterit ; ; Makroa kutsutaan c-aliohjelmasta poistuttaessa. ; ; Input: rekisterit - rekisterit, jotka on talletettu pinoon, ; jos enemm„n kuin yksi, niin <>-suluissa ; lokaali_koko - globaali arvo t„m„n hetkiselle pinon ; lokaalien muuttujien koolle, helpointa ; asettaa 'pinossa'-makrolla ; Output: pino, BP, CS:IP ; Muuttuu: pino, BP,SP,CS,IP ; K„ytt„„: pop_reg-makroa ; ; Esimerkki: c_end ; pop_reg ;; Talletetut rekisterit pois pinosta. IF lokaali_koko MOV SP,BP ;; Lokaalit muuttujat pois pinosta. ENDIF POP BP ;; Alkuper„inen BP RET ENDM