zadání: V zadaném řetězci program určí počty slov se stejnou délkou. Počty uloží do paměti v desítkové soustavě.

V zadaném řetězci program určí počty slov se stejnou délkou. Počty uloží do paměti v desítkové soustavě.

1.Řešení

V paměti si alokujeme místo o velikosti 30 bajtů, do něj budeme ukládat počty slov, kde index v poli značí délku slova a hodnota uložená na tom indexu značí počet slov o této délce. Vezmeme adresu řetězce, uložíme si jí do registru, načteme první znak a spustíme cyklus. Ten běží dokud nenarazí na mezeru nebo konec řetězce a přičítá si délku slova. Když narazí na mezeru nebo konec řetězce, skočí na návěští uloz, kde se vezme adresa pole,přičte se k ní hodnota počítadla zmenšená o jedničku. Tím máme adresu bajtu v poli, ve kterém zvýšíme hodnotu o jedna. To se provede tak, že původní hodnotu uložíme do registru, přičteme k ní jedničku a uložíme zpět do paměti. Následně se zkontroluje zda poslední znak je konec řetězce, pokud ano,program skočí na konec, pokud ne, vynuluje se počítadlo délky slova, načte se další znak řetězce a skočí se zpět do smyčky.

2.Paměť a registry

V paměti leží uložen řetězec na symbolické adrese TEXT a je v ní vytvořeno pole o velikosti 30 bajtů na adrese POLE. Registr ER0 je používán k uchování aktuální adresy v řetězci, ER1 je používán jako počítadlo délky slova, registr ER2 je používán k uchování adresy prvku v poli,do kterého budeme zapisovat počet slov o délce určené počítadlem. R7H uchovává aktuální načtený znak, R3L obsahuje počet již dříve načtených slov, který se zvýší o jedna a uloží zpět.

.h8300s
.data             ; začátek datové sekce

TEXT:   .asciz  "A A A AA AAA BBB"
POLE:   .space 30                 ; pole pro uchovani hodnot
.text             ; začátek kódové sekce
.global _start    ; _start je globální návěští

_start:
        MOV.L   #TEXT, ER0      ;presunu odkaz na zacatek textu
        xor.l ER7,ER7           ;vymazu registru pro ukladani poctu..
        xor.l ER1,ER1
        xor.l ER2,ER2
        xor.l ER3,ER3
        xor.l ER4,ER4
        xor.l ER5,ER5
        xor.l ER6,ER6
smycka: MOV.B   @ER0, R7H       ;nactu prvni znak
        CMP.B   #0, R7H         ;kdyz je to znak konce textu
        BEQ     ULOZ                    ;skocim do ukladani
        CMP.B   #' ', R7H       ;kdyz je to znak mezery
        BEQ     ULOZ                    ;tak je cas ulozit to
        add.l   #1,ER1          ;pridame jednicku k pocitadlu
        INC.L   #1, ER0         ;posuneme ukazatel ER0 na dalsi znak
        BRA     smycka                  ;zopakuji smycku

ULOZ:   MOV.L   #POLE, ER2      ;nactu adresu pole
        ADD.L   #-1,ER1         ;korekce pocitadla vzhledem k indexu 0
        ADD.L   ER1, ER2        ;posunu se na spravny byte
        MOV.B   @ER2, R3L       ;nactu hodnotu
        ADD.B   #1,R3L          ;zvysim pocet slov o teto delce
        mov.b   R3L,@ER2        ;ulozim hodnotu do pameti
        CMP.B   #0, R7H         ;zjistim zda jsem nedosahl konce textu
        BEQ KON                         ;pokud ano,ukoncim
        XOR.L ER1,ER1           ;pokud ne,vymazu pocitadlo
        INC.L   #1, ER0         ;a posunu se v retezci o znak
        BRA smycka                      ;a skocim zpet do smycky

KON:    bra     KON       ; nekonečná smyčka na konci
        .end

Ke stažení jako zdrojový kod + dokumentace :POT.zip