Advertisement
Jobjob

Recherche dichotomique MIPS

May 25th, 2013
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. .data
  2. tab:
  3. .word 1
  4. .word 7
  5. .word 19
  6. .word 223
  7. .word 511
  8. .word 517
  9. .word 603
  10. .word 1020
  11. .word 1011
  12. .word 1022
  13.  
  14. .text
  15. main:
  16. la $a0, tab # chargement de l'adresse de la première cellule du tableau dans $a0
  17. li $a1, 0 # chargement de l'index du premier element du tablau (0 of course) dans $a1
  18. li $a2, 9 # chargement de l'index du dernier element du tableau taille du talbeau -1 == 9 dans $a2
  19. li $a3, 603 # chargement de la valeur recherchee dans $a3 ici $a3 = 603
  20.  
  21. addi $sp, $sp, -4
  22. sw $ra, 0($sp)
  23.  
  24. jal recherche # appel de recherche
  25.  
  26. lw $ra, 0($sp)
  27. addiu $sp, $sp, 4
  28. jr $ra
  29.  
  30. recherche:
  31. bgt $a1, $a2, error # si $a1 > $a2, la recherche est impossible donc on branche a error:
  32.  
  33. sub $t0, $a2, $a1 # $t0 = $a1+($a2-$a1)/2
  34. srl $t0, $t0, 1 # decalage de 1 bit vers la droite (divise par 2)
  35. add $t0, $t0, $a1 # $t0 contient maintenant l'index du milieu du tableau
  36.  
  37. addiu $sp, $sp, -8 # on deplace le pointeur de pile de 8
  38.  
  39. sw $ra, 0($sp) # on sauve l'adresse de retour avec un offset de 0
  40. sw $t0, 4($sp) # on sauve l'index du milieu du tableau avec un offset de 4
  41.  
  42. sll $t0, $t0, 2 # decalage de 2 bits vers la gauche (multiplie par 4)
  43. add $t0, $t0, $a0 # addition de $t0 avec l'adresse du début du tableau
  44.  
  45. lw $t1, 0($t0) # on charge la valeur qui est stockee à l'adresse $t0 du tableau
  46.  
  47. beq $a3, $t1, found # cas ou la valeur contenue dans $t1 est egale a la valeur recherchee (contenue dans $a3)
  48. # branchement à found:
  49.  
  50. blt $a3, $t1, rec1 # cas ou la valeur contenue dans $t1 est plus grand que la valeur recherchee (contenue dans $a3)
  51. # branchement à rec1:
  52.  
  53. bgt $a3, $t1, rec2 # cas ou la valeur contenue dans $t1 est plus petite que la valeur recherchee (contenue dans $a3)
  54. # branchement à rec2:
  55.  
  56. # cas ou $a1 > $a2
  57. error:
  58. li $v0, -1 # chargement de la valeur -1 dans le registre de retour de fonction $v0 ce qui indique que l'element
  59. # n'a pas été trouvé
  60. jr $ra
  61.  
  62. # cas ou la valeur contenue dans $t1 est egale a la valeur recherchee (contenue dans $a3)
  63. found:
  64. lw $v0, 4($sp) # chargement de la valeur de l'index dans le registre $v0
  65. lw $ra, 0($sp) # chargement de l'adresse de retour dans le registre $ra
  66. addiu $sp, $sp, 8 # on remet le pointeur de pile à sa position d'origine
  67. jr $ra
  68.  
  69. # cas ou la valeur contenue dans $t1 est plus grand que la valeur recherchee
  70. rec1:
  71. lw $a2, 4($sp) # chargement de l'index de moitie du tableau dans le registre $a2 qui est le parametre du haut du
  72. # tableau
  73. addiu $a2, $a2, -1 # paramétrage du registre $a2 pour l'appel recursif
  74.  
  75. jal recherche # appel recursif
  76.  
  77. lw $ra, 0($sp) # chargement de l'adresse de retour dans le registre $ra
  78. addiu $sp, $sp, 8 # on remet le pointeur de pile à sa position d'origine
  79. jr $ra
  80.  
  81. # cas ou la valeur contenue dans $t1 est plus petite que la valeur recherchee
  82. rec2:
  83. lw $a1, 4($sp) # chargement de l'index de moitie du tableau dans le registre $a1 qui est le parametre du haut du
  84. # tableau
  85. addiu $a2, $a2, 1 # paramétrage du registre $a2 pour l'appel recursif
  86.  
  87. jal recherche # appel recursif
  88.  
  89. lw $ra, 0($sp) # chargement de l'adresse de retour dans le registre $ra
  90. addiu $sp, $sp, 8 # on remet le pointeur de pile à sa position d'origine
  91. jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement