; Assembly főprogram, amely adott szöveget ír a képernyőre ; ================================================= KOD SEGMENT PARA PUBLIC 'CODE' ; Szegmens kezdet ; KOD: a szegmens neve ; align-type (igazítás típusa): BYTE, WORD, PARA, PAGE <- PARA - paragrafushatáron kezdődjön ; BYTE Next available byte address. ; WORD Next available word address (2 bytes per word). ; PARA Next available paragraph address (16 bytes per paragraph). ; PAGE Next available page address (256 bytes per page). ; combine-type: PUBLIC, COMMON, AT , STACK - The combine type controls the order that segments with the same name are written out to the object code file produced by the assembler ; Memory is a synonym for public provided for compatibility reasons; you should always use public rather than memory. ; Common and at are advanced combine types that won't be considered in this text. ; The stack combine type should be used with your stack segments. ; The public combine type should be used with most everything else. ; class: 'CODE', 'DATA', ('CONSTANT',) 'STACK', 'MEMORY' - szegmens "osztálya" (típusa) ; CODE - Code Segment ; DATA - Data Segment ; STACK - Stack Segment ; ajánlott értelemszerűen ASSUME CS:KOD, DS:ADAT, SS:VEREM, ES:NOTHING ; <-- mondjuk meg az assemblernek, ; hogy mely szegmensregiszter mely szegmensre mutat, ; ő eszerint generálja majd az offszetcímeket ; feltételezett szegmens regiszter értékek. ; A beállításról ez az utasítás nem gondoskodik! ; CS beállítása: 5. sor ; DS beállítása: 86. sor ; SS beállítása: 96. sor ; ES beállítása: nincs, nem használjuk ; ------------------------------------------------- MAIN PROC FAR ; A fő eljárás mindig FAR ; FAR: távoli, NEAR: közeli eljárás <-- A vezérlés átadás közeli, ha a ; programkód ugyanabban a szegmensben folytatódik tovább és távoli szegmens ; váltás esetén. Közeli vezérlésátadás esetén a 16 bites operandus lesz ; az IP új tartalma, távoli vezérlésátadásnál pedig az IP és a CS tartalma is ; megváltozik. Ilyen vezérlás lehet például az eljáráshívás. ; Az operációs rendszer úgy hívja meg a főprogramokat, hogy ; a CS és IP a program végén lévő END utasításban megadott ; címke szegmens és OFFSET címét tartalmazza, SS és SP a ; a STACK kombinációs típusú szegmens végét mutatja, ; a visszatérés szegmens címe DS-ben van, OFFSET-je pedig 0 PUSH DS ; DS-ben van a visszatérési cím ; SEGMENT része XOR AX, AX ; AX?0, az OFFSET rész = 0 ; <-- AX lenullázása PUSH AX ; Veremben a (FAR) visszatérési cím MOV AX, ADAT ; AX<= az ADAT SEGMENT címe MOV DS, AX ; <-- A feltételezésnek tegyünk is eleget, ne vágjuk át szegény assembler bácsit ; azaz mivel az DataSegment címe az AX-ben van, ezért ezt adjuk át a DataSegment-nek (DS) ; Most már teljesül, amit az ASSUME utasításban írtunk ; Eddig tartott a főprogram előkészületi része ; !!! ; * ; * * ; * * * ; * * * * ; * * * * * Számítást végző kódrész (őt fogjuk majd jelentős részt kódolásra használni) ; * * * * ; * * * ; * * ; * ; !!! RET ; Visszatérés az op. rendszerhez (RETurn) ; a veremből visszaolvasott ; szegmens és OFFSET címre ; Röviden: minden PROC-t RET-tel zárunk, egyfajta függvény vérehajtás utáni visszatérés MAIN ENDP ; A MAIN (fő)eljárás vége KOD ENDS ; A KOD szegmens vége ; ================================================= ;Adat segmens, melyet a 13. sorban adtunk meg ADAT SEGMENT PARA PUBLIC 'DATA' ; felhasznált adatterületek megadása ; - Mint látható jelenleg nincsenek adatok (pl. változók) az adatszegmensben ADAT ENDS ; Az ADAT szegmens vége ; ================================================= ; Verem szegmens, melyet a 13. sorban adtunk meg VEREM SEGMENT PARA STACK DW 100 DUP (?) ; Helyfoglalás 100 db ; inicializálatlan szó számára ; DW helyett lehet DB - értelemszerűen akkor bájtokat foglalunk ; DW vagy DB utáni szám mondja meg, hogy hány szavat/bájtot foglaljunk ; a zárójelben megtudjuk adni, hogy minek fogalaljunk helyet; jelenleg a ? jelenti azt, hogy inicializálatlan VEREM ENDS ; A VEREM szegmens vége ; ================================================= END MAIN ; Modul vége, ; a program kezdőcíme: MAIN