Turbo Assembler A Turbo Assembler egy nagyon j¢ ford¡t¢program, a PC-n megjelent assemblerek k”z”tt igen el“kel“ helyet foglal el. Rem‚ljk, kis ismertet“nk seg¡ts‚get ny£jt abban, hogy a ford¡t¢program lehet“s‚geit min‚l jobban kihaszn lj k. Param‚terez‚se TASM [opci¢k] forras.ASM [,object.OBJ] [,lista.LST] [,xref.XRF] TASM @parancsfile (A fenti kiterjeszt‚sek az alap‚rtelmez‚st mutatj k, ha nincs kiterjeszt‚s, akkor ezt t‚telezi fel a TASM. Term‚szetesen b rhov  b rmilyen kiterjeszt‚st megadhatunk.) Opci¢k: /a: A szegmenseket ABC-sorrendben rendezi el a file-ban /s: A szegmenseket els“ el“fordul suk szerint rendezi el (alap) /c: A lista-file-ban legyen keresztreferencia is /dSYM[=VAL]: Konstans kuls“ defin¡ci¢ja. Ha nincsen VAL megadva, akkor 0-t ad ‚rt‚kl /e: Beford¡tja a koprocesszor-emul ci¢t. Kell hozz  a megfelel“ LIB-file, amiben a szks‚ges rutinok vannak. /r: A koprocesszor-utas¡t sokat ford¡tja be (alap) /h, /?: Help /iPAT: A PATH-ban keresi az include-file-okat /jCMD: Egy ford¡tasi direkt¡v t ad meg a TASM-nak. Pl. /jIDEAL /kh#: A forr sban el“fordul¢ szimb¢lumok maxim lis sz ma. (alap)=8192, itt maximum 32768-at adhatunk meg. /l: A lista-file csak az alapinform ci¢t tartalmazza (alap) /la: B“vebb lista-file /ml: Kis- ‚s nagybet–k megkl”nb”ztet‚se minden szimb¢lumn l /mx: Csak a glob lis szimb¢lumokn l /mu: A kis- ‚s a nagybet–k nincsenek megkl”nb”ztetve (alap) /mv#: A szimb¢lumok maxim lis m‚rete /m#: Enged‚lyezi a #-menetes ford¡tast. Ha ez minimum 2 (/m2), akkor hivatkozhatunk szimb¢lumokra a defini l suk el“tt is. /n: A szimb¢lumok nem lesznek benne a lista-file-ban /os: Az object-file form tuma a szok sos /o: Az object-file a szok sos overlay-jel (alap) /op: Az object-file PharLap-rendszer– /oi: Az object-file IBM-szerinti /p: Ellen“rzi, hogy van-e a k¢dban CS: prefix (v‚dett m¢dban General Protection Fault-ok megjelen‚s‚hez vezet ¡r si k¡s‚rletn‚l) /q: A linkel‚shez nem szks‚ges dolgok nem lesznek benne az object-file-ban /t: Csak a hibazeneteket ¡rja ki (ha vannak) /u#: A TASM verzi¢sz m t  ll¡tja  t. /w0: Nem lesznek figyelmeztet‚sek (warning) /w1: Lesznek figyelmeztet‚sek (alap) /w2: Sok-sok figyelmeztet‚s lesz /w-xxx: Letiltja az xxx sz m£ figyelmeztet‚st /w+xxx: Enged‚lyezi az xxx sz m£ figyelmeztet‚st /x: Felt‚teles ford¡t s eset‚n a list ba beleveszi a be nem ford¡tott r‚szeket is /z: Hiba eset‚n a hib s sort is ki¡rja /zi: Debug info: r‚szletes /zd: Debug info: csak a sorsz mokat /zn: Debug info: semmi (alap) A parancsfile egy k”z”ns‚ges sz”vegfile, amiben el“re megadhatjuk a parancssor egy r‚sz‚t vagy ak r az eg‚sz‚t is. A leggyakrabban haszn lt param‚terez‚sek: Debuggol shoz: TASM /zi /la /m2 forr s-file Egy‚bk‚nt: TASM /m2 forr s-file A TASM k‚t ford¡t si m¢dot ismer: a Macro Assemblerrel fellr“l kompatibilis MASM m¢dot, ‚s kicsit m s jel”l‚sm¢dot haszn l¢ Ideal Mode-ot. Az al bbiak a MASM m¢dra vonatkoznak, az Ideal Mode elt‚r‚sei ‚s £j lehet“s‚gei pedig k‚s“bb lesznek ismertetve. A TASM haszn lat hoz nem  rt, ha nagy vonalakban tiszt ban vagyunk azzal, hogy hogyan is zajlik a programunk ford¡t sa. A ford¡t¢ azzal kezdi, hogy v‚gigrohan a forr son, ‚s megjegyez minden defini lt c¡mk‚t ‚s v ltoz¢t. Egymenetes ford¡t s eset‚n ek”zben n‚zi a hivatkoz sokat is, ‚s ha olyat tal l, ami nem volt defini lva addig, akkor hibazenetet ad. T”bbmenetes ford¡t sn l viszont el“sz”r v‚gign‚zi az eg‚sz forr st a defin¡ci¢k ut n, ‚s csak azut n folytatja a hivatkoz sokkal, ¡gy hivatkozhatunk olyan szimb¢lumokra is, amelyeket k‚s“bb defini lunk. (Az alap‚rtelmez‚s az egymenetes,  tkapcsolni pl. a /m2-vel lehet.) Miut n a szimb¢lumokat ‚s hivatkoz saikat ellen“rizte, ellen“rzi a t¡pusok egyez‚s‚t is (pl. nincs-e v‚letlenl mov ax,bl a forr sban), majd ellen“rzi, hogy a programunk a nyelv szab lyainak eleget tesz-e. Ha szks‚ges, hibazenetet vagy figyelmeztet‚st ad, ha pedig minden rendben volt (figyelmeztet‚s eset‚n mindent rendbenlev“nek tekint), akkor l‚trehoz h rom file-t: - Object-file: a tulajdonk‚ppeni k¢d ebben van, csak mellette van m‚g egy halom egy‚b inform ci¢ is, amelyek egyr‚szt a linkernek sz¢lnak (szegmensek elhelyez‚se, kezd“c¡m, verem kezd“c¡me, stb.), m sr‚szt pedig lehet“v‚ teszik, hogy t”bb ilyen object-modult ”sszelinkeljnk £gy, hogy egyik modul hivatkozhasson a m sik v ltoz¢ira, elj r saira. Ilyenkor a nyilv nos v ltoz¢k, elj r sok nevei is benne lesznek az object-file-ban. - Lista-file: ez tulajdonk‚ppen egy mem¢riak‚p, ¡gy fog a programunk kin‚zni bet”ltes ut n. Ebben a file-ban a makr¢k m r kifejtve szerepelnek. Itt h rom oszlopban vannak az adatok: c¡m, hexa k¢d, forr sk¢d - Keresztreferencia: Ebb“l a file-b¢l a TCREF.EXE el“ tud  ll¡tani egy list t, amelyben rutinjaink ‚s v ltoz¢ink szerepelnek, meg azok a sorok, ahonnan hivatkoznak r juk. Ezek k”zl a tov bbiakban csak az object-file-okra lesz szks‚gnk, amikb“l a linker fog futtathat¢ file-t el“ ll¡tani. A forr sprogram nem csak az assembly nyelv utas¡t saib¢l  ll, hanem vannak benne olyan kulcsszavak (direkt¡v k), amelyek a ford¡t¢nak adnak inform ci¢kat a programunk kezel‚s‚r“l. Ezekkel adhatjuk meg, hogy milyen processzor utas¡t sk‚szlet‚t haszn lja, ezekkel defini lhatunk kl”nf‚le v ltoz¢kat, c¡mk‚ket ‚s szegmenseket, ezekkel k‚sz¡thetnk makr¢kat ‚s ezekkel tehetjk a beford¡tand¢ k¢dot kl”nb”z“ felt‚telekt“l fgg“v‚. Hogy a ford¡t¢ az  ltalunk defini lt szimb¢lumokat (c¡mk‚k, v ltoz¢k, konstansok, rutinok, stb.) meg tudja kl”nb”ztetni a numerikus ‚rt‚kekt“l ‚s az assembly utat¡t sokt¢l, szimb¢lumainknak bizonyos formai k”vetelm‚nyeknek kell eleget tennik. Nem kezd“dhetnek sz mjeggyel ‚s nem tartalmazhatnak olyan karaktereket, amelyet a TASM a szimb¢lumok k”z”tt ‚rtelmezett m–veletek jel”l‚s‚re haszn l. Maradnak teh t a bet–k, a sz mok ‚s a k”vetkez“ karakterek: $ % & @ ? _ A TASM direkt¡v i: A TASM egyik nagy el“nye, hogy ismeri az £jabb processzorok (386+) utas¡t sk‚szlet‚t is, azonban (nem tudni mi‚rt) alapert‚lmez‚sben minden ron 8086-as k¢dot akarna gener lni. K‚sz szerencse, hogy m r az elej‚n  t lehet ezt kapcsolni valami ‚sszer–bbre... Ezt a c‚lt szolg lj k a processzorkijel”l“ direkt¡v k : P8086 8086 utas¡t sok .8086 8086,8087 utas¡t sok Az al bbi t bl zatban xxx = [286|386|486] ‚s xxy = [287|387|387] - Pxxx: Az xxx processzor ”sszes utas¡t sa - PxxxN (vagy .xxxC): Csak a val¢s m¢d£ utas¡t sok - PxxxP: Enged‚lyezi a v‚dett m¢d£ utas¡t sokat - .xxx: A val¢s m¢d£ utas¡t sok ‚s a koprocesszor utas¡t sai - .xxxP: Az ”sszes utas¡t s ‚s a koprocesszor utas¡t sai - Pxxy (vagy .xxy): Az xxy koprocesszor utas¡t sai Vigy zzunk, hogy ha 386-oson enged‚lyezzk a v‚dett m¢d£ utas¡t sk‚szletet, akkor a szegmensek automatikusan 32 bites m¢dban lesznek c¡mezve, ‚s neknk kell (ha szks‚ges) vissza ll¡tani ezt a USE16-tal (l sd k‚s“bb). Az adatdefini l¢ direkt¡v k: Az alap adatt¡pusok ‚s a hozz juk tartoz¢ hosszok byte-ban: BYTE (1), WORD (2), DWORD (4), FWORD (6), QWORD (8), TBYTE (10) Ezek deklar l sa rendre DB, DW, DD, DF, DQ, DT. Pl. bytevaltozo db 12 duplaszo dd 12345678h nemtudommi dw ? quadword dq 123456789abcdef0h extended_v dt ? A k‚rd“jel azt mondja meg az assemblernek, hogy nem sz m¡t, hogy mi van az adott helyen, a v ltoz¢ lehet hat rozatlan kezd“‚rt‚k– is. Ilyet lehet haszn lni pl. m r l‚tez“ adatokra (BIOS adatterlet, interruptt bla, stb.) val¢ r defini l skor, vagy akkor, ha nem akarjuk, hogy a v ltoz¢ink a futtathat¢ file-ban is helyet foglaljanak. A BYTE, WORD ‚s DWORD adatt¡pus a leggyakoribb, mert a processzor regiszterei is ilyen m‚ret–ek, az FWORD-”t  ltal ban csak a 32 bites v‚dett m¢dban, a TBYTE-ot pedig lebeg“pontos sz mok t rol s ra haszn lj k. T”mb”knek k‚nyelmesen foglalhatunk helyet a DUP direkt¡v val: dszotomb dd 500h dup (0) nagy_tomb dw 100h dup (10h dup (1),2) tt a dszotomb 5120 byte-nyi 0-t fog tartalmazni, a nagy_tomb pedig ¡gy fog kin‚zni: (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, ugyanez m‚g 255-sz”r) VIGYZAT ! A "mov eax,dszotomb[100]" NEM a dszotomb 100. elem‚t teszi EAX-be, hanem a (100+offset dszotomb) c¡men kezd“d“ duplasz¢t! (A fentivel ekvivalens k¢dot is gener l a mov ax,[100+offset dszotomb] utas¡t s.) Tanuls g: az indexet nem  rt felszorozni a t”mb elemeinek m‚ret‚vel, vagy pedig 386-on vagy ann l £jabb processzoron haszn lni a sk l z st (pl. mov eax,szotomb[ebx*4]). A t”mb egy elem‚nek a hossz t egy‚bk‚nt a TYPE, m¡g a t”mb elemeinek sz m t a LENGTH oper tor adja meg. Pl. a fenti p‚ld ban : TYPE nagy_tomb = TYPE WORD = 2 LENGTH nagy_tomb = 100h A TASM m‚g kisz mol neknk egy teljes hosszot is SIZE n‚ven, de ez az ilyen t”bbsz”r”sen be gyazott t”mb”kn‚l hib s, ugyanis ezt a SIZE = LENGTH * TYPE k‚plettel sz molja, teh t ebben az esetben SIZE nagy_tomb = 200h a TASM szerint, m¡g a val¢s gban pedig 2200h. Ha egy v ltoz¢t m s t¡pus£k‚nt akarunk kezelni, akkor a TASM t¡pusfellb¡r l¢ direkt¡v j t kell haszn lnunk, a PTR-t. Haszn latakor a v ltoz¢ neve el‚ ¡rjuk be az £j t¡pust, majd a PTR-t. Pl. mov ax,WORD PTR dszotomb A TASM lehet“v‚ teszi sz munkra az adatok magasabb szint– kezel‚s‚t is. A magasszint– nyelvekb“l megismert rekord t¡pus itt is l‚tezik. Form ja: rekordn‚v STRUC mez“1 t¡pus alap‚rt‚k mez“2 t¡pus alap‚rt‚k stb. rekordn‚v ENDS P‚ld ul: szemely STRUC nev db 30 dup (' ') kor db 23 lotto db 1,2,3,4,5 szemely ENDS Az itt megadott alap‚rt‚kek arra az esetre vonatkoznak, amikor a rekord p‚ld nyai nem adnak meg kezd“‚rt‚ket: KP szemely <"Kis P l", 44, 58, 95, 1, 2, 5) uj szemely valaki szemely <,,45, 65, 11, 8, 23> A "KP" rekordban a n‚v "Kis P l", a kor 44, a lott¢sz mok pedig 58, 95, 1, 2, 5. Az "uj" rekordban minden az alap‚rt‚k, a "valaki"-ben pedig a n‚v ‚s a kor az alap‚rt‚k, a lott¢sz mok viszont a megadott sz mok. Lehet“s‚g van olyan strukt£ra l‚trehoz s ra is, amelynek az elemei ugyanazt a helyet foglalj k el,  tlapolva egym st. Ennek defini l sa megegyezik a rekord‚val, csak a STRUC kulcssz¢ helyett a UNION-t kell haszn lnunk. A keletkez“ strukt£ra m‚rete a benne szerepl“ legnagyobb elem m‚rete lesz. Az ilyen t¡pus£ strukt£r k p‚ld nyainak l‚trehoz s n l viszont csak az egyik mez“nek adhatunk konkr‚t ‚rt‚ket: atlapolo UNION szo dw ? dszo dd ? ENDS a1 atlapolo<12,65> ; Rossz ! a1 atlapolo<12,?> ; J¢ a1 atlapolo ; J¢ A szegmens-direkt¡v k: Programjainkat a DOS ‚s a val¢s m¢d  ld sos hagyom nyai miatt szegmensekre kell tagolnunk, ha nagyobbak, mint 64K, ennek megval¢s¡t s hoz pedig ismernnk kell a TASM szegmens-kezel‚s‚t is. Egy szegmens defin¡ci¢jakor a k”vetkez“ket kell megadnunk: szegmens_neve SEGMENT illeszt‚s megoszt s c¡mz‚sm¢d oszt ly A_Szegmens_Tartalma szegmens_neve ENDS A szegmens neve tetsz“leges szab lyos, m‚g nem haszn lt szimb¢lumn‚v lehet, az attrib£tumai pedig a szegmens kezel‚s‚re ‚s elhelyez‚s‚re vonatkoz¢ inform ci¢kat adj k meg. Az attrib£tumok sorrendje tetsz“leges lehet. Az illeszt‚s azt adja meg, hogy a ford¡t¢ hogyan igaz¡tsa NOP-okkal a szegmenst a mem¢ri ban. Ez t”rt‚nhet byte-, sz¢-, duplasz¢- paragrafus- vagy laphat rra (1 lap = 256 byte) (BYTE,WORD,DWORD,PARA,PAGE). (alap)= BYTE A megoszt s a k”vetkez“ ‚rt‚keket veheti fel: PUBLIC: Ezzel azt ‚rhetjk el, hogy ha van t”bb szegmensnk, aminek ugyanez a neve, akkor ezen a szegmensek tartalmai egym s ut n lesznek f–zve, ‚s egyetlen, nagyobb szegmenst alkotnak. STACK: A teljes futtathat¢ file veremszegmens‚t jel”li ki. AT cim: A szegmenst a TASM az adott kezd“c¡m–nek t‚telezi fel. COMMON: Azt ‚rhetjuk el vele, hogy az ”sszes ilyen nev– szegmens tartalma egym sra lapol¢dik. A szegmens m‚rete a legnagyobb, ugyanolyan m‚ret– szegmens m‚ret‚re  ll be. A c¡mz‚sm¢d azt mondja meg, hogy a szegmensen belli k¢d ‚s adat 16 vagy 32 bites cimz‚sm¢ddal ‚rhet“ el (386+). K‚t attrib£tum tartozik ide: USE16 (alap, kiv‚ve ha a teljes 386-os utas¡t sk‚szlet elged‚lyezve van) ‚s USE32. A USE32 csak v‚dett ill. realflat m¢dokn l ‚rdekes, val¢s m¢dban a szegmenseknek k”telez“en 16 bites c¡mz‚s–eknek kell lennik. Az oszt ly arra haszn lhat¢, hogy az azonos oszt lyba tartoz¢ szegmensek fizikailag egym s ut n lesznek elhelyezve. P‚ld k : Byte-hat rra illesztett nyilv nos szegmens: a_seg segment public byte Paragrafushat rra illesztett nem nyilv nos veremszegmens: s_seg segment para stack 32 bites szegmens sz¢hat rra illesztve: s32 segment word use32 T”bb szegmenst ”ssze is vonhatunk egy csoportba a GROUP kulcssz¢ seg¡ts‚g‚vel. Ennek form ja: csoportn‚v GROUP sz1,sz2,... Ennek hat s ra a TASM a felsorolt szegmensekben (sz1, sz2) l‚v“ v ltoz¢kat ‚s rutinokat a legels“ szegmens c¡m‚vel fogja indexelni, a csoport nev‚t pedig a szegmensn‚vvel azonos m¢don kezelhetjk. Ennek a direkt¡v nak seg¡ts‚g‚vel egy szegmensk‚nt kezelhetnk k‚t kl”n ll¢ adatszerkezetet. P‚ld ul ha a programunkban vannak kezd“‚rt‚kkel rendelkez“ adatok a KONSTANS nev– szegmensben, k¢d a KOD nev–ben, el“re nem defini lt adatok az ADAT-ban, ‚s szeretn‚nk a k‚tf‚le adatot egy szegmensben c¡mezni, de a szegmenseink sorrendje KONSTANS, KOD, ADAT, akkor a KOZOS_ADAT GROUP KONSTANS, ADAT utas¡t ssal egy KOZOS_ADAT nev– csoportba foghatjuk “ket ”ssze. Ez nem v ltoztat a szegmensek sorrnedj‚n, csak a v ltoz¢k c¡m‚nek kisz m¡t s t befoly solja. A csoportok haszn lat ra  ltal ban nincs szks‚g, mert a szegmensek sorrendj‚nek ‚sszer– megad s val (itt pl. KOD, KONSTANS, ADAT) a probl‚ma megszntethet“, viszont egyes magasszint– nyelveknek szok suk csoportba ”sszevonni az adat- ‚s a veremszegmenst, £gyhogy az ezekhez illesztend“ rutinoknak esetleg erre is sz m¡taniuk kell. Vigy zzunk, mert ha nem Ideal Mode-ban vagyunk, akkor az OFFSET VALT kifejez‚s a VALT v ltoz¢nak a szegmens‚ben vett offszetc¡m‚t adja vissza, ‚s nem pedig a csoportban vett offszetet. Az Ideal Mode-ban viszont m r korrekt m¢don a csoportban vett offszetet adja vissza. Egy szegmens vagy egy csoport c¡m‚re egyszer–en a nev‚vel hivatkozhatunk, a n‚vre azok a szab lyok ‚rv‚nyesek, mint az immediate ‚rt‚kekre, teh t pl. szerepelhet aritmetikai kifejez‚sben, de nem lehet szegmensregiszternek k”zvetlenl ‚rt‚kl adni. A szegmensekhez kapcsol¢d¢ m sik fontosabb direkt¡va az ASSUME. Ez arra utas¡tja a ford¡t¢t, hogy t‚telezze fel, hogy valamely szegmensregiszter valamely szegmensre mutat. Ez ”nmag ban NEM  ll¡tja  t a szegmensregisztert, ezt neknk kell megtennnk. Ezut n viszont a ford¡t¢ a megadott szegmensben lev“ adatot a megadott szegmensregiszterrel fogja el‚rni, illetve ha ugyanahhoz a szegmenshez t”bb szegmensregisztert is hozz rendeltnk, ‚s az utas¡t s alap‚rtelmez‚s– szegmense is ezek k”z”tt van, akkor azzal. A szegmensn‚v helyett ¡rt NOTHING kulcssz¢val utas¡thatjuk az assemblert, hogy az adott szegmensregisztert egy ltal n ne haszn lja. Pl. : kod SEGMENT para public use16 ASSUME cs:kod, ds:nothing, es:adat mov ax,adat mov es,ax mov ax,szo_adat mov sz_kod,ax ASSUME ds:kod mov sz_kod,ax org 100h szo_kod dw ? kod ENDS adat SEGMENT byte use16 bigyo db 2000h dup ("IZE ") org 500h szo_adat dw ? adat ENDS Ebben az esetben a "kod" tartalma a k”vetkez“k‚ppen fog kin‚zni: mov ax,???? ; Nem lehet el“re tudni. mov es,ax mov ax,es:[500h] mov cs:[100h],ax mov [100h],ax ; Itt m r haszn lja a DS-t Figyeljk meg, hogy lehet, hogy a DS valahov  m shov  mutat, viszont az utols¢ mov-nal a TASM m‚gis azt haszn lja, mert az "ASSUME DS"-sel azt mondtuk neki ! A k¢delhelyez‚shez kapcsol¢d¢ k‚t m sik direkt¡va a szegmensen belli elhelyez‚ssel foglalkozik. Ezek az ORG ‚s a $. Az ORG a ford¡t¢ bels“ c¡msz ml l¢j t  ll¡tja be, a $ pedig k‚rdezi le. Pl. a fenti peld ban a szo_adat az (adat:500h) c¡men lev“ sz¢t jelenti, legyen azon a helyen b rmi. Egy v ltoz¢ vagy rutin c¡m‚nek lek‚rdez‚s‚re szolg l¢ k‚t kulcssz¢ a SEG ‚s az OFFSET. Az els“ a szegmens-, a m sik pedig a szegmensen belli offszet‚rt‚ket adja meg. Pl. a fenti p‚ld ban SEG szo_adat = adat, OFFSET szo_adat = 500h A k¢dszegmensbeli ORG-nak a .COM file-okn l nagy a jelent“s‚ge, mert azokat a DOS egyszer–en bet”lti 100h-ra ‚s elind¡tja, igy a k¢dbeli hivatkoz soknak olyannak kell lennik, mintha a program el“tt ott lenne m‚g 100h byte, ami a file-ban viszont nincs ott (a mem¢ri ban a PSP fog odakerlni). Ez‚rt kell egy .COM file-nak kb. ¡gy kin‚znie: kod segment assume cs:kod,ds:kod org 100h begin: mov ah,4ch ; vissza a DOS-hoz int 21h kod ends end begin (Ez egy‚bk‚nt ¡gy m r leford¡that¢ ‚s m–k”dik is !) C¡mke- ‚s rutin-direkt¡v k: Az adatokhoz hasonl¢an defini lhatunk c¡mk‚ket is a programunkon bell : cimke LABEL t¡pus Itt a t¡pus h rom ‚rt‚ket vehet fel: NEAR Erre a c¡mk‚re az “t tartalmaz¢ szegmensb“l b rhonnan ugorhatunk FAR Erre a c¡mk‚re m s szegmensekb“l tudunk ugrani SHORT Az ilyen c¡mk‚re csak [-128..127] t vols gb¢l tudunk ugrani, viszont az ugr¢utas¡t s csak 2 byte-os lesz. C¡mk‚t defini lhatunk £gy is, hogy a c¡mke neve utan egy kett“spontot tesznk, pl.: ujc¡mke: mov ax,ax Ebben az esetben az erre ir nyul¢ ugr¢utas¡t sokn l a TASM el“sz”r megpr¢b lja a c¡mk‚t SHORT-k‚nt kezelni, ‚s ha nem megy, csak akkor ford¡t be NEAR ugr st. T”bbek k”z”tt ez‚rt ‚rdemes a NEAR vagy SHORT c¡mke helyett ezt a jel”l‚sm¢dot haszn lni. A FAR c¡mk‚ket viszont csak a LABEL FAR-ral lehet defini lni. A c¡mke t¡pus nak elt‚veszt‚s‚re utal a "Relative jump out of range by xxxx bytes" ‚s a "Near jump or call to different CS" hibazenet. A c¡mk‚k haszn lat ra egy p‚lda: egyik_seg SEGMENT ASSUME cs:egyik_seg kezd: jmp cimke_short ;tul messze van jmp cimke_near ; jo jmp cimke_kp ; jo db 200h dup (0) cimke_short LABEL short cimke_near LABEL near cimke_kp: jmp c2_near ; mas szegmensben van jmp c2_far ; jo egyik_seg ENDS masik_seg SEGMENT ASSUME cs:masik_seg c2_near: c2_far LABEL far ; ... Itt_fog_folytatodni ... masik_seg ENDS END kezd Programjainkat  ttekinthet“bb‚ tehetjk, ha rutinjainkat kl”n blokkokba tesszk: rutin_neve PROC t¡pus rutin_t”rzs ret rutin_neve ENDP A rutin neve lehet b rmilyen tetsz“leges, m‚g nem haszn lt azonos¡t¢, a t¡pus lehet NEAR vagy FAR, ami azt hat rozza meg, hogy a rutinunkra t”rten“ ugr s/rutinh¡v s ill. a rutinv‚gi JMP/RET k”zeli vagy t voli legyen-e. Ez ut¢bbiban rejlik a m sik, a fontosabbik ‚rv emellett az ¡r sm¢d mellett, ugyanis m sk‚pp ezt nem tudjuk megadni. Egy‚b direkt¡v k: Megjegyz‚seket a programunkba k‚tf‚lek‚ppen tehetnk.A pontosvessz“ f“leg a r”videbb megjegyz‚sekhez haszn lhat¢, itt megjegyz‚snek sz m¡t minden a pontosvessz“t“l az “t tartalmaz¢ sor v‚g‚ig. A m sik direkt¡v val, a COMMENT-tel t”bbsoros megjegyz‚seket is l‚trehozhatunk. Ennek hszn lata £gy t”rt‚nik, hogy a COMMENT kulcssz¢ ut n az els“ nem res karaktert“l megjegyz‚snek sz m¡t minden ugyanannak a karakternek a k”vetkez“ el“fordul s ig. P‚ld ul: COMMENT # Ez itt megjegyz‚s ! Ez is... ; 1234 # Ez m r nem. Ez sem ! Kl”n”sen hasznos direkt¡v k a makr¢-direkt¡v k, ezek kl”n kigy–jtve lesznek ismertetve k‚s“bb. File-ok ”ssze ll¡t sa t”bb modulb¢l: Az egyes modulokban az olyan szegmenseket, v ltoz¢kat, rutinokat nyilv nosnak (PUBLIC) kell defini lni, err“l szegmensek ‚s csoportok eset‚ben m r volt sz¢, v ltoz¢kn l, c¡mk‚kn‚l ‚s rutinokn l viszont £j sort kell besz£rni, ami a PUBLIC sz¢val kezd“dik ‚s ut na vannak felsorolva a nyilv nos szimb¢lumok: PUBLIC nyilv_cimke, nyilv_rutin, nyilv_valt, nyilv_rekord Ezek ut n abban a rutinban, ahol haszn lni szeretn‚nk a m s modulb‚li nyilv nos szimb¢lumokat, kls“ szimb¢lumnak kell defini lunk kell “ket az EXTRN kulcssz¢ seg¡ts‚g‚vel: EXTRN nyilv_cimke: NEAR, nyilv_rutin: PROC FAR, nyilv_valt: DWORD, nyilv_rekord: REK_TIPUS Ezek ut n mindent rendesen haszn lhatunk. Felt‚teles ford¡t s: Ha a k¢dunk egyes r‚szeit valamely felt‚telt“l szeretn‚nk fgg“v‚ tenni, mint p‚ld ul hogy tesztel‚sn‚l bizonyos rutinok m sk‚nt ford¡t¢djanak be, vagy olyan makr¢kat szeretn‚nk ¡rni, amelyek param‚terrel vagy an‚lkl is haszn lhat¢k, akkor a felt‚teles ford¡t si direkt¡v kra van szks‚gnk. Ezek a k”vetkez“k: IF felt‚tel-kifejez‚s k¢d, ami akkor fordul be, ha a felt‚tel-kifejez‚s nem 0 ELSE k¢d, ami egy‚bk‚nt befordul ENDIF Ennek ellent‚te az IFE direkt¡va, amely akkor ford¡tja be az ut na j”v“ k¢dot, ha a felt‚tele hamis (0). A felt‚tel-kifejez‚s  llhat a ford¡t skor ki‚rt‚kelhet“ szimb¢lumokb¢l (konstansok), m–veleti jelekb“l ‚s rel ci¢-oper torokb¢l. Ez ut¢bbiak a k”vetkez“k: a EQ b a = b a NE b a <> b a GE b a >= b a GT b a > b a LE b a <= b a LT b a < b Egy‚b felt‚teles direkt¡v k: IFDEF szimb¢lum: beford¡t, ha a szimb¢lum defini lva van IFNDEF szimb¢lum: beford¡t, ha a szimb¢lum nincs defini lva IFB kifejez‚s: beford¡t, ha a kifejez‚s res. IFNB kifejez‚s: beford¡t, ha a kifejez‚s nem res (Az ut¢bbi k‚t direkt¡v nak nagy szerepe van az olyan makr¢k ¡r s n l, amelyek h¡vhat¢k mind param‚terrel, mind an‚lkl.) IFDIF kifejez‚s, kifejez‚s: beford¡t, ha a k‚t kifejez‚s kl”nb”zik IFIDN kifejez‚s, kifejez‚s: beford¡t, ha a k‚t kifejez‚s egyezik IF1: beford¡t, ha a ford¡t s els“ menet‚ben vagyunk IF2: beford¡t, ha a ford¡t s m sodik menet‚ben vagyunk (Lajosnak: ide j”n el“sz”r a makr¢s r‚sz, azt n a TASM Ideal Mode-ja) Linkel‚s: A TASM-mal l‚trehozott .OBJ file-unkb¢l a TLINK seg¡ts‚g‚vel hozhatunk l‚tre futtathat¢ file-okat. A TLINK param‚terez‚se a k”vetkez“: TLINK [opci¢k] object-file-ok [, c‚lfile, map-file, rutink”nyvt rak] A rutink”nyvt raknak saj t form tumuk van, “ket a TLIB seg¡ts‚g‚vel lehet object-file-okb¢l el“ ll¡tani, de mivel ez el‚gg‚ ritk n haszn lt szolg ltat s, ez‚rt itt nem ismertetjk r‚szletesebben. A TASM-hoz hasonl¢an itt is adhatunk meg parancsfile-t, amit szint‚n a n‚v el‚ tett @ jel”l. Ha nem adunk meg c‚lfile-t vagy map-file-t, akkor az els“nek felsorolt object-file nev‚n hozza l‚tre “ket .MAP ‚s .EXE vagy .COM kiterjeszt‚ssel. A map-file c‚lja hasonl¡t a listafile-‚hoz, csak ez nem ad olyan r‚szletes inform ci¢t a programr¢l. Az opci¢k a k”vetkez“k: /m: A map-file tartalmazza a nyilv nos szimb¢lumokat /x: Nem keletkezik map-file /i: Inicializ lja a szegmenseket /l: Az .EXE fejl‚cbe be¡rja a forr sbeli sorsz mokat is /s: R‚szletesebb map-file a szegmensekr“l /n: Nem haszn lja az alap‚rtelmez‚s– rutink”nyvt rakat /d: Figyelmeztet, ha valamely szimb¢lum t”bbsz”r is el“fordul a rutink”nyvt rakban /c: A szimb¢lumokn l megkl”nb”zteti a kis- ‚s a nagybet–ket /3: Enged‚lyezi a 32 bites c¡mz‚sm¢dot /v: Az .EXE fejl‚cbe minden inform ci¢t be¡r a szimb¢lumokr¢l. Ezt haszn lja pl. a Turbo Debugger. /e: Hagyja figyelmen k¡vl a sz¢t r-b“v¡t‚seket (???) /t: Gener ljon .COM file-t .EXE helyett. Ennek felt‚tele, hogy csak egy szegmens legyen a file-ban, ‚s a bel‚p‚si pont 100h-n legyen. A leggyakrabban haszn lt param‚terez‚sek: .EXE file-hoz: TLINK /x/3 file-n‚v .COM file-hoz: TLINK /x/3/t file-n‚v .EXE file debuggol shoz: TLINK /x/3/l/v file-n‚v (Lajosnak: Itt k”vetkeznek a p‚ldaprogramok. A Fles zeni, hogy lehet“leg ne £gy legyen megcsin lva, mint az els“ cikk‚ben...) (Lajosnak: Ide a v‚g‚re j”nnek a hibazenetek) Ennyit tudtunk ”sszehordani a Turbo Assembler-r“l. Nagyon j¢ ford¡t¢program, a PC-n megjelent assemblerek k”z”tt igen el“kel“ helyet foglal el. Rem‚ljk, kis ismertet“nk seg¡ts‚get ny£jt abban, hogy a ford¡t¢program lehet“s‚geit min‚l jobban kihaszn lj tok. A makr¢k haszn lata Ha van olyan sz”veg- vagy k¢dr‚szlet, amelyet k‚s“bb sokszor fogunk haszn lni a programban, c‚lszer– makr¢ban defini lni. Ekkor csak a makr¢ra kell hivatkoznunk a j”v“ben, ‚s az ilyen hivatkoz sokkor a makr¢ tartalma ford¡t¢dik be a programba. A Turbo Assembler-ben a makr¢k enn‚l hat‚konyabbak a kl”nf‚le oper torok r‚v‚n. L ssuk: Sz”veges makr¢k Ez a legegyszer–bb fajta, a makr¢szimb¢lum csak egy karaktersorozatot helyettes¡t. Amikor a ford¡t¢ egy ilyen szimb¢lumhoz ‚r, egyszer–en behelyettes¡ti a makr¢ban megadott sz”vegre. Defini l sa: EQU Egy p‚lda: tx1 EQU <'This is a text macro'> ; defin¡ci¢ db tx1 ; haszn lat Figyelem! Ha a nyit¢ ‚s z r¢ ' jeleket lehagyjuk, akkor a TASM a makr¢t”rzset megpr¢b lja szimb¢lumk‚nt ‚rtelmezni, ez pedig kellemetlen eredm‚nyhez vezethet. Az ¡gy defini lt makr¢ a forr sban b rhol  tdefini lhat¢. M–veletek sz”veges makr¢kkal Ezek a m–veletek csak Ideal Mode-ban haszn lhat¢k, kl”nf‚le appr¢bb trkk”z‚sek stringekkel. Stringen a k”vetkez“ket ‚rtjk itt: - Egy sz”veges makr¢ t”rzse, azaz pl. <'This is a text macro'> - Egy kor bban defini lt sz”veges makr¢ szimb¢luma - Egy %-jellel bevezetett numerikus kifejez‚s, amely ‚rt‚k‚nek sz”veges form ja ford¡t¢dik be az aktu lis sz mrendszernek megfelel“en (mondja a k‚zik”nyv, de neknk mindig a numerikus ‚rt‚k ford¡t¢dott be, az viszont t‚nyleg az aktu lis sz mrendszerben ki‚rt‚kelve...) CATSTR: T”bb string ”sszef–z‚s‚t v‚gzi el balr¢l jobbra, pl.: stall CATSTR st1, st2 (Ezzel meg az volt a probl‚m nk, hogy az el“redefini lt stringeket csak egym s m”g‚ dob lta, ‚s pl. a nyit¢ ‚s z r¢ '-b“l lett egy darab ', ami nem igaz n sz‚p dolog...) SUBSTR: A stringnk egy r‚sz‚t fogja az £j stringbe t”lteni. Meg kell adnunk, honnan kezdje, ‚s megadhatjuk, h ny karakter legyen az £j string. Ha nem adjuk meg a karaktersz mot, akkor az eredeti string a megadott poz¡ci¢t¢l a v‚g‚ig kerl az £j stringbe. P‚lda: stpart SUBSTR st1, 8, 6 (Az £j stringben pedig ugye nagy val¢sz¡n–s‚ggel nincs nyit¢ '... Kiss‚ neh‚z ¡gy megetetni sz”vegk‚nt, nemde?) INSTR: Ez egy numerikus ‚rt‚ket ad vissza, m‚gpedig azt, hogy a m sodik megadott string h nyadik poz¡ci¢n fordul el“ (el“sz”r) az els“ stringben. Ha nincs meg benne, akkor 0-t kapunk. Megadhatunk m‚g egy kezd“‚rt‚ket, hogy az els“ string h nyadik poz¡ci¢j t¢l keressen (de ekkor is az eg‚sz stringen belli kezd“‚rt‚ket adja vissza). Pl.: inst INSTR 3, st1, st2 ; st1 3. poz¡ci¢j t¢l kezdve keresi st2-t, ‚s megadja, hogy st1 h nyadik poz¡ci¢j n tal lta meg (Term‚szetesen a ' jelek itt is probl‚m t okoznak...) SIZESTR: § pedig a string hossz t adja meg. P‚lda: l SIZESTR st1 (s a hosszba belesz mol¢dnak a ' karakterek is.) J¢pof k ezek a gondok a ' karakterekkel. A k‚zik”nyv ilyesmir“l nemigen ejt sz¢t. Ja, term‚szetesen a " jellel ugyanez van... K¢dot (is) tartalmaz¢ makr¢k Itt m r meg kell adnunk egy makr¢keretet, amelyben szerepel legal bb egy argumentum is. Form tuma: MACRO ENDM P‚ld ul egy makr¢ DOS-h¡v sra: CallDOS MACRO FuncNum mov ah, FuncNum int 21h CallDOS ENDM Ez a pl. k”vetkez“kk‚ppen h¡vhat¢: CallDOS 10 Ennek hat s ra a 10-es sz m£ DOS-fggv‚ny fog megh¡v¢dni. Az ¡gy defini lt makr¢t a sz”veges makr¢hoz hasonl¢an b rmikor  tdefini lhatjuk. Az  tdefini l sig az eredeti makr¢ ford¡t¢dik be, ut na m r az £j. A PURGE direkt¡v val ki is t”r”lhetjk a makr¢t. Pl.: PURGE macro1, macro2, macro3 Egy makr¢nak t”bb argumentumot is  tadhatunk, annyit, amennyi egy sorban elf‚r. Ha ez nem el‚g, akkor a sor v‚g‚re tegyk a folytat s karaktert, a \-t, ‚s akkor a k”vetkez“ sor is logikailag ide fog tartozni. P‚ld k: CallDOS MACRO FN, FP1, FP2 CallDOS MACRO FN,\ FP1, FP2 A h¡v s is hasonl¢, pl.: CallDOS 2, 17, 21 Ha az argumentumot nem kl”n sz¢k‚nt haszn ljuk, hanem egy m sik sz¢ r‚szek‚nt, akkor term‚szetesen nem fog behelyettes¡t“dni. Ha m‚gis azt akarjuk, hogy behelyettes¡t“dj”n, akkor tegynk el‚ egy & jelet, ha a sz¢nak az argumentummal nincs v‚ge, akkor m”g‚ is tegynk egyet. €gy sz‚pen behelyettes¡t“dik szimb¢lumba, stringbe, ak rmibe. N‚h ny szab ly a & haszn lat r¢l: - Stringeken k¡vl  ltal nos elv lszt¢jelk‚nt funkcion l - Stringeken bell, vagy Ideal Mode-ban stringen k¡vli ; ut n az argumentumot csak & jellel vagy jelekkel elv lasztva ismeri fel a ford¡t¢ - A makr¢ kifejt‚sekor a TASM & jelek b rmely sorozat b¢l elt vol¡t egyet, ¡gy lehets‚gess‚ v lik, hogy &-et haszn l¢ makr¢defin¡ci¢t egy‚b makr¢defin¡ci¢k belsej‚be tegynk Kedvenc argumentumunknak t¡pusa is lehet, amit kett“sponttal elv lasztva adhatunk meg neki, pl.: CallDOS MACRO FN:REQ A t¡pus egy lehet a k”vetkez“k k”zl: - REQ: H¡v skor az adott argumentum nem lehet res, azaz mindenk‚ppen kell valami ‚rt‚ket adnunk neki. - =< >: A < ‚s > jelek k”z”tt megadott dolog lesz az argumentum ‚rt‚ke akkor, ha h¡v skor a nem adunk neki ‚rt‚ket. Pl.: st1=<7> - VARARG: A makr¢h¡v s ”sszes t”bbi param‚tere ebbe a v ltoz¢ba fog kerlni, mint argumentumok sorozata. - REST: A makr¢h¡v s ”sszes t”bbi param‚tere ebbe a v ltoz¢ba fog kerlni, sz”veg form j ban. A h¡v st form j t a t¡pusok nem befoly solj k. Term‚sztesen a makr¢ h¡v s nak param‚terez‚s‚n‚l is vannak szab lyok: - Ha minden k”r¡t‚s n‚lkl adjuk  t a param‚tert, akkor folytonos karaktersorozatnak kell lennie, sz¢k”z”k, vessz“k, pontosvessz“k n‚lkl. - Ha mindenf‚le karaktereket akarunk az  tadott ‚rt‚kben haszn lni, akkor tegyk a h¡v si param‚tert < ‚s > k”z‚. A TASM a makr¢ beilleszt‚sekor csak egy ilyen p rost bont le, ¡gy lehet“s‚g van ilyesmit tartalmaz¢ makr¢k defini l s ra m s makr¢kon bell. - Az el“z“h”z hasonl¢ j tszhat¢ el egy karakterre a !-lel: !; ugyanaz, mint <;> (ha ;-t minden k”r¡t‚s n‚lkl pr¢b ln nk  tadni, akkor ugye a sor t”bbi r‚sz‚b“l comment lenne...). 3 kiv‚tel van: !> = > , !< = < , !! = ! - %-lel bevezetett kifejez‚s. El“fordulhat, hogy makr¢nkba mindenf‚le komment rokat is akarunk tenni. Ha szimpl n ;-vel vezetjk be “ket, akkor a makr¢ minden egyes megh¡v sakor a megjegyz‚sek is mindig beilleszt“dnek a forr sba. Ezt elkerlend“, a megjegyz‚st ;;-lel vezessk be, pl.: mov ax, arg1 ;; az argumentum bet”lt‚se AX-be —jabb probl‚ma merl fel, ha a makr¢ban c¡mk‚ket vagy egy‚b szimb¢lumokat akarunk haszn lni, mert ha egy szimb¢lum 67-szer beilleszt“dik a forr sba, az nem igaz n eg‚szs‚ges. Ennek elkerl‚s‚re szolg l a LOCAL direkt¡va, amely biztos¡tja, hogy az ut na felsorolt szimb¢lumok minden egyes helyettes¡t‚skor m sok lesznek. Pl.: CallDOS MACRO FuncNum Local exit1, exit2 mov ah, FuncNum int 21h jc exit1 mov bx, 0 jmp exit2 exit1: mov bx, 1 exit2: CallDOS ENDM Ez a makr¢ megh¡vja a neki argumentumk‚nt megadott DOS-fggv‚nyt, azt n, ha volt hiba, BX-be 1-et t”lt, ha nem volt hiba, akkor 0-t. Felt‚teles ford¡t sn l el“fordulhat, hogy azt szeretn‚nk, bizonyos k”rlm‚nyek k”z”tt  lljon le a makr¢ behelyettes¡t‚se. Erre val¢ az EXITM direkt¡va - hat s ra a ford¡t¢ abbahagyja a makr¢ behelyettes¡t‚s‚t ‚s ford¡t s t, ‚s a forr s k”vetkez“ sor val folytatja a munk j t. A GOTO utas¡t s arra haszn lhat¢, hogy a makr¢n bell ugr ljunk vele. Ugrani csak egy speci lis c¡mk‚re lehet, amely a k”vetkez“k‚ppen n‚z ki: :lbl A "c¡mk‚nek" kl”n sorban kell lennie. Az ugr s GOTO lbl utas¡t ssal megy. Ezek a "c¡mk‚k" a ford¡t s sor n megsz–nnek, ¡gy nem okoz probl‚m t a makr¢ t”bbsz”ri h¡v sa. A GOTO utas¡t snak is els“sorban felt‚teles ford¡t sn l van ‚rtelme. Egy p‚lda: Gseven MACRO arg1 mov ax, 3 IF arg GT '7' GOTO lbl ENDIF inc ax :lbl inc ax Gseven ENDM Egy igaz n sz‚p dolog a rekurz¡v makr¢. Enn‚l nagyon kell vigy znunk, hogy valami kil‚p‚si felt‚tel legyen, ellenkez“ esetben kiss‚ el fog h£z¢dni a ford¡t s... A rekurzi¢t £gy a legegyszer–bb megcsin lni, hogy a makr¢ menjen null t¢l egy maxim lis sz mig ak rh ny param‚terrel, az els“ param‚tert felhaszn ljuk, ‚s csak a marad‚kkal h¡vjuk meg a makr¢t. Ekkor c‚lszer– az IFNB felt‚teles ford¡t si direkt¡v t, amely azt d”nti el, hogy neki a param‚terek‚nt megadott string res-e. N‚zznk egy p‚ld t: MCreate MACRO opname, op1, op2, op3, op4, op5, op6, op7 IFNB opname ; ha elfogytak az argumentumok, akkor rekurzi¢ v‚ge DO&opname MACRO op, count ; makr¢ k‚sz¡t‚se IF count LE 4 REPT count ; err“l kicsit lejjebb lesz sz¢ opname op, 1 ENDM ELSE mov cl, count opname op, cl ENDIF ENDM MCREATE op1, op2, op3, op4, op5, op6, op7 ; rekurzi¢ ENDIF ENDM H¡vjuk meg az MCreate makr¢t a k”vetkez“ param‚terez‚ssel: MCREATE rol, ror, rcl, rcr, shl, shr, sal, sar Ekkor kapunk DOrol, DOror, stb. nev– makr¢kat, amelyeknek tetsz“leges sz m£ rot l st vagy shiftel‚st megadhatunk (ez 8086-on hasznos lehet). Amint l that¢, a makr¢ nem ism‚tli ‚sz n‚lkl az utas¡t sokat, egy bizonyos sz ml l¢ felett ink bb a CL-es megold st alkalmazza. A most k”vetkez“ makr¢t¡pusok kiss‚ kl”nb”znek az eddigiekt“l - ott ford¡t¢nak be (valamilyen m¢don), ahol szerepelnek. N‚zzk az egyes t¡pusokat. REPT ism‚tl“makr¢ Form ja: REPT ENDM A annyiszor ford¡t¢dik be a programba, amennyi a ‚rt‚ke. Pl. REPT 2*4 push ax pop ax ENDM hat s ra a push ax, pop ax utas¡t sp r 8-szor beford¡t¢dik. WHILE-makr¢ Form ja: WHILE ENDM Eg‚szen addig ism‚telgeti a makr¢t”rzset (a makr¢t”rzs beford¡t s t), am¡g a 0-v  nem v lik. Figyelem, igen k”nny– v‚gtelen ciklusba kldeni vele a ford¡t¢t! Egy m–k”d“ p‚lda: Z=3 WHILE Z mov ax, bx Z=Z-1 ENDM Ez a makr¢ h romszor beford¡tja a mov ax, bx utas¡t st. IRP ‚s IRPC Ezekkel a makr¢kkal azt lehet el‚rni, hogy egy lista (IRP) vagy string (IRPC) minden elem‚re beford¡t¢djon a makr¢. Form tumok: IRP , ENDM IRPC , ENDM Az IRP argumentumlist ja b rmilyen ‚rtelmes argumentumok sorozata lehet, szigor£an < ‚s > k”z”tt. A string tetsz“leges string lehet. P‚ld k: IRP ir, <21h, 22h, 27h, 29h> int ir ENDM Ez a makr¢ sorban megh¡vja egym s ut n a 21h, 22h, 27h ‚s 29h interruptokat. IRPC num, 18732 db num ENDM Ez pedig a mem¢ri ba ¡rja sorra az 1, 8, 7, 3, 2 ‚rt‚keket. Vigy zzunk, sz”vegn‚l ez nem ilyen egyszer–, ugyanis a bet–ket szimb¢lumk‚nt t rolja, ‚s ha m r van ilyen szimb¢lum, akkor annak felelteti meg! A % makr¢-direkt¡va A % az ut na k”vetkez“ sort egy egysoros makr¢t”rzsk‚nt ‚rtelmezi ‚s ford¡ttatja be. Az argumentum b rmely abban a pillanatban ‚rv‚nyben l‚v“ sz”veges makr¢ lehet. Pl.: A eq ax B eq bx % mov A, B Ebb“l term‚szetesen mov ax, bx lesz. Ideal Mode Ez a Turbo Assembler saj t m¢dja. A default ‚s az  ltal nosan haszn lt a MASM kompatibilis m¢d vagy MASM-m¢d. A k‚zik”nyv el‚g sokat  radozik az Ideal Mode-r¢l, mi annyi el“ny‚t l tjuk, hogy a kifejez‚s-ki‚rt‚kel‚se szigor£bb, bizonyos sorokat le sem ford¡t, gyan£s dolgokn l sz¢l, valamint a szegmenscsoport kezel‚se korrekt. Sajnos, a szintakszis v ltozott egy keveset. Kicsit b“vebben: Ideal Mode-ba az Ideal direkt¡v val v lthatunk (vissza pedig a MASM direkt¡v val). Megv ltozott egyes direkt¡v k ‚s nevk sorrendje: ilyenek a SEGMENT, a PROC, a MACRO ‚s a hasonl¢k. A m sik fontos kl”nbs‚g a [ ‚s ] jelek haszn lat ban van. Ideal Mode-ban [ ‚s ] k”z”tt l‚v“ mennyis‚g MINDIG mem¢riac¡mk‚nt ‚rtelmez“dik. Ezzel egytt t”bb helyen szks‚gtelenn‚ v lik a byte ptr jelleg– m¢dos¡t sok haszn lata. A kifejez‚s-ki‚rt‚kel‚s szigorod s nak j¢ p‚ld j t adj k a strukt£r k, Ideal Mode-ban pont el“tt ‚rv‚nyes strukt£ra-n‚vnek, ut na pedig ‚rv‚nyes mez“nek kell szerepelni. V‚gl egy el‚g buta hiba a MASM-ban. Ha szegmensekb“l szegmenscsoportot ‚p¡tnk, akkor azt lehetne v rni, hogy a szegmenseken belli v ltoz¢k vagy egyebek offset-c¡mei is egym s ut n k”vetkezzenek. A MASM ennek ellen‚re tov bbra is minden v ltoz¢t a saj t szegmens‚hez k‚pest c¡mez. A lek‚rdez‚sn‚l ezt £gy lehet kiksz”b”lni, hogy a v ltoz¢n‚v el“tt kett“sponttal elv lasztva feltntetjk a csoport nev‚t is, ez meg nem egy igaz n sz‚p megold s (mov ax, offset datagrp:var). Ideal Mode-ban ezt a sz‚ps‚ghib t kijav¡tott k. P‚lda: Van 3 db paragrafusra (16 byte) igaz¡tott egyv ltoz¢s szegmensnk. Ha a v ltoz¢k c¡meit egyszer–en csak az offset direkt¡v val lek‚rdezzk, akkor MASM m¢dban 3 alkalommal 0-t, Ideal Mode-ban viszont 0-t, 10h-t ‚s 20h-t kapunk. Turbo Assembler hibazenetei Val¢sz¡n–leg ez lesz az egyik legt”bbet olvasott szekci¢... ABC-rendben megynk, a gyakrabban el“fordul¢ hib kat megcsillagoztuk. 32-bit segment not allowed without .386 Akkor jelentkezik, ha egy szegmens ut n egy use32 m¢dos¡t¢sz¢t biggyesztnk, de nem kapcsoltuk be a 386-os utas¡t sk‚szletet. Argument needs type override (*) Az utas¡t sb¢l nem derl ki, hogy a mem¢riahivatkoz s t¡pus£ (byte, word, stb.). Haszn ljuk a byte ptr jelleg– fellb¡r l sokat. Pl.: mov [si+17], 1 -> mov byte ptr [si+17], 1 Argument to operation or instruction has illegal size A m–velet operandus nak m‚rete nem megengedett. El‚g ritk n fordul el“. Arithmetic overflow Egy m–velet eredm‚nye nem f‚r el a c‚loperandusban. Ezt a hib t gener lja pl. a k”vetkez“ utas¡t s: CNS=200000*200000 ASSUME must be a segment register Egy ASSUME direkt¡v nak nem szegmensregisztert adtunk meg, hanem valami m st. Pl.: ASSUME si:DATA Bad keyword in SEGMENT statement A SEGMENT direkt¡v ban valami nem megfelel“ sz¢ van. Legink bb akkor fordul el“, amikor valamit el¡runk. Can't add relative quantites Egyik kifejez‚snkben k‚t c¡met pr¢b lunk ”sszeadni, aminek ugye nem t£l sok ‚rtelme van. K‚t c¡m kivon s nak term‚szetesen van (¡gy meghat rozhatjuk pl. egy adatterlet hossz t), valamint egy c¡mhez adhatunk konstanst is (pl. egy t”mb egyik elem‚re ¡gy be ll¡thatunk egy c¡mk‚t). P‚ld k: ARRAY db 20 dup (0) ; t”mb END db ? ; a t”mb ut ni els“ byte SUM = ARRAY + END ; ‚rtelmetlen ”sszead s LEN = END - ARRAY ; a t”mb hossza LAST = ARRAY + 19 ; a t”mb utols¢ elem‚nek c¡me Can't address with currently ASSUMEd segment registers Olyan v ltoz¢ra pr¢b ltunk hivatkozni, amelyhez abban a pillanatban nincs be ll¡tott szegmensregiszter. Ilyesmire kell gondolni: SEG1 SEGMENT ASSUME ds:SEG1 mov al, V1 SEG1 ENDS SEG2 SEGMENT V1 db ? SEG2 ENDS Can't convert to pointer A ford¡t¢ a kifejez‚snkb“l nem tud mutat¢t gy rtani. ltal ban szintaktikai hib kra utal, pl.: mov si, [word ptr bx] ; rossz mov si, word ptr [bx] ; j¢ Can't emulate 8087 instruction Akkor j”het el“, ha a ford¡t¢t utas¡tottuk a lebeg“pontos utas¡t sok emul l s ra (/E kapcsol¢ vagy EMUL direkt¡va), ‚s az egyik utas¡t sunkat nem tudja emul lni. Ilyen utas¡t sok: FNSAVE, FNSTCW, FNSTENV, FNSTSW. Can't make variable public Olyan v ltoz¢t pr¢b ltunk nyilv noss  tenni, amelyet £gy deklar ltunk, hogy ez nem engedhet“ meg. Pl.: EXTRN V2:NEAR PUBLIC V2 ; nem lehet, mert kls“ v ltoz¢ Can't override ES segment (*) Ahol alap‚rtelmez‚s az ES szegmensregiszter, ott szegmensprefix nem haszn lhat¢. Term‚szetesen ahol alap‚rtelmez‚s a DS ‚s az ES is, ott m–k”dik a szegmensprefix, de csak a DS-t b¡r lja fell. P‚lda: FS:stosb ; nem enged‚lyezett FS:movsw ; enged‚lyezett, SI szegmensregisztere DS helyett FS lesz Can't subtract dissimilar relative quantities Akkor j”n el“, ha k‚t c¡met pr¢b lunk egym sb¢l kivonni, de ezek a c¡mek kl”nb”z“ szegmensekhez tartoznak. Can't use macro name in expression Egy makr¢ nev‚t pr¢b ltuk operandusk‚nt haszn lni, pl.: DOSM MACRO ENDM mov cx, DOSM Can't use this outside macro Egy makr¢-direkt¡v t nem makr¢-defin¡ci¢ban pr¢b ltunk haszn lni. Code or data emission to undeclared segment (*) Ezzel akkor tal lkozunk, ha a ford¡t¢ olyan adatot vagy k¢dot tal l, aminek nem adtunk meg szegmenst. Olyankor szokott el“fordulni, ha elfelejtnk a program elej‚n szegmenst megadni. Constant assumed to mean immediate constant (*) Ez csak figyelmeztet‚s, arra utal, hogy a hivatkoz sunk nem c¡mre fog utalni, hanem egy k”zvetlen ‚rt‚kre. Pl.: mov dx, [0] ; dx-be 0-t t”lt, nem az aktu lis adatszegmens 0 c¡m‚n tal lhat¢ sz¢t Constant too large (*) Egy konstanst helyesen adtunk meg, de a m‚rete t£l nagy. Pl. ezt adja a ford¡t¢, ha 286-os utas¡t sk‚szlettel 65535-n‚l nagyobb sz mokkal pr¢b lkozunk. CS not correctly assumed (*) K”zeli ugr st vagy szubrutinh¡v st k¡s‚reltnk meg egy m sik k¢dszegmensbe. Ez csak MASM-m¢dban van, a Turbo Assembler Ideal Mode-ja lekezeli a probl‚m t. CS override in protected mode (*) V‚dett m¢dban tal lkozunk vele, akkor k”vetkezik be, ha a sz¢banforg¢ utas¡t s ig‚nyeln‚ a k¢dszegmens fellb¡r l s t. Ez t”rt‚nk p‚ld ul akkor, ha a k¢dszegmensbe akarunk ¡rni (v‚dett m¢dban ez tilos), ilyenkor az lehet a megold s, hogy egy ¡rhat¢ adatszegmenst be ll¡tunk k¢dszegmensre. CS unreachable from current segment (*) C¡mk‚t adtunk meg (: , label-es m¢dszer vagy PROC), ‚s a jelenlegi felt‚telezett (ASSUMEd) k¢dszegmens nem egyezik meg az aktu lis szegmenssel. Declaration needs name A PROC-cal megadott elj r snak megvan a kerete (PROC ... ENDP), de nincs neve. Helyesen: ELJ PROC ... ELJ ENDP Directive ignored in Turbo Pascal model Akkor fordul el“, ha Pascal-hoz akarunk illeszteni, ‚s ott meg nem engedett direkt¡v t haszn lunk. Directive not allowed inside structure definition Olyan direkt¡v t haszn ltunk egy strukt£ra megad s ban, ami nem engedett. Ilyesmi pl. az ORG. Nem tehetjk meg azt sem, hogy egym sba  gyazott strukt£r kban a bels“ strukt£r knak nevet adjunk. Ha ezt szeretn‚nk m‚gis megcsin lni, akkor el“sz”r alkossuk meg a bels“ strukt£r (ka)t, ‚s ezut n ezekre a nevkkel hivatkozzunk. Duplicate dummy argument Egy makr¢nak t”bb param‚tere van, ‚s ezek k”z”tt vannak azonos nev–ek is. Tal n nem szks‚ges magyar zni, hogy ez elkerlend“... ELSE or ENDIF without IF Felt‚teles ford¡t sn l elmaradt valahol egy IF. Expecting METHOD keyword Objektumok defini l sakor a b“v¡tett strukt£r nak szks‚ge van a METHOD kulcssz¢ra a szl“objektum ut n. Expect offset quantity Egy utas¡t snak, amely egy szegmensen belli c¡met v r, valami eg‚sz m st adtunk meg. Expecting offset or pointer quantity Egy utas¡t snak, amely egy meghat rozott szegmensen belli c¡met v r, teljesen m st adtunk meg. Expecting pointer type Az utas¡t s mem¢ri ra val¢ hivatkoz st v r, viszont nem azt (hanem  ltal ban konstanst) kap. Pl.: lds si, 123 Expecting record field name A SETFIELD vagy a GETFIELD utas¡t st egy hozz tartoz¢ mez“ n‚lkl haszn ltuk. Expecting register ID A CALL..METHOD USES r‚sze egy regisztert vagy regiszterekb“l  ll¢ felsorol st v rna. Expecting scalar type (*) ltal ban akkor fordul el“, amikor konstans helyett valami m st, t”bbnyire mem¢riahivatkoz st tartalmaz a k¢dunk. Expecting segment or group quantity Szegmens vagy szegmenscsoport neve helyett m st adtunk meg egy direkt¡v ban, t”bbnyire ASSUME-ban jellemz“. Extra characters on line (*) Tal lt a ford¡t¢ egy szab lyos kifejez‚st, de a sorban tov bbi dolgok is  llnak. Pl.: mov al, 6 7 Akkor is el“fordulhat, ha egy kor bbi hiba miatt a ford¡t¢ f‚lre‚rtelmezi a sz nd‚kunkat. Forward reference needs override (*) Olyan hivatkoz sokn l fordul el“, ahol a deklar ci¢ k‚s“bb van, mint az els“ hivatkoz s (ezt jelenti a forward reference). Ha a hivatkoz sn l nincs fellb¡r lva az el‚r‚si m¢d (NEAR/FAR), akkor automatikusan k”zelinek tekinti, ‚s ha a hivatkoz s t rgya t voli, akkor probl‚ma van. Elkerl‚s‚hez term‚szetesen fell kell b¡r lni az el‚r‚si m¢dot. Global type doesn't match symbol type Ez csak figyelmeztet‚s, akkor adja a ford¡t¢, ha egy szimb¢lumot glob lisnak deklar lunk, majd ugyanabban a modulban defini ljuk, de m s t¡pus£nak. ID not member of structure A Turbo Assembler Ideal Mode-j ban j”het el“, ha egy strukt£r ra val¢ hivatkoz skor nem l‚tez“ elem‚t pr¢b ljuk el‚rni. Akkor is el“fordulhat, ha egy kor bbi hiba miatt a ford¡t¢ f‚lre‚rtelmezi a sz nd‚kunkat. Illegal forward reference Olyan szimb¢lumra hivatkozunk, amely m‚g nincs deklar lva, ‚s a hozz  tartoz¢ direkt¡va vagy oper tor miatt nem lehet el“rehivatkoz st (forward reference) alkalmazni. Illegal immediate (*) Konstanst alkalmaztunk olyan helyen, ahol nem szabadna. Pl.: mov 12, ax Illegal indexing mode (*) Meg nem engedett indexel‚si kombin ci¢t haszn ltunk. Ez csak 386 alatt van, a k”vetkez“ kombin ci¢k megengedettek: BX, BP, SI, DI, BX+SI, BX+DI, BP+SI, BP+DI. Illegal instruction (*) Egy k¢dot tartalmaz¢ sor olyan sz¢val kezd“dik, amelyet az Assembler nem ismer fel. Ilyen szokott j”nni pl. akkor, ha a c¡mke m”gl lefelejtjk a kett“spontot. Illegal instruction for currently selected processor(s) (*) Olyan utas¡t st haszn ltunk, amit a ford¡t¢ felismer, de a jelenleg ‚rv‚nyben l‚v“ processzort¡pus nem ismeri. ll¡tsunk be egy megfelel“ processzor-direkt¡v t (esetleg vegynk egy jobb g‚pet is). Illegal local argument A LOCAL direkt¡v t makr¢ban haszn ltuk, ‚s az argumentuma nem egy ‚rv‚nyes c¡mke. Illegal local symbol prefix Lok lis szimb¢lumok megad s n l (LOCALS direkt¡va) a kezd“ szimb¢lum ‚rv‚nytelen. A kezd“szimb¢lum egy k‚t karakter hossz£, ‚rv‚nyes szimb¢lum kell, hogy legyen (az alap‚rtelmez‚s @@). Illegal macro argument (*) Makr¢ defini l s n l a makr¢ param‚tere nem egy ‚rv‚nyes szimb¢lum. Illegal memory reference (*) Az utas¡t snak van mem¢ri ra hivatkoz¢ operandusa, de az az operandus nem szabadna, hogy mem¢ri t jel”lj”n. Tipikus esete, amikor mem¢ri b¢l mem¢ri ba pr¢b lunk mozgatni (pl. mov [si], [di]). Illegal number (*) Egy sz mban haszn ltunk a t¡pus nak nem megfelel“ karaktereket, pl. egy hexa sz mban f ut n k”vetkez“ bet–t (0a3m2h). ltal ban el¡r sokb¢l ad¢dik. Illegal origin address rv‚nytelen c¡met adtunk meg a jelenlegi szegmens be ll¡t s n l ($). Egyik lehet“s‚g, hogy egy konstanst vagy egy kifejez‚st adunk meg a $-ral, a m sik pedig az, hogy egy szimb¢lumot a jelenlegi szegmensben. Illegal override in structure Megpr¢b ltuk inicializ lni a strukt£ra olyan mez“j‚t, amelyet DUP-pal adtunk meg. Csak azokat lehet, amelyek DUP n‚lkliek. Illegal override register Szegmensprefixk‚nt nem szegmensregisztert adtunk meg, hanem egy  ltal nos regisztert. Pl.: AX:cmp dx, V3 Illegal radix A sz mrendszert be ll¡t¢ .RADIX direkt¡v nak nem haszn lhat¢ sz mrendszert adtunk meg. A sz mrendszer lehet 2-es, 8-as, 10-es vagy 16-os. A .RADIX-nak megadott sz m a jelenlegi sz mrendszert“l fggetlenl decim lisan ‚rtelmez“dik. Illegal register for instruction Nem megengedett regisztert haszn ltunk a SETFIELD utas¡t s forr s ban vagy a GETFIELD utas¡t s c‚lj ban. Illegal register multiplier Megpr¢b ltunk egy regisztert konstanssal szorozni (pl. mov bx, ax*4). Ilyesmi csak 386-t¢l felfel‚ van, sk l z ssal csin lhatunk ilyet (pl. mov ebx, [eax+esi*8]). Illegal segment address Akkor tal lkozunk vele, ha szegmensc¡mnek 65535-n‚l nagyobb sz mot pr¢b lunk megadni. Illegal use of constant (*) Olyan helyen haszn ltunk konstanst, ahol nem szabad. Pl.: mov ax, bx+4 Illegal use of register Olyan helyen haszn ltunk (egy bizonyos) regisztert, ahol nem illene. Pl.: LAB=12 shr dx Illegal use of segment register (*) Olyan helyen haszn ltunk szegmensregisztert, ahol az nem haszn lhat¢. Pl.: cmp ds, 3234 Illegal USES register Az ENTER-LEAVE elj r snak nem megfelel“ regisztereket adtunk meg PUSH-ol sra vagy POP-ol sra. Az ‚rv‚nyes regiszterek: AX, BX, CX, DX, SI, DI, DS, ES. 386-t¢l felfel‚ a 32 bites regisztereket is haszn lhatjuk. Illegal version ID A /U kapcsol¢val vagy a VERSION direkt¡v val ‚rv‚nytelen verzi¢sz mot adtunk meg. Illegal warning ID Nem megfelel“ 3-karakteres warning-azonos¡t¢t adtunk meg. Instruction can be compacted with override Ez egy figyelmeztet‚s, el“rehivatkoz sn l kapjuk, ha a ford¡t¢ hosszabb k¢dot gener l, mint amekkor t esetleg felt‚tlen szks‚ges. Legink bb el“reugr sokn l j”het el“, amikor nem tudni, hogy az ugr s r”vid, k”zeli, vagy t voli. Invalid model type A .MODEL direkt¡v nak nem l‚tez“ modellt adtunk meg. A helyes modellnevek: tiny, small, compact, medium, large ‚s huge. Invalid operand(s) to instruction Egy utas¡t snak olyan operandus(oka)t adtunk meg, amely(ek) nem haszn lhat¢(ak) vele. Labels can't start with numeric characters Valamilyen szimb¢lumot sz mmal pr¢b ltunk kezdeni, ami nem megengedett. Line too long - truncating Az illet“ sor hosszabb, mint 255 karakter. A felesleges karakterek nem lesznek figyelembe v‚ve. Location counter overflow El‚rtk jelenlegi szegmens v‚g‚t, ‚s a megadott k¢d vagy adat fell fogja ¡rni a szegmens elej‚t (ez persze nem felt‚tlen baj). Pl.: org 0fff8h arr db 10 dup (0) ; az utols¢ 2 byte a szegmens elej‚re kerl Method CALL requires object name A CALL..METHOD utas¡t s nem tudja meg llap¡tani, milyen objektumra vonatkozik. Adjuk meg az objektum nev‚t. Missing argument list Az IRP vagy IRPC ism‚tl“makr¢-direkt¡v nak nem adtunk meg argumentumlist t. Mind param‚tert, mind argumentumlist t meg kell adnunk. Missing argument or < Lefelejtettk a <-t az argumentum elej‚r“l, vagy lefelejtettk mag t az argumentumot is. Missing argument size variable Az ARG vagy a LOCAL direkt¡v nak nem adtunk meg egy szimb¢lumot a v‚g‚n l‚v“ = jel ut n. Az egyenl“s‚gjel nem k”telez“, de ha kitettk, ut na szimb¢lumnak kell j”nnie. Missing COMM ID A COMM direkt¡va ‚s a t¡pushat roz¢ k”z‚ nem tettnk szimb¢lumot. Pl.: COMM NEAR ; rossz COMM ZZ: NEAR ; j¢ Missing dummy argument Az IRP vagy IRPC ism‚tl“makr¢nak nem adtunk meg param‚tert. Mind param‚tert, mind argumentumlist t meg kell adnunk. Missing end quote (*) Karakter- vagy sz”vegkonstans defini l sakor lefelejtettk a z r¢ "-t vagy '-t. Missing macro ID K‚sz¡tettnk egy makr¢t, de nem adtunk neki nevet. Missing module name Haszn ltuk a NAME direkt¡v t, de nem adtunk meg neki modulnevet. Figyelem, a NAME direkt¡va csak Ideal Mode-ban megy! Missing or illegal language ID Nem megfelel“ nyelvet adtunk meg a .MODEL direkt¡v nak. Missing or illegal type specifier Szks‚g lett volna egy t¡pusm¢dos¡t¢ra (byte, word, stb.), de ilyet nem tal lt a ford¡t¢. Missing table member ID A CALL..METHOD utas¡t snak nem adtuk meg a METHOD nev‚t a METHOD kulcssz¢ ut n. Missing term in list Ideal Mode-ban szokott jelentkezni. Egy direkt¡v nak, amelynek t”bb argumentum is megadhat¢, egyik vessz“ ut n ‚rv‚nytelen argumentumot adtunk meg. Ezt az zenetet kapjuk p‚ld ul akkor, ha kifelejtnk egy argumentumot, csak a k‚t vessz“ van ott (EXTRN SYM1:WORD, , SYM2:WORD). Missing text macro Egy direkt¡v nak nem adtunk meg sz”veges makr¢-argumentumot, pedig ig‚nyelte volna. Model must be specified first Haszn ltuk az egyik leegyszer–s¡tett szegmensdirekt¡v t an‚lkl, hogy el“z“leg be ll¡tottuk volna a mem¢riamodellt. Helyesen pl.: .model small .data Module is pass-dependent - compatibility pass was done Ez a figyelmeztet‚s akkor jelentkezik, ha egy ford¡t si menett“l fgg“ megold st tal l a TASM, ‚s megadtuk a /m kapcsol¢t. Ez esetben beiktat¢dik egy MASM-kompatibilis menet. Name must come first Egy szimb¢lumot a hozz tartoz¢ direkt¡va m”g‚ tettk, nem pedig el‚. Pl.: struc ZZ ; rossz ZZ struc ; j¢ Ideal Mode-ban ez ford¡tva van, ez a hiba csak MASM-kompatibilis ford¡t s eset‚n jelentkezik. Near jump or call to different CS Akkor fordul el“, ha k”zeli ugr st vagy szubrutinh¡v st pr¢b lunk v‚grehajtani egy m sik k¢dszegmensbe. Need address or register Hi nyzik az egy‚bk‚nt szks‚ges m sodik operandus. Pl.: cmp bx, ; rossz cmp bx, ax ; j¢ Need angle brackets for structure fill Egy utas¡t snak, amely a m r deklar lt strukt£ra egy p‚ld ny nak helyet foglal, nem adtuk meg a kezd“‚rt‚keket. Need colon Az EXTRN, GLOBAL, ARG vagy LOCAL kulcsszavakn l hi nyzik a szimb¢lum ‚s a t¡pus k”zl a kett“spont. Pl.: EXTRN Z byte ; rossz EXTRN Z:byte ; j¢ Need expression A kifejez‚sben egy m–veletnek nincs operandusa. Pl.: Z=9+/3 Need file name after include Az INCLUDE direkt¡va ut n elfelejtettk megadni a file-nevet. Need left parenthesis Valahov  nem tettnk nyit¢z r¢jelet. Pl.: VAR db 4 dup 7 ; rossz VAR db 4 dup (7) ; j¢ Need method name A CALL..METHOD utas¡t snak meg kell adnunk a METHOD nev‚t is. Need pointer expression Ez a hiba csak Ideal Mode-ban fordul el“. Azt jelzi, hogy valahol a ford¡t¢ mem¢riahivatkoz st v rt, de nem tal lt. Ideal Mode-ban minden mem¢riahivatkoz st [ ‚s ] k”z‚ kell tenni. Need quoted string Ez is az Ideal Mode-ra jellemz“. Egy string helyett valami m st adtunk meg. Need register in expression Az utas¡t sban egy regiszternek kellene szerepelnie. Need right angle bracket Egy < ‚s > k”z‚ be¡rand¢ argumentumlista v‚g‚r“l lemaradt a >. Need right curly bracket Egy strukt£ra, t bl zat vagy bitmez“ megad s ban lehagytuk a }-et. Need right parenthesis Kevesebb ) van a kifejez‚sben, mint (. Need right square bracket Legt”bbsz”r mem¢riahivatkoz sn l fordul el“, lemaradt a ] a v‚g‚r“l. Need stack argument Egy lebeg“pontos utas¡t snak nem adtuk meg a szks‚ges m sodik operandust. Need structure member name Ideal Mode-ban szokott jelentkezni. Strukt£r ra val¢ hivatkoz skor az elv laszt¢ pont ut n nincs ‚rv‚nyes mez“n‚v. Not expecting group or segment quantity Rossz helyen haszn ltuk egy szegmens vagy szegmenscsoport nev‚t. One non-null field allowed per union expansion Union inicializ l sakor t”bb, mint egy ‚rt‚ket adtunk meg, holott csak egyet szabad. Pl.: XX UNION dw ? dd ? ENDS UINST U <10,76> ; rossz UINST U <10,?> ; j¢ UINST U ; j¢ Only one startup sequence allowed Akkor kapjuk, ha t”bb, mint egy .STARTUP vagy STARTUPCODE direkt¡v t adtunk meg. Open conditional (*) Felt‚teles ford¡t sn l j”n el“, ha IF ut n valahol nincs ENDIF. Open procedure (*) Az elj r sunkat nem fejeztk be az ENDP kulcssz¢val. ltal ban akkor fordul el“, ha ENDP helyett csak END-et g‚pelnk. Open segment (*) Egyik szegmensnket nem fejeztk be az ENDS kulcssz¢val. ltal ban akkor fordul el“, ha ENDS helyett csak END-et g‚pelnk. Open structure definition (*) Egy strukt£r t nem fejeztnk be az ENDS kulcssz¢val. ltal ban akkor fordul el“, ha ENDS helyett csak END-et g‚pelnk. Operand types do not match (*) Egy utas¡t s k‚t operandus nak m‚rete nem egyezik meg. Pl.: mov bx, al Operation illegal with static table member .-tal pr¢b ltunk egy t bl zat elem‚re hivatkozni, ami tilos. Pass-dependent construction encountered Az utas¡t s esetleg nem £gy fog viselkedni, ahogy mi elv rjuk t“le. Ez a hiba  ltal ban az el“rehivatkoz sok kiiktat s val megszntethet“. Pointer expression needs brackets Ideal Mode-ban j”n el“, itt ugyanis minden mem¢riahivatkoz snak [ ‚s ] k”z‚ kell kerlnie. Mivel MASM-ban nincs szks‚g erre, ez csak figyelmeztet‚s. Positive count expected Egy t”mbben, DUP el“tt negat¡v sz mot adtunk meg. Pl.: ARR dw -5 DUP (0) ; rossz ARR dw 5 DUP (0) ; j¢ Record field too large A bitmez“ mez“inek ”sszm‚rete meghaladja a 32 bitet. Record member not found A bitmez“ olyan mez“j‚re hivatkozunk, amelyik az eredeti deklar ci¢ban nem szerepel. Recursive definition not allowed for EQU Konstans defini l sakor rekurzi¢t csin ltunk, pl.: LBL EQU XX LBL Register must be AL or AX (*) A sz¢banforg¢ utas¡t s egyik operandusa AL vagy AX kell, hogy legyen. Ez az IN ‚s az OUT utas¡t sokra jellemz“. Register must be DX (*) Az utas¡t s egyik operandusa DX kell, hogy legyen. Az IN ‚s az OUT utas¡t sokra jellemz“. Relative jump out of range by bytes (*) Egy felt‚teles relat¡v ugr s nagyobb t vols gra mutat, mint amennyire szabadna. 16 bites szegmensek eset‚n ez -128..127 byte t vols g, 32 bites szegmensek eset‚n -32768..32767 byte. Relative quantity illegal Egy utas¡t s vagy direkt¡va olyan mem¢riac¡mre utal, amely ford¡t si id“ben nem der¡thet“ ki. IF-ekn‚l szokott el“kerlni. Reserved word used as symbol (*) Olyan szimb¢lumo(ka)t haszn ltunk, ami(ke)t a Turbo Assembler lefoglalt mag nak. A program m–k”dni fog, de az‚rt ink bb kerljk az ilyesmit. Rotate count must be constant or CL (*) Eltol si vagy forgat si m–velethez nem megengedett sz ml l¢t haszn ltunk. Csak konstanssal vagy CL-lel dolgozhatunk. Rotate count out of range Eltol si vagy forgat si m–veletnek t£l nagy sz ml l¢t adtunk meg. 8086-on ez b rmilyen 1-n‚l nagyobb sz m eset‚n jelentkezik, a t”bbi processzorn l a maximum 31. Segment alignment not strict enough Rossz argumentumot adtunk meg az ALIGN direkt¡v nak. Vagy nem 2 hatv nya, vagy szigor£bb, mint a szegmensn‚l megadott megszor¡t s. Pl.: CODE SEGMENT PARA ALIGN 5 ; nem 2 hatv nya ALIGN 32 ; a PARA 16 byte-os hat r, a 32 byte-os hat r t£l szigor£ Segment attributes illegally redefined —jra megnyitott szegmensn‚l elt‚rtnk az el“z“ attrib£tumokt¢l. Ha £jra megnyitunk egy szegmenst, vagy az ”sszes attrib£tumnak meg kell egyezni, vagy ne adjunk meg egyet se (ekkor automatikusan a r‚gieket haszn lja). Segment name is superfluous Akkor j”n el“, ha a .CODE direkt¡v t haszn ljuk olyan mem¢riamodellben, ahol csak egy .CODE lehet. A .CODE a medium ‚s a large modellekben haszn lhat¢. String too long A stringnk hosszabb 255 byte-n l. Symbol already defined (*) A szimb¢lumot m r deklar ltuk, megegyez“ t¡pussal. Symbol already different kind (*) A szimb¢lumot m r deklar ltuk, elt‚r“ t¡pussal. Symbol has no width or mask A WIDTH vagy MASK oper tornak megadott szimb¢lum nem egy bitmez“re vagy a bitmez“ egy mez“j‚re utal. Pl.: X dw 10 cmp bx, MASK X Symbol is not segment or already part of a group A szegmenscsoportba sorolt szegmens m r tagja egy m sik csoportnak, vagy egyszer–en nem is l‚tezik ilyen nev– szegmens. Text macro expansion exceeds maximum line length A sz”veges makr¢ b“v¡t‚s k”zben t£ll‚pte maxim lis megengedett sorhosszt. Nyirb ljuk meg egy kicsit. Too few operands to instruction Kev‚s operandust adtunk meg egy utas¡t snak. Pl.: cmp dx Too many errors or warnings (*) 100 hiba ut n a ford¡t¢ megel‚geli a dolgot, ‚s abbahagyja a ford¡t st. K”nnyen el“fordulhat olyankor, ha pl. a program elej‚n lehagytunk egy ASSUME direkt¡v t. Too many initial values Egy strukt£ra inicializ l sakor t£l sok ‚rt‚ket adtunk meg. P‚lda: ST STRUC A dw ? B dw ? ST ENDS VAR ST <5, 7, 21, 32> Ha kevesebb kezd“‚rt‚ket adunk meg, az nem probl‚ma, de t”bbet nem szabad. Too many register multipliers in expression (*) 386-on fordul el“, ha c¡mz‚sn‚l mindk‚t regisztert sk l zni pr¢b ljuk, ugyanis csak az egyiket lehet. Too many registers in expression (*) T”bb, mint k‚t regiszterrel pr¢b ltunk indexelni. Too many uses registers T”bb, mint 8 USES-hez tartoz¢ regisztert adtunk meg a sz¢banforg¢ elj r snak. Trailing null value assumed Ha adatokat adunk meg, ‚s az utols¢ vessz“ ut n nincs adat, akkor a ford¡t¢ £gy veszi, mintha egy ? lenne a v‚g‚n. Azaz: X db 1, 2, X db 1, 2, ? ; ugyanaz, mint az els“ sor Undefined symbol (*) Olyan szimb¢lumra hivatkozunk, ami sehol sem volt deklar lva. Unexpected end of file (no END directive) (*) A forr sunk befejez‚sek‚nt nem az END direkt¡va szerepel. Minden forr st END-del kell befejezni. (Az END ut n b rmilyen sz”veg k”vetkezhet, de azt az Assembler m r nem veszi figyelembe.) Unknown character Olyan karaktert haszn ltunk, amelyet a TASM nem ismer fel. Unmatched ENDP Egy ENDP-vel befejeztk az elj r st, csak ‚ppen eleje nincs. Unmatched ENDS A szegmens vagy a strukt£ra befejez‚s‚hez nem tartozik kezd‚s. User-generated error Akkor k”vetkezik be, ha a felhaszn l¢ valahol a .ERR direkt¡v t haszn lta. A direkt¡va haszn lata felt‚teles ford¡t sn l hasznos, ¡gy bizonyos k”rlm‚nyek k”z”tt megakad lyozhat¢ a k¢d leford¡t sa ‚s futtat sa. USES has no effekt without language Figyelmeztet‚s, arra utal, hogy a USES direkt¡v t nyelv megad sa n‚lkl haszn ltuk, aminek nem sok ‚rtelme van. Value out of range A megadott konstans m‚rete nagyobb, mint amekkora az adott k”rnyezetben haszn lhat¢ lenne. Pl. : db 257 Most j”nnek az igaz n bar ts gos hibazenetek, amelyek hat s ra a ford¡t s azonnal meg ll. Bad switch Nem l‚tez“ kapcsol¢t  ll¡tottunk be a parancssorban. Can't find @file A TASM nem tal lja a parancs-file-t. Adjuk meg mindig a teljes file-nevet, a ford¡t¢ nem felt‚telez semmif‚le kiterjeszt‚st. Can't locate file Az INCLUDE direkt¡v val megadott file-t nem tal lja a TASM. Error writing to listing file Valami hiba t”rt‚nt a listafile ¡r sa k”zben. Legval¢sz¡n–bb, hogy elfogyott a winchesteren a hely. Error writing to object file Valami hiba t”rt‚nt az object-file ¡r sa k”zben. Legval¢sz¡n–bb, hogy elfogyott a winchesteren a hely. File not found A forr sfile-unkat nem tal lja a TASM. Vagy elg‚peltk a nev‚t, vagy (ha nem a jelenlegi k”nyvt rban van a forr s) nem adtuk meg j¢l az el‚r‚si utat. File was changed or deleted while assembly in progress Mik”zben a TASM ford¡totta a forr sunkat, egy m sik program bele¡rt valamit, esetleg let”r”lte. Insufficient memory to process command line Olyan parancssort adtunk meg, amelyik hosszabb 64K-n l, vagy nem f‚r el a rendelkez‚sre  ll¢ mem¢ri ban. Vagy pr¢b ljuk t”bb szabad mem¢ri val futtatni a Turbo Assembler-t, vagy (ink bb) reduk ljuk kiss‚ a parancssort. Internal error Ez az a hibazenet, aminek elvileg sosem szabad megjelennie. Ha m‚gis megteszi, akkor az illet“ file-okat, amik ezt okozt k, a Borland t rt karokkal v rja. Invalid command line Rossz form tuma van a parancssorunknak. Pl.: tasm.exe ,asm.asm Invalid number after Megadtunk egy kapcsol¢t, de a hozz tartoz¢ numerikus argumentum nem megfelel“. Out of hash space T£ll‚ptk a szimb¢lumok sz m ra enged‚lyezett mem¢ri t. A TASM alap‚rtelmez‚sben 8192 szimb¢lumnak foglal helyet, ha van el‚g mem¢ria. Ha ez kev‚s, a /KH kapcsol¢ ut n be ll¡thatjuk, mennyi szimb¢lumra van szks‚gnk. Out of memory Kifogytunk a mem¢ri b¢l ford¡t s k”zben. Vagy futtassuk a ford¡t¢t t”bb konvencion lis mem¢ri val, vagy pr¢b lkozzunk a TASMX-szel, amely XMS-be dolgozik. Ha egyik sem megy, akkor pr¢b ljuk a forr sunkat sz‚tbontani t”bb kisebb file-ra. Out of string space Nincs el‚g mem¢ria a szimb¢lum-neveknek, file-neveknek, el“rehivatkoz s-inform ci¢knak ‚s makr¢-sz”vegeknek. Sikerlt t£ll‚pnnk az enged‚lyezett 512K-t, pr¢b lkozzunk a TASMX-szel, ha van el‚g XMS-nk. Too many errors found A TASM feladta a ford¡t st, mivel t”bb, mint 100 hib ig ‚s figyelmeztet‚sig jutott. El“fordulhat persze, hogy csak p r hiba volt, olyan sorokban, amelyekre s–r–n hivatkozunk m shonnan, vagy esetleg a program elej‚r“l felejtettnk le valami fontosat. Unexpected end of file (no END directive) A forr sunk utols¢ sor ban nem az END direkt¡va tal lhat¢. Minden forr st END-del kell befejezni. Nos, ennyi volt a Turbo Assembler ismertet‚se, rem‚ljk mindenki sz m ra hasznos lesz mindaz, amit itt le¡rtunk. Bryan, Fles