diff options
Diffstat (limited to 'semestre 3/architecture des ordinateurs')
9 files changed, 601 insertions, 2 deletions
diff --git a/semestre 3/architecture des ordinateurs/2- Programmation en ASM Mips.md b/semestre 3/architecture des ordinateurs/2- Programmation en ASM Mips.md index 67d6823..edc5cd3 100644 --- a/semestre 3/architecture des ordinateurs/2- Programmation en ASM Mips.md +++ b/semestre 3/architecture des ordinateurs/2- Programmation en ASM Mips.md @@ -436,5 +436,3 @@ Les registres `$16` à `$23` ne doivent pas être modifié par un appel de fonct **Voir le mémento pour les conventions de stockage** > [!warning] On garde toujours de la place dans la pile, y compris si on optimise en registre - - diff --git a/semestre 3/architecture des ordinateurs/3- Réalisation physique d'un ordinateur.md b/semestre 3/architecture des ordinateurs/3- Réalisation physique d'un ordinateur.md new file mode 100644 index 0000000..16fbc94 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/3- Réalisation physique d'un ordinateur.md @@ -0,0 +1,57 @@ +--- +tags: + - sorbonne + - informatique + - architecture-des-ordinateurs +semestre: 3 +--- +On s'intéresse à comment on construit un ordinateur +## Logique booléenne +Deux valeurs : vrai (1) ou faux (0) +|> ordre -> 0 < 1 +|> table de vérité est une énumération exhaustive des valeurs possibles d'une fonction booléenne + +Complément = not ($\lnot$), noté par $\bar a$ +Addition = or ($\lor$), noté par $a+b$ +Multiplication = and ($\land$), noté par $a.b$ + +N'importe quelle fonction peut être écrite comme une composition de not, or et and +-> forme un algèbre (ici c'est l'algèbre de Boole) + +**voir le diapo pour la définition formelle** + +> [!warning] L'addition est distributive ! +> $a+(b.c) = (a+b).(a+c)$ +> |> n'est pas le cas dans l'algèbre classique des nombres + +Comment on représente une fonction à partir des éléments élémentaires ? +|> on utilise la forme normale disjonctive (DNF) +|> DNF est une somme de termes où chaque terme contient un produit utilisant tous les paramètres +|> exemple : $\text{DNF}_s = (\bar a.b.c) + (a.\bar b.\bar c) + (a.\bar b.c)$ +|> on la construit en énumérant dans tous les termes une configuration d'entrée telle que $s$ donne $1$ +|> exemple : le DNF précédant indique que $s$ vaut 1 avec $(0,1,1)$, $(1,0,0)$ et $(1,0,1)$ + +Deux fonctions booléennes sont équivalentes ssi elles ont la même table de vérité +|> on dit que la table de vérité est canonique +-> ⚠ ce n'est pas le cas avec l'expression algébrique +|> par contre, si on peut réduire à une expression algébrique commune, alors elles sont aussi équivalentes + +**voir le diapo pour les circuits logiques** + +**rattraper cours sur les graphes et temps de propagation** + +Toutes les opérations sur un bit sont extensibles sur $n$ bits +|> sauf qu'au lieu d'utiliser $1$ opérateur, on en utilise $n$ ! + +Multiplexeur permet de sélectionner une entrée, définition : +```elixir title="définition d'un multiplexeur avec deux entrées" +# la troisième valeur est c, il s'agit de la commande +def mux2(a,b,0), do: a +def mux2(a,b,1), do: b +``` +Formellement, on a : $\text{mux2}(a,b,c) = a.\bar c+b.c$ + +**rattraper fin cours sur les circuits logiques** + +Décodeur converti une entrée $n$ bits en sortie $p$ bits +|> permet de déterminer les adresses, les champs suivants...
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/td/25-11-19.md b/semestre 3/architecture des ordinateurs/td/25-11-19.md new file mode 100644 index 0000000..3153539 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/td/25-11-19.md @@ -0,0 +1,185 @@ +--- +tags: + - sorbonne + - informatique + - architecture-des-ordinateurs + - td +semestre: 3 +--- +Les partiels ne sont pas très bon en général +|> moyenne de 7.1, il y a eu une très bonne note + +--- + +`$31` est géré par le CPU lors d'un `jal` + +```asm +.data +nmt: .word 15, -1, 124 +.text +# main + # moyenne3(n, m, 5) + lui $8, $0, 0x1001 + addiu $29, $29, -16 # pour pouvoir sauvegarder tmp si on ne l'optimise pas + # n + lw $9, 0($8) + sw $9, 0($8) + or $4, $0, $9 + # m + lw $9, 4($8) + sw $9, 4($8) + or $5, $0, $9 + # 9 + ori $9, $0, 5 + sw $9, 8($8) + or $6, $0, $9 + jal moyenne3 + addiu $29, $29, 12 + + # affichage + or $4, $0, $2 + ori $2, $0, 1 + syscall + + # moyenne3(m, 1, m+5) + lui $8, $0, 0x1001 + addiu $29, $29, -12 + # m + lw $9, 4($8) + sw $9, 0($8) + or $4, $0, $9 + # m + ori $9, $0, 1 + sw $9, 4($8) + or $5, $0, $9 + # 9 + lw $9, 4($8) + addiu $9, $9, 5 + sw $9, 8($8) + or $6, $0, $9 + jal moyenne3 + addiu $29, $29, 12 + + # affichage + or $4, $0, $2 + ori $2, $0, 1 + syscall + + # exit + addui $29, $29, 4 + ori $2, $0, 10 + syscall + +moyenne3: + addiu $29, $29, -12 # pour $31, $16 et pour la variable optimisée en registre + sw $31, 4($29) + sw $16, 8($29) + # $4 = p; $5 = q; $6 = r + or $16, $0, $0 + addu $16, $4, $5 + addu $16, $16, $6 + ori $9, $0, 3 + div $16, 3 + mflo $2 + lw $31, 4($29) + lw $16, 8($29) + addiu $29, $29, 8 + jr $31 +``` + +```asm +.data +nml: .word 15, -1, 124 +.text +# main + # moyenne3(n, m, 5) + lui $8, $0, 0x1001 + addiu $29, $29, -16 # pour pouvoir sauvegarder tmp si on ne l'optimise pas + # n + lw $9, 0($8) + sw $9, 0($20) + or $4, $0, $9 + # m + lw $9, 4($8) + sw $9, 4($20) + or $5, $0, $9 + # 9 + ori $9, $0, 5 + sw $9, 8($20) + or $6, $0, $9 + jal moyenne3 + addiu $29, $29, 12 + + # affichage + or $4, $0, $2 + ori $2, $0, 1 + syscall + + # moyenne5(m, 1, m+5, 12, 35) + lui $8, $0, 0x1001 + addiu $29, $29, -20 + # m + lw $9, 4($8) + sw $9, 0($29) + or $4, $0, $9 + # 1 + ori $9, $0, 1 + sw $9, 4($29) + or $5, $0, $9 + # m+5 + lw $9, 4($8) + addiu $9, $9, 5 + sw $9, 8($29) + or $6, $0, $9 + # 12 + ori $9, $0, 12 + sw $9, 12($29) + or $7, $0, $9 + # 35 + ori $9, $0, 35 + sw $9, 16($29) + # on ne peut pas mettre $9 dans $8 car $8 ne contient pas un paramètre de fonction + jal moyenne5 + addiu $29, $29, 20 + + # affichage + or $4, $0, $2 + ori $2, $0, 1 + syscall + + # exit + addui $29, $29, 4 + ori $2, $0, 10 + syscall + +moyenne3: + addiu $29, $29, -12 # pour $31, $16 et pour la variable optimisée en registre + sw $31, 4($29) + sw $16, 8($29) + # $4 = p; $5 = q; $6 = r + or $16, $0, $0 + addu $16, $4, $5 + addu $16, $16, $6 + ori $9, $0, 3 + div $16, 3 + mflo $2 + lw $31, 4($29) + lw $16, 8($29) + addiu $29, $29, 8 + jr $31 + +moyenne5: + addiu $29, $29, -12 # pour $31, $16 et pour la variable optimisée en registre + sw $31, 4($29) + sw $16, 8($29) + lw $10, 28($29) + addu $16, $4, $5 + addu $16, $16, $6 + addu $16, $16, $7 + addu $16, $16, $10 + ori $9, $0, 5 + div $16, 5 + lw $31, 4($29) + lw $16, 8($29) + jr $31 +```
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q1-q2.asm b/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q1-q2.asm new file mode 100644 index 0000000..325e98a --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q1-q2.asm @@ -0,0 +1,65 @@ +.data +ch1: .asciiz "1 exemple d'exemple\n" # @ 0x1001 0000 +ch2: .asciiz "Hello world!\n" # @ 0x1001 0015 +.text +#main + addiu $29, $29, -4 + sw $0, 0($29) + + # printf("%s", ch1) + lui $4, 0x1001 + ori $2, $0, 4 + syscall + # min_to_maj_chaine(ch1) + addiu $29, $29, -4 + lui $4, 0x1001 + sw $4, 0($29) + jal min_to_maj_chaine + # printf("%s", ch1) + lui $4, 0x1001 + ori $2, $0, 4 + syscall + + # printf("%s", ch2) + lui $16, 0x1001 + addiu $16, $16, 0x15 + or $4, $0, $16 + ori $2, $0, 4 + syscall + # min_to_maj_chaine(ch2) + or $4, $0, $16 + sw $4, 0($29) + jal min_to_maj_chaine + # printf("%s", ch2) + or $4, $0, $16 + ori $2, $0, 4 + syscall + + addiu $29, $29, 8 + ori $2, $0, 10 + syscall + +min_to_maj_chaine: + addiu $29, $29, -8 + sw $31, 4($29) +while: + # while ch[i] != 0 + lb $9, 0($4) + beq $9, $0, end_while + # if ch[i] >= 'a' + sltiu $10, $9, 'a' + bne $10, $0, end_if + # if ch[i] <= 'z' + ori $10, $0, 'z' + sltu $10, $10, $9 + bne $10, $0, end_if + # ch[i] - 0x20 + addiu $9, $9, -0x20 + sb $9, 0($4) +end_if: + addiu $4, $4, 1 + j while +end_while: + lw $31, 4($29) + addiu $29, $29, 8 + jr $31
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q3.asm b/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q3.asm new file mode 100644 index 0000000..01d085c --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q3.asm @@ -0,0 +1,51 @@ +.data +ch: .asciiz "1 exemple d'exemple\n" # @ 0x1001 0000 +.text +# main + addiu $29, $29, -8 + # int i = 0 + sw $0, 4($29) + # printf("%s", ch) + lui $16, 0x1001 + or $4, $0, $16 + ori $2, $0, 4 + syscall +while: + # while ch[i] != 0 + lb $9, 0($16) + beq $9, $0, end_while + # ch[i] = min_to_maj_char(ch[i]) + sw $9, 0($29) + or $4, $0, $9 + jal min_to_maj_char + sb $2, 0($16) + # i++ + addiu $16, $16, 1 + j while +end_while: + # printf("%s", ch) + lui $4, 0x1001 + ori $2, $0, 4 + syscall + + addiu $29, $29, 8 + ori $2, $0, 10 + syscall + +min_to_maj_char: + addiu $29, $29, -8 + sw $31, 4($29) + # if ch[i] >= 'a' + sltiu $10, $4, 'a' + bne $10, $0, end_if + # if ch[i] <= 'z' + ori $10, $0, 'z' + sltu $10, $10, $4 + bne $10, $0, end_if + # c - 0x20 + addiu $4, $4, -0x20 +end_if: + lw $31, 4($29) + or $2, $0, $4 + addiu $29, $29, 8 + jr $31
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q4.asm b/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q4.asm new file mode 100644 index 0000000..1fdf443 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme7/exo1-q4.asm @@ -0,0 +1,51 @@ +.data +ch: .asciiz "1 exemple d'exemple\n" # @ 0x1001 0000 +.text +# main + addiu $29, $29, -8 + # int i = 0 + sw $0, 4($29) + # printf("%s", ch) + lui $16, 0x1001 + or $4, $0, $16 + ori $2, $0, 4 + syscall +while: + # while ch[i] != 0 + lb $9, 0($16) + beq $9, $0, end_while + # ch[i] = min_to_maj_char(&(ch[i])) + sw $9, 0($29) + or $4, $0, $16 + jal min_to_maj_ptr_char + # i++ + addiu $16, $16, 1 + j while +end_while: + # printf("%s", ch) + lui $4, 0x1001 + ori $2, $0, 4 + syscall + + addiu $29, $29, 8 + ori $2, $0, 10 + syscall + +min_to_maj_ptr_char: + addiu $29, $29, -8 + sw $31, 4($29) + # if ch[i] >= 'a' + lb $8, 0($4) + sltiu $10, $8, 'a' + bne $10, $0, end_if + # if ch[i] <= 'z' + ori $10, $0, 'z' + sltu $10, $10, $8 + bne $10, $0, end_if + # c - 0x20 + addiu $8, $8, -0x20 + sb $8, 0($4) +end_if: + lw $31, 4($29) + addiu $29, $29, 8 + jr $31 diff --git a/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q1.asm b/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q1.asm new file mode 100644 index 0000000..2f22fd8 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q1.asm @@ -0,0 +1,76 @@ +.data +.text +# main + addiu $29, $29, -36 + sw $0, 32($29) # i = 0 + # ch1 = 0($29) + # ch2 = 16($29) + + or $16, $0, $29 + addiu $17, $29, 16 + + ori $2, $0, 8 + or $4, $0, $16 + ori $5, $0, 16 + syscall + + ori $2, $0, 8 + or $4, $0, $17 + ori $5, $0, 16 + syscall + + # printf("%s", ch1) + or $4, $0, $16 + ori $2, $0, 4 + syscall + # min_to_maj_chaine(ch1) + addiu $29, $29, -4 + or $4, $0, $16 + sw $4, 0($29) + jal min_to_maj_chaine + # printf("%s", ch1) + or $4, $0, $16 + ori $2, $0, 4 + syscall + + # printf("%s", ch2) + or $4, $0, $17 + ori $2, $0, 4 + syscall + # min_to_maj_chaine(ch2) + or $4, $0, $17 + sw $4, 0($29) + jal min_to_maj_chaine + # printf("%s", ch2) + or $4, $0, $17 + ori $2, $0, 4 + syscall + + addiu $29, $29, 8 + ori $2, $0, 10 + syscall + +min_to_maj_chaine: + addiu $29, $29, -8 + sw $31, 4($29) +while: + # while ch[i] != 0 + lb $9, 0($4) + beq $9, $0, end_while + # if ch[i] >= 'a' + sltiu $10, $9, 'a' + bne $10, $0, end_if + # if ch[i] <= 'z' + ori $10, $0, 'z' + sltu $10, $10, $9 + bne $10, $0, end_if + # ch[i] - 0x20 + addiu $9, $9, -0x20 + sb $9, 0($4) +end_if: + addiu $4, $4, 1 + j while +end_while: + lw $31, 4($29) + addiu $29, $29, 8 + jr $31 diff --git a/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q2.asm b/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q2.asm new file mode 100644 index 0000000..92a960e --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q2.asm @@ -0,0 +1,59 @@ +.data +# on n'utilise pas cette chaîne, mais elle fait partie du code +ch: .asciiz "1 exemple d'exemple\n" # @ 0x1001 0000 +.text +# main + addiu $29, $29, -24 + # int i = 0 + sw $0, 20($29) + # ch = 4($29) + addiu $16, $29, 4 + ori $2, $0, 8 + or $4, $0, $16 + ori $5, $0, 16 + syscall + # printf("%s", ch) + or $4, $0, $16 + ori $2, $0, 4 + syscall + + or $17, $0, $16 +while: + # while ch[i] != 0 + lb $9, 0($17) + beq $9, $0, end_while + # ch[i] = min_to_maj_char(ch[i]) + sw $9, 0($29) + or $4, $0, $9 + jal min_to_maj_char + sb $2, 0($17) + # i++ + addiu $17, $17, 1 + j while +end_while: + # printf("%s", ch) + or $4, $0, $16 + ori $2, $0, 4 + syscall + + addiu $29, $29, 24 + ori $2, $0, 10 + syscall + +min_to_maj_char: + addiu $29, $29, -8 + sw $31, 4($29) + # if ch[i] >= 'a' + sltiu $10, $4, 'a' + bne $10, $0, end_if + # if ch[i] <= 'z' + ori $10, $0, 'z' + sltu $10, $10, $4 + bne $10, $0, end_if + # c - 0x20 + addiu $4, $4, -0x20 +end_if: + lw $31, 4($29) + or $2, $0, $4 + addiu $29, $29, 8 + jr $31 diff --git a/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q3.asm b/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q3.asm new file mode 100644 index 0000000..2b1d363 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme7/exo2-q3.asm @@ -0,0 +1,57 @@ +.data +.text +# main + addiu $29, $29, -24 + # int i = 0 + sw $0, 20($29) + # ch = 4($29) + addiu $16, $29, 4 + ori $2, $0, 8 + or $4, $0, $16 + ori $5, $0, 16 + syscall + # printf("%s", ch) + or $4, $0, $16 + ori $2, $0, 4 + syscall + + or $17, $0, $16 +while: + # while ch[i] != 0 + lb $9, 0($17) + beq $9, $0, end_while + # ch[i] = min_to_maj_char(&(ch[i])) + sw $9, 0($29) + or $4, $0, $17 + jal min_to_maj_ptr_char + # i++ + addiu $17, $17, 1 + j while +end_while: + # printf("%s", ch) + or $4, $0, $16 + ori $2, $0, 4 + syscall + + addiu $29, $29, 24 + ori $2, $0, 10 + syscall + +min_to_maj_ptr_char: + addiu $29, $29, -8 + sw $31, 4($29) + # if ch[i] >= 'a' + lb $8, 0($4) + sltiu $10, $8, 'a' + bne $10, $0, end_if + # if ch[i] <= 'z' + ori $10, $0, 'z' + sltu $10, $10, $8 + bne $10, $0, end_if + # c - 0x20 + addiu $8, $8, -0x20 + sb $8, 0($4) +end_if: + lw $31, 4($29) + addiu $29, $29, 8 + jr $31 |
