.data 0x10010000 # force at 0x1001 0000 .space 256 # array of 256 caracters at .data + 0 .ascii " => " # .data + 256 .byte 0 .byte '\n', 0 # .data + 256 + 5 = 261 .ascii "Avec ses quatre dromadaires\n" # .data + 261 + 2 = 263 .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 .text # .text = code lui $s0, 0x1001 # upper immediate of data segment addiu $a0, $s0, 263 # $a0 <- poeme addiu $a1, $s0, 0 # $a1 <- frequences jal compute_frequencies addiu $a0, $s0, 0 # $a1 <- frequences jal print_frequencies # exit program addiu $v0, $zero, 10 syscall # compute frequencies # a0: string # a1: array of frequencies compute_frequencies: addiu $sp, $sp, -12 sw $ra, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) addu $s1, $zero, $a0 # $s1 <- string addu $s2, $zero, $a1 # $s2 <- frequencies # for(s1 = poeme; s1[0] != 0; s1 ++) { # freq[s1[0]] ++; # } _lcf: lbu $a0, ($s1) # $a0 <- s1[0] # if(s1[0] == 0) goto end beq $a0, $zero, _alcf # freq[s1[0]] ++ addu $t0, $s2, $a0 # $t0 <- freq + s1[0] lbu $t1, ($t0) # $t1 <- freq[s1[0]] addiu $t1, $t1, 1 # $t1 <- freq[s1[0]] + 1 sb $t1, ($t0) # freq[s1[0]] ++ addiu $v0, $zero, 11 # $v0 <- 11 (print character in $a0) syscall # s1++ addiu $s1, $s1, 1 j _lcf _alcf: lw $ra, 0($sp) lw $s1, 4($sp) lw $s2, 8($sp) addiu $sp, $sp, 12 jr $ra # $a0: array of frequencies print_frequencies: addiu $sp, $sp, -16 sw $ra, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $s3, 12($sp) addiu $s1, $a0, 0 # freq addiu $s2, $zero, 0 # i addiu $s3, $zero, 256 # 256 _pf: beq $s2, $s3, _apf addu $t0, $s1, $s2 lbu $a1, ($t0) beq $a1, $zero, _pfn addiu $a0, $s2, 0 jal print_frequency _pfn: addiu $s2, $s2, 1 b _pf _apf: lw $ra, 0($sp) lw $s1, 4($sp) lw $s2, 8($sp) lw $s3, 12($sp) addiu $sp, $sp, 16 jr $ra # a0: char # a1: freq print_frequency: addiu $sp, $sp, -8 sw $ra, 0($sp) sw $a1, 4($sp) addiu $v0, $zero, 11 syscall lui $a0, 0x1001 # upper immediate of data segment addiu $a0, $a0, 256 # " => " addiu $v0, $zero, 4 syscall lw $a0, 4($sp) addiu $v0, $zero, 1 syscall lui $a0, 0x1001 # upper immediate of data segment addiu $a0, $a0, 261 # "\n" addiu $v0, $zero, 4 syscall lw $ra, 0($sp) addiu $sp, $sp, 8 jr $ra