1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| recherche:
PUSH(LP) |on sauvegarde l'adresse de retour sur la pile
PUSH(BP) |on sauvegarde le cadre de pile precedent
MOVE(SP,BP) |on initialise le cadre de pile courant
PUSH(r1) |sauvegarde du registre r1
PUSH(r2) |sauvegarde du registre r2
PUSH(r3)
PUSH(r4)
PUSH(r5)
PUSH(r6)
PUSH(r7)
PUSH(r8) |sauvegarde du registre DI
PUSH(r9) |sauvegarde du registre SI
LD(BP,-12,r1) |chargement de la taille du tableau dans r1
LD(BP,-16,r9) |chargement de l'adresse du 1er elt du tableau dans SI
LD(BP,-20,r4) |on charge l'element rechercher
MULC(r1,4,r1) | Calcul de l'adresse suivant de dernier element du tableau
SUB(r1,4,r1) |
ADD(r9,r1,r8) | Placement de cette adresse dans DI
bsearch_end :
CMPLT(r8,r9,r2) |si DI<SI, r2=1
BNE(r2,boucle1) |branchement a boucle1 si r2!=0
LD(BP,-12,r1) |chargement de la taille du tableau dans r1
SHRC(r1,1,r1) |on divise le contenu de r1 par 2
MOVE(r1,r7) |transfert de r1 dans r7
MULC(r7,4,r7) |on multiplie par 4
ADD(r9,r7,r7) |on obtient l'adresse du milieu du tableau
LD(r7,0,r3) |on charge le contenu du milieu du tableau
CMPEQ(r3,r4,r5) | on compare le milieu du tableau a l'element, si r3=r4,alors r5=1
BNE(r5,boucle2)
CMPLT(r4,r3,r6) |si r4<r3, r6=1
BNE(r6,boucle3) |branchement a boucle3 si r6!=0
ADDC(r7,4,r7) | l'element suivant devient le milieu du tableau
PUSH(r4) |sauvegarde de l'elt recherché
PUSH(r7) |sauvegarde de l'adresse du milieu du tableau qui devient le 1er elt du tableau
PUSH(r1) |sauvegarde de la taille du tableau
BR(recherche,LP) |nouvel appel de la fonction recherche
DEALLOCATE(3)
boucle1:
SUB(0,1,r0) |on retourne -1
POP(r1)
POP(r2)
POP(r3)
POP(r4)
POP(r5)
POP(r6)
POP(r7)
POP(r8)
POP(r9)
MOVE(BP,SP)
POP(BP)
POP(LP)
JMP(LP,r31)
boucle2:
SUB(r7,r9,r3) |difference entre l'adresse du milieu du tableau et l'adresse du tableau
DIVC(r3,4,r3) |on divise par 4
MOVE(r3,r0)
POP(r1)
POP(r2)
POP(r3)
POP(r4)
POP(r5)
POP(r6)
POP(r7)
POP(r8)
POP(r9)
MOVE(BP,SP)
POP(BP)
POP(LP)
JMP(LP,r31)
boucle3:
PUSH(r4) |sauvegarde de l'elt recherché
PUSH(r9) |sauvegarde de l'adresse du 1er elt du tableau
PUSH(r1) |sauvegarde de la taille du tableau
BR(recherche,LP) |nouvel appel de la fonction recherche
DEALLOCATE(3) |