Skip to content

Instantly share code, notes, and snippets.

@emilydelorme
Last active February 14, 2018 15:02
Show Gist options
  • Save emilydelorme/0769d1720c45d19b2d5784ee00744e6e to your computer and use it in GitHub Desktop.
Save emilydelorme/0769d1720c45d19b2d5784ee00744e6e to your computer and use it in GitHub Desktop.
TP3 ILM
.equ PRINT_INT, 1
.equ PRINT_STRING, 4
.equ READ_INT, 5
.equ EXIT, 10
.text
####################################
# Fonction rechercheDichotomique() #
####################################
# r8 -> pos
# r9 ->&tab[pos]
# r10 ->tab[pos]
rechercheDichotomique:
#Init
subi sp, sp, 16 # Reservation de 3 entier (int) -> pile
# Save des contenu des registres
stw r8, 0(sp)
stw r9, 4(sp)
stw r10, 8(sp)
# Sauvegarde la valeur de retour
stw ra, 12(sp)
# Init de pos à 0
add r8, zero, zero
#if(debut > fin)
bge r7, r6, rechercheDichotomique_continue1
addi r2, r0, -1
br return
rechercheDichotomique_continue1:
# pos = debut + (fin-debut) / 2
sub r8,r7,r6
srli r8, r8, 1
add r8, r6, r8
# pos*4 car tab de int
slli r9, r8, 2
add r9, r5, r9
ldw r10, 0(r9)
#if(tab[pos] == val)
bne r10, r4, rechercheDichotomique_continue2
call found
rechercheDichotomique_continue2:
#if( tab[pos] < val)
bge r10, r4, rechercheDichotomique_continue3
addi r8, r8, 1
call rechercheDichotomique
br return
rechercheDichotomique_continue3:
subi r7, r8, 1
call rechercheDichotomique
br return
found:
addi r2, r8, 0
br return
return:
# Remet les valeurs précedentes dans les registres
ldw r8, 0(sp)
ldw r9, 4(sp)
ldw r10, 8(sp)
# enregistre la valeur de retour and le registre r2 (registre de retour)
ldw ra, 12(sp)
addi sp, sp, 16
ret
##############################
# Fonction main() #
##############################
# r4 -> valeur
# r5 -> pointeur sur tab
# r6 -> début du tab
# r7 -> fin du tab
.globl main
main:
boucle:
# While true
bne r0,r0, fin_boucle
# Imprime "Entrez un nombre: "
movia r4, msgNb
addi r2, zero, PRINT_STRING
trap
addi r4, r2, 0
movia r5, tableau
# Tab 0 -> 99 (Taille 100)
addi r6, r0, 0
addi r7, r0, 99
# Lit un nombre
addi r2, zero, READ_INT
trap
call rechercheDichotomique # registre de retourn -> r2
movia r3, pos
stw r2, 0(r3)
#if(pos<0)
bge r2, r0, elseMain
movia r4, msgErreur
addi r2, zero, PRINT_STRING
trap
br boucle
elseMain:
#printf -> La position du nombre est:
movia r4, msgPos
addi r2, zero, PRINT_STRING
trap
#printf -> position
movia r3, pos
ldw r4, 0(r3)
addi r2, zero, PRINT_INT
trap
br boucle
fin_boucle:
# Ne rien faire si le while est finit
.data
# Valeurs ajoutée:
pos: .skip 4
# Autres Valeurs
msgNb: .asciz "Entrez un nombre: \n"
msgErreur: .asciz "Nombre non trouve.\n"
msgPos: .asciz "La position du nombre est: "
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment