Last active
February 14, 2018 15:02
-
-
Save emilydelorme/0769d1720c45d19b2d5784ee00744e6e to your computer and use it in GitHub Desktop.
TP3 ILM
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.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