Algorytm jest mało efektywny, ale tutaj nie jest to istotne, bo liczba znaków w linii jest niewielka
wykorzystywane rejestry:
int iptr => $a0 int jptr => $al int cnt => $a2 int ch => $a3
int mfc => $v0, wartość zwracana int mfccnt => $vl
char at jptr |
=> $t0 | |||
ir: |
subu $sp, $sp, 224 sw $ra, 20($sp) |
# |
miejsce na ramkę stosu | |
li $vl, 0 |
# |
mfccnt = 0 | ||
add $tl, $sp, 24 |
# |
zapisać w $tl wskaźnik do tablicy |
lin« | |
move $a0, $tl |
# |
argument: $a0 <= $tl | ||
li $v0, 8 |
# |
usługa: read_string | ||
li Sal, 200 syscall |
# |
maksymalna liczba znaków w linii: |
200 | |
move $a0, $tl |
# |
iptr = adres line[0] | ||
iloop: |
lb $a3, ($a0) |
# |
ch = znak_wskazywany_przez iptr | |
beqz $a3, endiloop |
# |
przerwać gdy ch jest NUL | ||
li $a2, 0 |
# |
cnt=0 | ||
move $al, $tl |
# |
jptr = adres line[0] | ||
jloop: |
lb $t0, (Sal) |
# |
jch = znak_wskazywany_przez jptr | |
beqz $t0, endjloop |
# |
przerwać, gdy jch jest NUL | ||
bne $t0, $a3, jincr |
# |
skok, gdy ch != jch | ||
addi $a2, $a2, 1 |
# |
kolejne wystąpienie, więc cnt++ | ||
jincr: |
addi $al. Sal, 1 |
# |
jptr++ | |
b jloop |
# |
zapętlić dla nowej wartości jptr | ||
endjloop: |
bgt $vl, Ja2, iincr |
# |
if mfccnt > cnt, pominąć aktualizację | |
move $vl, $a2 |
# |
aktualizacja: mfccnt = cnt | ||
move $v0, $a3 |
# |
aktualizacja: mfc = ch | ||
iincr: |
addi $a0, $a0, 1 |
# |
iptr++ | |
b iloop |
# |
zapętlić dla nowej wartości iptr | ||
endiloop: endoffunc: |
lw $ra, 20(Ssp) |
# |
odtworzenie adresu powrotnego | |
addu $sp, $sp, 224 |
# |
zniszczenie ramki stosu | ||
jr Sra |
# |
powrót z funkcji |
char line[200] => 24($sp), rozmiar 200 bajtów pointer to line[0] => $tl
char mostfreqchar(void)
{
char line[200]; # lokalna tablica 200 znaków
>