- Assembly konzultacio 1. - Irta Kaproncai Tamas [tomcat@szif.hu] Mivel a junius 9.-i vizsga - annak ellenere, hogy minden feladat szerepelt mar valamelyik vizsgan - nagyon gyengen sikerult, ezert kozreadjuk a feladatsor megoldasat is. (Holnap mar az elso 2 feladat is elerheto lesz). ; 3. Irjunk olyan eljarast, amely ket, egyenkent legfeljebb 60 karakteres, csak ; szamjegyeket tartalmazo hosszbajtos karaktersorozat osszeget, azaz a nekik ; megfelelo szamok osszeget abrazolo karaktersorozatot eloallitja. A karak- ; tersorozatokra mutatnak az SI, DI regiszterek, az eredmeny helyere pedig a ; BX. Megjegyzes: A "szamjegyek" jobbrol balra haladvan ertelmezendoek, pl. ; az 1023-nak megfelelo karaktersorozat: 4,"3201" ; Ezen megoldas elve: ; AL regiszter tartalmazza az elozo jegyek osszeadasabol szarmazo maradekot, ; azaz AL= 1 vagy 0. Ehhez adjuk hozza mindket szam soron kovetkezo jegyet, ; de csak akkor, ha van meg egyaltalan jegye az adott szamnak. ORG 100H ; kis .COM program az eljaras kiprobalasahoz: MOV SI,Szam1 ; egyik karaktersorozat cime -> SI MOV DI,Szam2 ; masik karaktersorozat cime -> DI MOV BX,Osszeg ; eredmeny karaktersorozat cime -> BX CALL Osszead ; az eljaras meghivasa MOV SI,Osszeg ; az eredmeny kiirasa a kepernyore: MOV CH,0 ; a hosszat a CX regiszterben szamlaljuk MOV CL,[SI] INC SI Kiir: MOV DL,[SI] ; a karaktereket egyenkent a 2-es DOS INC SI ; funkcioval iratjuk a kepernyore MOV AH,2 INT 21H LOOP Kiir ; amig van meg karakter, addig fut a ciklus MOV AX,4C00H ; normal kilepes a programbol INT 21H Osszead: ; a feladat megoldasa: az osszeado eljaras PUSHA ; elmentjuk a regiszterek kezdeti allapotat PUSH BX ; eredmeny hosszbajtjanak cimet eltaroljuk INC BX ; az osszeg elso jegye BX+1 cimre fog kerulni MOV CL,[SI] ; az egyik szam hosszat a CL-ben szamoljuk INC SI MOV CH,[DI] ; a masik szam hosszat a CH-ban szamoljuk INC DI MOV AL,0 ; AL-ben lesz a maradek, kezdetben ez nulla MOV BP,60 ; max. 60 karakteresek lehetnek a szamok .ciklus: JCXZ .vege ; ha midket hossz (CX) nulla, akkor kesz CMP CL,0 ; ha egyik szam jegyei elfogytak, akkor JZ .nul1 ; azt mar nem kell hozzaadni a masikhoz ADD AL,[SI] ; az adott jegy osszegzese INC SI ; lepes a kovetkezo jegyre SUB AL,'0' ; mivel ez ASCII kod volt, le kell meg vonnunk DEC CL ; az egyik hossz csokkentese .nul1: CMP CH,0 ; ha a masik szam jegyei elfogytak, akkor JZ .nul2 ; azt mar nem kell hozzaadni a egyikhez ADD AL,[DI] ; az adott jegy osszegzese INC DI ; lepes a kovetkezo jegyre SUB AL,'0' ; mivel ez ASCII kod volt, le kell meg vonnunk DEC CH ; a masik hossz csokkentese .nul2: MOV AH,AL ; az osszeg attoltese AH regiszterbe, mert AL ; regiszterbe a maradekot kell tolteni MOV AL,0 ; tfh. a maradek nulla CMP AH,10 ; volt-e atvitel (maradek) JB .oke ; ha nem, akkor tovabb, a felteves helyes volt MOV AL,1 ; van atvitel -> maradek legyen 1 SUB AH,10 ; a kiirando szamjegy korrigalasa .oke: ; a kiszamolt szamjegy letarolasa: ADD AH,'0' ; a szamjegy ASCII kodda valo visszaallitasa MOV [BX],AH ; a kialakult szamjegy eredmenybe helyezese INC BX DEC BP ; ha meg nem ertuk el a max. (60) karaktert, JNZ .ciklus ; akkor feldolgozhatjuk a kovetkezo jegyet .vege: ; a szamjegyek elfogytak: CMP AL,0 ; ha nincs maradek, akkor kesz vagyunk JZ .vege2 MOV BYTE [BX],'1' ; egyebkent egy 1-es jegyet irunk meg INC BX ; az eredmeny karaktersorozataba .vege2: ; az eredmeny hosszbajtjanak kiszamolasa: POP DI ; a hoszbajt helyet elovesszuk a verembol SUB BX,DI ; ezt kivonjuk az eredmeny sztring vegebol DEC BX ; a hossz bajt nem tartozik bele a hosszba, MOV [DI],BL ; ezert eggyel kevesebet irunk be hossznak POPA ; regiszterek kezdeti ertekenek visszaallitasa RETN ; az eljaras vege Szam1 DB 4,"3201" ; egyik proba szam Szam2 DB 9,"989898989" ; masik proba szam section .bss ; az eredmenynek foglalt hely: Osszeg RESB 62 ; 61 karakter + hosszbajt = 62 bajt ; 4. A Fibonacci-fele szamok definicioja f1=f2=1, f(n+2)=f(n+1)+fn ha n>1. ; Hatarozzuk meg f100-t! ; Ezen megoldas elve: ; Az elozo feladat szamformatumat es osszeado eljarasat hasznaljuk fel ennek a ; nagy szamnak a kiszamolasara. Az egyszeruseg kedveert a foprogram csak paros ; indexekre mukodik (100 ugyis paros). SZAM EQU 100 ; Konstanskent kiemeljuk az eredmeny indexet ORG 100H MOV SI,Szam1 ; f1 es f2 beallitasa 1-re: MOV DI,Szam2 MOV BYTE [SI],1 ; egyik hosszbajt: 1 MOV BYTE [DI],1 ; masik hosszbajt: 1 MOV BYTE [SI+1],'1' ; egyik szam erteke: 1 MOV BYTE [DI+1],'1' ; masik szam erteke: 1 MOV CX,(SZAM-2)/2 ; a ciklus eloszor f3-t es f4-t szamolja ki Ciklus: MOV SI,Szam1 MOV DI,Szam2 MOV BX,Szam1 ; egyik szam helyere kerul az eredmeny CALL Osszead MOV SI,Szam1 MOV DI,Szam2 MOV BX,Szam2 ; masik szam helyere kerul az eredmeny CALL Osszead LOOP Ciklus ; f100-hoz osszesen 49-szer fut le a ciklus MOV SI,Szam2 ; az eredmeny kepernyore irasa MOV CH,0 MOV CL,[SI] INC SI Kiir: MOV DL,[SI] INC SI MOV AH,2 INT 21H LOOP Kiir MOV AX,4C00H ; normal kilepes INT 21H Osszead: ; SI: egyik karaktersorozat cime PUSHA ; DI: masik karaktersorozat cime ; BX: eredmeny karaktersorozat cime PUSH BX INC BX MOV CL,[SI] INC SI MOV CH,[DI] INC DI MOV AL,0 MOV BP,60 .ciklus: JCXZ .vege CMP CL,0 JZ .nul1 ADD AL,[SI] INC SI SUB AL,'0' DEC CL .nul1: CMP CH,0 JZ .nul2 ADD AL,[DI] INC DI SUB AL,'0' DEC CH .nul2: MOV AH,AL MOV AL,0 CMP AH,10 JB .oke MOV AL,1 SUB AH,10 .oke: ADD AH,'0' MOV [BX],AH INC BX DEC BP JNZ .ciklus .vege: CMP AL,0 JZ .vege2 MOV BYTE [BX],'1' INC BX .vege2: POP DI SUB BX,DI DEC BX MOV [DI],BL POPA RETN section .bss ; Helyfoglalas a ket max. 60 karakter hosszu szamnak Szam1 RESB 61 ; 60 karakter + hosszbajt = 61 karakter Szam2 RESB 61