Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Majer Imre
- ;QNUGS9
- ;Adott karaktersorozat (alsztring) megkeresése belső memóriában tárolt sztringben. Bemenet: sztring
- ;kezdőcíme, alsztring kezdőcíme (mutatók). Kimenet: az először megtalált egyezés kezdőcíme a sztringben
- ;(mutató). Amennyiben a keresett karaktersorozat nem fordul elő, a mutató a sztring végét jelző 0-ra mutat.
- ORG 10h ;erre a kezdőcímre rakja be azt az értéket amit a következő sorban beadunk
- STR: DB "Majer" ;a string ami a 0x10 kezdőcímen található
- ORG 18h ;erre a kezdőcímre rakja be azt az értéket amit a következő sorban beadunk
- ALSTR: DB "je" ;az alstring ami a 0x18 kezdőcímen található
- ORG 20h
- LJMP MAIN
- ;a RUTIN függvény kap 2 bementi paramétert, 2 címet, sztring és alsztring kezdőcímeit. Kimenet at először megtalált
- ;egyezés kezdőcíme az R6 regiszterben. Amennyiben az alsztring nem fordul elő, az R6 regiszter értéke a sztring végére mutat.
- RUTIN: MOV R2,#0
- MOV DPTR, #ALSTR ;Sztringhosszfigyelő ->R2-ben tárolja az alsztring hosszát
- MOV R6, #0 ;R6=0, kesobb kelleni fog (itt tárolom az egyezés sztringben kévő kezdőcímét)
- JUMP1: MOV A, #0
- MOVC A, @A + DPTR ;Betöltöm az A-ba azt az értéket amire a Datapointer mutat (#ALSTR ami az alsztring kezdőcíme)
- JZ LOOP ;NINCS MEGADVA ALSZTRING, program vége, LOOP-hoz ugrás, R6=0
- INC DPTR
- INC R2 ;Addig növelem az R2 értékét amíg nem érkezek a sztring vége karakterhez (\0)
- JNZ JUMP1
- JUMP2: MOV A, R2
- MOV R4, A ;R4-be elmentem az alsztring hosszát, mert ha "elkezd" egy egyezést találni, de mégsem lesz az, akk elrontja
- DEC R2 ;R2 értékét (alsztring hossza) egyel csökkentem, ennyiszer kell majd a sztringben egyezést találni
- MOV DPTR, #STR ;DPTR a sztringre mutat
- MOV R3, #ALSTR ;R3 az alsztringre mutat
- JUMP3: ;ÖSSZEHASONLÍTÁS DPTR ÉS R3
- MOV A, #0
- MOVC A, @A + DPTR
- SUBB A,R3 ;kivonom a ket karaktert egymásból, ha 0 akkor egyeznek, ha nem 0, akkor különböznek
- JNZ JUMP5 ;ha nem egyezik akkor vizsgáljuk hogy vége-e a sztringnek, és ha nem, növelem DPTR értékét, majd újra vizsgálom
- MOV A,R3 ;R3-at betöltöm A-ba
- JNZ JUMP4 ;ha nem nulla(ami azt jelenti, hogy már találtam egyező karaktert) akkor elugrok, mert nekem az első karakter címe kell
- ;------------------------EZ NEM TETSZIK NEKI ---------------------------------
- MOVC R6,#DPTR ;ha majd egyezés lesz, innen fogom tudni a kezdőcímet
- ;-----------------------------------------------------------------------------
- JUMP4: INC DPTR ;DPTR növelése -> sztring következő karakter kiválasztása
- INC R3 ;R3 növelése -> alsztring következő karater kiválasztása
- DJNZ R7,JUMP3 ;az alsztring vizsgálandó hosszát eggyel csökkentem, és ha van még karakter, vizsgálom újra
- ;HA IDE ELJUT, AKKOR MEGVAN AZ AlSZTRING A SZTRINGBEN, ÉS R6-BAN PEDIG AZ EGYEZÉS KEZDŐCÍME
- LJMP LOOP
- JUMP5: MOV A, #0
- MOVC A, @A + DPTR ;Betöltöm az A-ba azt az értéket amire a DPTR mutat (#STR ami az alsztring kezdőcíme)
- MOV R6, #A
- LJMP JUMP6 ;Ha NULLA az érték, ahova a DPTR mutat a sztringben, akkor vége a sztringnek, nincs további keresés R6 a sztring végére mutat
- MOV A, #0
- MOV R6, A ;R6-ot ki kell nullázni, mert lehet hogy már beleraktam egy kezdőcímet, és mégsem volt egyezés
- INC DPTR ;a sztring következő karakterére mutatok, mert a jelenlegi nem egyezett
- MOV A,R4 ;ide mentetem el az alsztring hosszát, ezt most visszaállítom
- MOV R2,A ;R2-be visszaállítom az alsztring hosszát(mert lehet hogy már korábban elrontottam)
- LJMP JUMP3 ;JUMP3-ra ugrás, újbóli összehasonlítás
- MAIN: LCALL RUTIN
- LOOP: LJMP LOOP
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement