aboutsummaryrefslogtreecommitdiff
path: root/semestre 3/architecture des ordinateurs
diff options
context:
space:
mode:
Diffstat (limited to 'semestre 3/architecture des ordinateurs')
-rw-r--r--semestre 3/architecture des ordinateurs/2- Programmation en ASM Mips.md2
-rw-r--r--semestre 3/architecture des ordinateurs/3- Réalisation physique d'un ordinateur.md57
-rw-r--r--semestre 3/architecture des ordinateurs/td/25-11-19.md185
-rw-r--r--semestre 3/architecture des ordinateurs/tme/tme7/exo1-q1-q2.asm65
-rw-r--r--semestre 3/architecture des ordinateurs/tme/tme7/exo1-q3.asm51
-rw-r--r--semestre 3/architecture des ordinateurs/tme/tme7/exo1-q4.asm51
-rw-r--r--semestre 3/architecture des ordinateurs/tme/tme7/exo2-q1.asm76
-rw-r--r--semestre 3/architecture des ordinateurs/tme/tme7/exo2-q2.asm59
-rw-r--r--semestre 3/architecture des ordinateurs/tme/tme7/exo2-q3.asm57
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