.data 0x10010000 # data segment, at 0x1001 0000 .space 256 # tableau des caractères pour les fréquences : à .data + 0 .ascii " => " # chaîne de caractères à afficher : à .data + 256 .byte 0 # fin de la chaîne de caractères : à .data + 256 + 4 .byte '\n', 0 # octets pour fin de ligne et fin de chaîne : à .data + 256 + 5 = 261 .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, 263 # $a0 <- poème addiu $a1, $s0, 0 # $a1 <- fréquences # appel de fonction avec link = $ra contient l'adresse de retour jal compute_frequencies # appel de fonction avec link = $ra contient l'adresse de retour addiu $a0, $s0, 0 # $a0 <- adresse du tableau fréquences jal print_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 du caractère en $a0 addiu $v0, $zero, 11 # $v0 <- 11 (afficher caractère en $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 # print frequencies # $a0: fréquences print_frequencies: # réservation espace pour 4 variables (16 octets) dans la pile ($ra, $s1, $s2, et $s3) addiu $sp, $sp, -16 sw $ra, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $s3, 12($sp) # $s1 pour adresse fréquence, $s2 pour i de la boucle, $s3 pour l'adresse du poème addiu $s1, $a0, 0 # $s1 <- fréquences addiu $s2, $zero, 0 # $s2 <- indice i = 0 addiu $s3, $zero, 256 # $s3 <- 256 = taille du tableau fréquences blpf: # before loop print frequencies beq $s2, $s3, alpf # si $s2 = taille du tableau fréquences alors saut à la fin addu $t0, $s1, $s2 # $t0 <- $s1 + $s2 (adresse de fréquences[i]) lbu $a1, ($t0) # $a1 <- fréquences[i] beq $a1, $zero, increment addiu $a0, $s2, 0 # a0 <- i # appel de fonction jal print_frequency increment: addiu $s2, $s2, 1 # incrément de i b blpf # retour au début de la boucle alpf: # after loop print frequencies # récupération espace des 4 variables (16 octets) dans la pile ($ra, $s1, $s2, et $s3) lw $ra, 0($sp) lw $s1, 4($sp) lw $s2, 8($sp) lw $s3, 12($sp) addiu $sp, $sp, 16 jr $ra # print a frequency # a0: indice i pour le caractère à afficher # a1: fréquence à afficher print_frequency: # réservation espace pour 3 variables (-12) dans la pile pour mettre $ra, $a0, $a1 addiu $sp, $sp, -12 sw $ra, 0($sp) sw $a0, 4($sp) sw $a1, 8($sp) # affichage du caractère, qui est dans $a0 (pas besoin de "lw $a0, 4($sp)") addiu $v0, $zero, 11 syscall # affichage de la chaîne de caractères " => " lui $a0, 0x1001 # upper immediate of data segment addiu $a0, $a0, 256 # adresse de la chaîne de caractères " => " addiu $v0, $zero, 4 # appel système affichage d'une chaîne de caractères syscall # affichage de l'entier de la fréquence lw $a0, 8($sp) # récupération de la fréquence (paramètre $a1) addiu $v0, $zero, 1 syscall # affichage de la chaîne de caractères "\n" lui $a0, 0x1001 # upper immediate of data segment addiu $a0, $a0, 261 # adresse de la chaîne de caractères "\n" addiu $v0, $zero, 4 syscall # récupération de $ra, $a0, $a1 et de l'espace (+12) lw $ra, 0($sp) lw $a0, 4($sp) lw $a1, 8($sp) addiu $sp, $sp, 12 jr $ra