Prikaz objav z oznako MACRO. Pokaži vse objave
Prikaz objav z oznako MACRO. Pokaži vse objave

petek, 15. marec 2002

DOBER DAN TEZAURUS


Vsak priročnik za programiranje kot vzorec »kako in kaj« se prične z demonstracijo izpisa »Hallo word«. Za različne programske jezike so tukaj  primeri. Ker za asembler jezik IBM System/370  tega ni, je v nadaljevanju nekaj instrukcij, kako to gre.


// JOB DOBER DAN TEZAURUS                                          1
// OPTION LINK                                                     2
// EXEC ASSEMBLY                                                   3
         TITLE 'VZOREC ZA IZPIS *DOBER DAN TEZAURUS* NA KONZOLO'   4
START    START 0                                                   5
BALR     BALR  10,0                                                6
         USING *,10                                                7
         MVC   IO1,=C'DOBER DAN TEZAURUS    '                      8
         PUT   KONZOLA                                             9
         EOJ                                                      10
IO1      DS    CL20                                               11
KONZOLA  DTFCN DEVADDR=SYSLOG,IOAREA1=IO1,BLKSIZE=20              12
         LTORG                                                    13
         END   BALR                                               14
/*                                                                15
// EXEC LNKEDT                                                    16
// EXEC                                                           17
/&                                                                18


Komentar posameznih vrstic oziroma ukazov pa je naslednji:

  1. prva kartica posla ali »JOB-a« s komentarjem
  2. ukaz asemblerju, da naj naredi »object deck« programa, ki ga bo pozneje uporabil LNKEDT
  3. pokličemo prevajalnik
  4. le za preglednost, kar asembler  izpiše na vsako stran
  5. prvi ukaz programu, da se začne z adreso 0 (nič)
  6. ukaz kateri splošni register se naj uporabi za adresiranje
  7. od tukaj dalje naj se uporablja register 10
  8. »move character« tj. besedilo »DOBER DAN TEZAURUS« v input/output področje konzole
  9. piši na konzolo
  10. end of job
  11. rezervacija v spominu za besedilo, ki se bo izpisalo
  12. definiranje konzole (define the file console)
  13. tukaj naj pridejo vsi »literali«
  14. tukaj naj asembler konča prevajanje
  15. zaključek asemblerja
  16. pokličemo »povezovalni« program LNKEDT, ki poveže rezultat asemblerja z zunanjimi rutinami
  17. izvedi program – na konzolo se izpiše »DOBER DAN TEZAURUS«
  18. konec posla ali »JOB-a«

BISSSSSS EXTRN modul


V nadaljevanju je originalna BISSSSSS zunanja, to je EXTRN, rutina, ki se vključi med izvajanjem LNKEDT, to je povezovanja, prevedenega source programa in vse skupaj postane enoten program za neposredno izvajanje.


CATALOG BISSSSSS.A                        REPLACE=YES
BISS TITLE '... BISSSSSS ... BINARNO ISKANJE / RL MODUL / '
         PUNCH '    CATALR BISSSSSS '
BISSSSSS CSECT
         USING *,15
         STM   2,4,BISSSS12       STORE REG.2,3,4
         SR    0,0                R0=NULA
         LH    4,0(14)            R4=DOLŽ.ARGUMENTA
         L     1,14(14)           END OZ.ŠT.ELEMENTOV
         LR    3,1
         CH    4,=H'254'          DOLŽ.ARGUM.VEČJA OD 254 ?
         BH    BISSSS03           DA,ŠT.ELEMEN.V END POLJU
         S     1,2(14)            END-START=DOL.TABELE
         LH    2,10(14)           R2=KORAK
         DR    0,2                R1=ŠT.ELEMENTOV
*
BISSSS01 EQU   *
         LA    0,1                R0=1
*
BISSSS02 EQU   *
         SRA   1,1                R1/2
         BZ    BISSSS04           DA, R0=2**N
         SLA   0,1                R0*2
         B     BISSSS02           LOOP
*
BISSSS03 EQU   *
         SH    4,=H'255'          R4=DOLŽ.ARG.-255 /ZA MOD. CLC/
         MH    3,10(14)           ŠT.ELEM.*KORAK=DOLŽ.TABELE
         A     3,2(14)            +START=END ADRESA
         B     BISSSS01
*
BISSSS04 EQU   *
         MH    0,10(14)           2**N*KORAK
         LR    1,0                R0=OFFSET                      ***
         SH    1,10(14)           R1=2**N-1
         A     1,2(14)            +START= R1 =SREDINA TABELE     ***
         OC    BISSSS11+2(2),12(14) DISPLACEMENT                 ***
         L     2,6(14)            R2=ADRES.ARGUMENTA /ZA CLC/
*
BISSSS05 EQU   *
         SRA   0,1                R0/2
         CR    1,3                R1 PREKO END TABELE ?
         BNL   BISSSS06           DA, ZMANJŠAJ R1
         EX    4,BISSSS11         SKOK NA CLC                    ***
         BL    BISSSS07           POVE$AJ R1
         BE    BISSSS10           NAŠEL
*        BH    BISSSS06           ZMANJŠAJ R1
*
BISSSS06 EQU   *
         CH    0,10(14)           OFFSET:KORAK ŠE ZADOSTUJE ?
         BL    BISSSS08           NE, NI V TABELI
         SR    1,0                R1-R0=NOVA POLOVICA V TABELI
         B     BISSSS05
*
BISSSS07 EQU   *
         CH    0,10(14)           OFFSET:KORAK ŠE ZADOSTUJE ?
         BL    BISSSS09           NE, NI V TABELI
         AR    1,0                R1+R0=NOVA POLOVICA V TABELI
         B     BISSSS05
*
BISSSS08 EQU   *
         SH    1,10(14)           R1=PRVI MANJŠI ELEMENT TABELE
*
BISSSS09 EQU   *
         O     1,BISSSS13         REG.1 NA NEGATIVNO VREDNOST
*
BISSSS10 EQU   *
         LR    3,1                ADRESA ELEM.V TABELI
         S     3,2(14)            -START=ZAP.ŠTEV.*KORAK-1
         SR    2,2                R2=0
         LH    4,10(14)           VELIKOST KORAKA V R4
         DR    2,4                R3=ZAP.ŠTEV.ELEMENTA-1
         LA    0,1(3)             R0=ZAPOREDNA ŠTEVILKA ELEMNTA
         MVC   BISSSS11+2(2),=X'1000' DISPLACEMENT NAZAJ NA 0
         LM    2,4,BISSSS12       RESTORE REGISTROV
         B     18(14)             RETURN IZ MODULA
*
*        D A T A
*
BISSSS11 EQU   *
         CLC   0(0,1),0(2)        PRIMERJAVA TABELE Z ARGUMENTOM
*
BISSSS12 DS    3F                 SAVE AREA ZA REGISTRE
BISSSS13 DC    X'80000000'        INDIKATOR NI V TABELI
*
         LTORG
*
 BKEND

/+

Programski jeziki in programiranje


Večina programov za plačilni promet je bila napisana v asembler (assembly) programskem jeziku. Več o tem piše tukaj  in tukaj.

Groba delitev funkcij plačilnega prometa je

1.    vzdrževanje baz podatkov
2.    kontrolni program
3.    obdelava.

Prvi dve skupini sta bila napisani izključno z uporabo asembler jezika, tretja pa tudi z uporabo PL/I. Več o PL/I piše tukaj.  

Zakaj asembler?


Omejite je bila glavni spomin 96 KB ali 96.000 bajtov. Ta spomin je bil razdeljen takole:












Več o POWER piše tukaj.


Glavni program plačilnega prometa je bil kontrolni program. Izvajal se je v particiji BG z omejitvijo velikosti na 26 KB ali 26.000 bajtov. V teh 26 KB je bilo »stlačeno« vse: programska koda, delovna področja, buferji za datoteke pa še kaj.

Zapisani vrstni red particij je pomenil prioriteto izvajanja. Supervisor, kot nadzornik vseh dogajanj v računalniku je dodeljeval potrebne resurse. Particija BG je imela najnižjo prioriteto, kar pomeni, da je bilo F2 dodeljeno več procesorskih ciklov za izvajanje, F1 oziroma POWER pa je kot supervisorjev »pomočnik« dobil več ciklov kot preostale particije.

Asembler kot orodje za programiranje je imel tudi prednost v končni velikosti programa: bil je točno tako velik kot je zapisal programer. Dodatna prednost je bila tudi možnost pisanja določenih ponavljajočih se rutin ali postopkov s pomočjo MACRO ukazov in uporabo zunanjih EXTERN programov.

Primer je BIIS (BInarno ISkanje) rutina za iskanje podatkov po tabeli, ki je v spominu. Iskanje se izvede na »binarni« način ob pogoju, da so podatki razvrščeni v naraščajočem vrstnem redu. Enostavno povedano BISS primerja podatek na sredini z zahtevanim. Če je iskanec manjši od sredine, se iskanje in primerjava nadaljuje po spodnji polovici tabele. Sledi primerjava in če je iskanec manjši, se iskanje in primerja nadaljuje po spodnji polovici tabele. Obratno velja: če je iskanec večji, potem se nadaljuje po zgornji polovici tabele. Maksimalno število primerjav in razpolavljanj tabele je enaka ali manjša velikosti tabele oziroma elementov v tabeli, to je prvemu večjemu podatku 2n. Za lažje razumevanje: tabela vsebuje 200 podatkov, prva večja potenca števila 2 je 8 oziroma 256, kar pomeni, da vsak podatek v tabeli najdemo po največ 8 primerjavah.

BIIS-MACRO je v izvornem (source) programu generiral ustrezno programsko kodo (začetek tabele, dolžino podatka za iskanje, dolžino posameznega elementa v tabeli, konec tabele oziroma število elementov tabele) ter pokliče ali »zahteva izvajanje« zunanjega (EXTERN) podprograma BISSSSSS, ki dejansko izvede iskanje. BIIS-MACRO koda je lahko bila uporabljena v programu večkrat, vsaka je zasedala 20 bajtov, EXTERN BISSSSSS pa je bil le en sam in je zasedal okoli 180 bajtov.

Le za predstavo kako je delal BIIS, naj služijo spodnji podatki:




Tabela ima 19 elementov in zato je 25 ali 32 oziroma vsako vrednost najdemo v največ 5 korakih. Iščemo »AA«, polovica od tabele je 9, v našem primeru je to vrednost »KP«.



»AA« je manjše od »KP« (prva primerjava) zato iščemo po spodnji polovici. Polovica je 4, v našem primeru je vrednost »BG«.



»AA« je manjše od »BG« (druga primerjava) zato iščemo po spodnji polovici. Polovica je 2, v našem primeru je vrednost »AA«.




»AA« je enako »AA« v tabeli (tretja primerjava), zato je konec iskanja.

Podobnih MACRO ukazov je bilo v SDK izdelano veliko: SORT je sortiral tabelo, INSERT je vrinil podatek na ustrezno mesto v tabeli, CONSO je pisal sporočila operaterju na sistemski konzoli, …

Vse te rutine in makroji so bili izdelani tako, da je bila njihova uporaba možna tudi v drugih programskih jezikih.


SDK MACROS - BIIS


V nadaljevanju je originalna BIIS rutina kot "macro", ki se uporabi v običajnem asembler programu. Vsi ukazi, ki vsebujejo "&" so macro ukazi. Nekaj jih služi za kontrolo pravilnosti podanih parametrov, nekaj pa se jih "zamenja" z vrednostmi, ki so zapisane v programski kodi samega programa.


CATALOG BIIS.A                        REPLACE=YES

*  SDK MACROS - BIIS - LJUBLJANA - 1.0
         CNOP  0,4
&IME     L     15,=V(BISSSSSS) .       EXTRN MODUL ZA BIN.ISKANJE
         BALR  14,15
         DC    H'&A'              DOLŽINA ARGUMENTA
         AIF   (T'&IME EQ 'O').HOP1
&IME.B   DC    A(&START)          ADRESA ZAČETKA TABELE
&IME.A   DC    A(&ARGUM)          ADRESA ARGUMENTA
         DC    H'&B'              VELIKOST KORAKA
         DC    H'&C'   POLOŽAJ ARGUMENTA V ELEMENTU TABELE
&IME.E   DC    A(&END)            ADRESA KONCA TABELE
         AGO   .HOP2
.HOP1    ANOP
         DC    A(&START)          ADRESA ZAČETKA TABELE
         DC    A(&ARGUM)          ADRESA ARGUMENTA
         DC    H'&B'              VELIKOST KORAKA
         DC    H'&C'         POLOŽAJ ARGUMENTA V ELEMENTU TABELE
         DC    A(&END)            ADRESA KONCA TABELE
.HOP2    ANOP
         SPACE
         AGO   .END
.M9      ANOP
      MNOTE *,'DOLŽINA KORAKA MANJŠA OD DOLŽINE ARGUMENTA + POLOŽAJA'
         AGO   .MEX
.M10     ANOP
&A       SETA  &A+255
         SPACE
*  SDK MACROS - BIIS - LJUBLJANA - 1.0
         CNOP  0,4
&IME     L     15,=V(BISSSSSS) .       EXTRN MODUL ZA BIN.ISKANJE
         BALR  14,15
         DC    H'&A'              DOLŽINA ARGUMENTA +255
         AIF   (T'&IME EQ 'O').HOP3
&IME.B   DC    A(&START)          ADRESA ZAČETKA TABELE
&IME.A   DC    A(&ARGUM)          ADRESA ARGUMENTA
         DC    H'&B'              VELIKOST KORAKA
         DC    H'&C'   POLOŽAJ ARGUMENTA V ELEMENTU TABELE
&IME.E   DC    A(&END)            ADRESA KONCA TABELE
         AGO   .HOP4
.HOP3    ANOP
         DC    A(&START)          ADRESA ZAČETKA TABELE
         DC    A(&ARGUM)          ADRESA ARGUMENTA
         DC    H'&B'              VELIKOST KORAKA
         DC    H'&C'         POLOŽAJ ARGUMENTA V ELEMENTU TABELE
         DC    F'&END'            ŠTEVILO ELEMENTOV TABELE
.HOP4    ANOP
         SPACE
         AGO   .END
.MEX     ANOP
         MNOTE 9,'MACRO NI GENERIRAN'
         MEXIT
.END     ANOP
         MEND
   BKEND
/+