.data 0x10010000 # data segment, at 0x1001 0000 .space 256 # tableau des caractères pour les fréquences a .data + 0 .ascii "Avec ses quatre dromadaires\n" .ascii "Don Pedro d'Alfaroubeira\n" .ascii "Courut le monde et l'admira.\n" .ascii "Il fit ce que je voudrais faire\n" .ascii "Si j'avais quatre dromadaires.\n" .byte 0 # zéro de fin de chaîne de caractères .text # code segment lui $s0, 0x1001 # load address of data segment addiu $a0, $s0, 256 # $a0 <- poème addiu $a1, $s0, 0 # $a1 <- fréquences # appel de fonction avec link = $ra contient l'adresse de retour jal compute_frequencies # exit program addiu $v0, $zero, 10 syscall # compute frequencies # a0: poème # a1: fréquences compute_frequencies: # réservation espace pour 3 variables (12 octets) dans la pile ($s1, $s2, et $ra) addiu $sp, $sp, -12 # sauvegarde de $ra, $s1, et $s2 sw $ra, 0($sp) # sauvegarde $ra en $sp + 0 sw $s1, 4($sp) # sauvegarde $s1 en $sp + 4 sw $s2, 8($sp) # sauvegarde $s2 en $sp + 8 # dans la fonction, on garde l'utilisation de $s1 et $s2 addu $s1, $zero, $a0 # $s1 <- poème addu $s2, $zero, $a1 # $s2 <- fréquences blcf: lbu $a0, ($s1) # $a0 <- s1[0] # if(s1[0] == 0) goto end beq $a0, $zero, alcf # fréquences[s1[0]] ++ addu $t0, $s2, $a0 # $t0 <- fréquences + s1[0] lbu $t1, ($t0) # $t1 <- fréquences[s1[0]] addiu $t1, $t1, 1 # $t1 <- fréquences[s1[0]] + 1 sb $t1, ($t0) # $t1 -> fréquences[s1[0]] # affichage addiu $v0, $zero, 11 # $v0 <- 11 (print character in $a0) syscall # s1++ addiu $s1, $s1, 1 j blcf alcf: # récupération de $ra, $s1, et $s2 lw $ra, 0($sp) # récupération de $ra à partir de $sp + 0 lw $s1, 4($sp) # récupération de $s1 à partir de $sp + 4 lw $s2, 8($sp) # récupération de $s2 à partir de $sp + 8 # récupération espace des 3 variables (12 octets) dans la pile ($s1, $s2, et $ra) addiu $sp, $sp, 12 jr $ra