diff options
Diffstat (limited to 'semestre 3/architecture des ordinateurs')
12 files changed, 517 insertions, 2 deletions
diff --git a/semestre 3/architecture des ordinateurs/1- Représentation de l'information.md b/semestre 3/architecture des ordinateurs/1- Représentation de l'information.md index 8ef0fc2..6d6d266 100644 --- a/semestre 3/architecture des ordinateurs/1- Représentation de l'information.md +++ b/semestre 3/architecture des ordinateurs/1- Représentation de l'information.md @@ -39,7 +39,7 @@ Processeur contient l'ALU (ce qui permet de faire des calculs arithmétiques et L'unité de commande contient deux registres principaux -> Program Counter (PC) et Instruction Register (IR) |> PC contient l'adresse du programme exécuté |> IR contient les instructions à exécuté --> le CPU exécute sans la fin : +-> le CPU exécute sans fin : 1. lecture de l'adresse du code dans PC 2. le place dans IR 3. la lecture des instructions mise dans IR 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 002c89e..67d6823 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 @@ -370,4 +370,71 @@ Elles ne sont pas au même endroit que les variables globales `0x8000 0000` -> égal ou plus grand pour le système |> ce qui précède `0x8000 0000` est pour l'utilisateur |> le fond de la partie utilisateur sont les contextes de fonction (la pile !) --> le sommet de la pile est variable et est dans un registre particulier, le `$29` (stack pointer)
\ No newline at end of file +-> le sommet de la pile est variable et est dans un registre particulier, le `$29` (stack pointer) + +Adresse du fond de pile = `0x7FFF FFFC` + +On définit la taille de la pile dans le prologue +|> se fait en première instruction +|> on modifie directement `$29` pour lui indiquer quelle taille on met dedans +|> la première variable est tjs celle qui est le plus haut (i.e. avec l'adresse la plus petite), est la convention gcc + +Après, on diminue la taille de la pile dans l'épilogue +|> on dépile toutes les variables qu'on a utilisé + +```c +int main(){ + int a = 1; + int b = 2: + int c; + c = a + b; + return 0; +} +``` + +```asm +.text +# prologue +addiu $29, $29, -12 # car on stock 3 mots +# initialisation des variables +ori $8, $0, 1 +sw $8, 0($29) +ori $8, $0, 2 +sw $8, 4($29) +# corps du main +lw $8, 0($29) +lw $9, 4($29) +addu $8, $8, $9 +sw $9, 8($29) +# épilogue +addiu $29, $29, 12 +# exit +ori $2, $0, 10 +syscall +``` +## Fonction +Pour arriver à une fonction, on utilise `jal label` +|> garde le lien de l'appel dans `$31` +|> saute à label + +> [!warning] Besoin de sauvegarder `$31` +> Si `main` appelle `f` et `f` appelle `h`, alors on perd le `$31` pour `f` ! +> |> fonction doit s'assurer que `$31` est identique entre l'entrée et la sortie +> +> **On le sauvegarde tjs au fond du contexte** + +Valeur de retour est dans `$2` +|> ou dans `$2` et `$3` si le mot fait 64 bits + +Les arguments sont mis en haut de la pile +|> les 4 premiers sont dans les registres `$4`, `$5`, `$6`, `$7` +|> il y a quand même assez de place dans la pile pour garder les 4 premiers + +Les registres `$16` à `$23` ne doivent pas être modifié par un appel de fonction +|> ou s'ils sont modifiés, leurs valeurs doit être restaurées + +**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/td/25-10-22.md b/semestre 3/architecture des ordinateurs/td/25-10-22.md new file mode 100644 index 0000000..59d0775 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/td/25-10-22.md @@ -0,0 +1,50 @@ +--- +tags: + - sorbonne + - informatique + - architecture-des-ordinateurs + - td +semestre: 3 +--- +```asm +# prologue +addiu $29, $29, -8 +ori $8, $0, 12 +sw $8, 0($29) +ori $8, $0, 3 +sw $8, 4($29) +ori $8, $0, 5 +sw $8, 6($29) + +# épilogue +addiu $29, $29, 8 + +# @a = 0($29) +# @b = 4($29) +# @c = 6($29) +``` + +`"AaBb" = 0x41 0x61 0x42 0x62` +`"0123456789" = 0x30 ... 0x39` +`"1024" = 0x31 0x30 0x32 0x34` + +```asm +.data +ch: .asciiz "1234" +.text +#main + lui $8, $0, 0x1001 + ori $12, $0, 10 +while: + lbu $9, 0($8) + beq $9, $0, while_end + andiu $9, $9, 0x0F + mult $10, $12 + mflo $10 + addu $10, $9 + addiu $11, 1 + addiu $8, 1 + j while +while_end: +# +``` diff --git a/semestre 3/architecture des ordinateurs/tme/tme5/exo1.asm b/semestre 3/architecture des ordinateurs/tme/tme5/exo1.asm new file mode 100644 index 0000000..4337468 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme5/exo1.asm @@ -0,0 +1,33 @@ +.data +p: .word 0 # 0x1001 0000 +q: .word 0 # 0x1001 0004 +.text + lui $8, 0x1001 # $8 <- 0x1001 0000 + ori $2, $0, 5 + syscall + lui $8, 0x1001 # $8 <- 0x1001 0000 + sw $2, 0($8) + ori $2, $0, 5 + syscall + lui $8, 0x1001 # $8 <- 0x1001 0000 + sw $2, 4($8) + + lw $12, 0($8) # p + lw $13, 4($8) # q + or $10, $0, $12 # i + ori $11, $0, 0 # somme +for: + # i+1 > q + addiu $14, $10, 1 + slt $15, $13, $14 + bne $15, $0, end_for + addu $11, $11, $10 # somme += i + addiu $10, $10, 1 + j for +end_for: + ori $2, $0, 1 + or $4, $0, $11 + syscall + + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme5/exo2.asm b/semestre 3/architecture des ordinateurs/tme/tme5/exo2.asm new file mode 100644 index 0000000..00354a7 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme5/exo2.asm @@ -0,0 +1,33 @@ +.data +a: .word 0 # 0x1001 0000 +b: .word 0 # 0x1001 0004 +.text + lui $8, 0x1001 # $8 <- 0x1001 0000 + ori $2, $0, 5 + syscall + lui $8, 0x1001 # $8 <- 0x1001 0000 + sw $2, 0($8) + ori $2, $0, 5 + syscall + lui $8, 0x1001 # $8 <- 0x1001 0000 + sw $2, 4($8) + + lw $9, 0($8) # tmpa + lw $10, 4($8) # tmpb +while: + beq $9, $10, end_while + # tmpb < tmpa -> else + slt $11, $10, $9 + beq $11, $0, else + subu $9, $9, $10 + j end_if +else: + subu $10, $10, $9 +end_if: + j while +end_while: + ori $2, $0, 1 + or $4, $0, $9 + syscall + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme5/exo3.asm b/semestre 3/architecture des ordinateurs/tme/tme5/exo3.asm new file mode 100644 index 0000000..715303b --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme5/exo3.asm @@ -0,0 +1,17 @@ +.data +ch: .asciiz "Bonjour, je suis une licorne avec des pouvoirs magiques :D" # len(ch) 58 +.text + lui $8, 0x1001 + ori $9, $0, 0 # n +while: + lb $10, 0($8) + beq $10, $0, end_while + addiu $9, $9, 1 + addiu $8, $8, 1 + j while +end_while: + ori $2, $0, 1 + or $4, $0, $9 + syscall + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme5/exo4.asm b/semestre 3/architecture des ordinateurs/tme/tme5/exo4.asm new file mode 100644 index 0000000..bac6a30 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme5/exo4.asm @@ -0,0 +1,29 @@ +.data +val: .word 70 +tab: .word 42, 69, 420, 666, 1, 2, 0, -1 +.text + lui $8, 0x1001 + ori $9, $0, 0 # n + lw $12, 0($8) + addiu $8, $8, 4 + # cond d'arrêt + or $13, $0, $0 + ori $14, $0, 1 + subu $13, $13, $14 +while: + # while tab[i] != '\0' + lw $10, 0($8) + beq $10, $13, end_while + slt $11, $10, $12 + # if tab[i] < val + beq $11, $0, end_if + addiu $9, $9, 1 +end_if: + addiu $8, $8, 4 + j while +end_while: + ori $2, $0, 1 + or $4, $0, $9 + syscall + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme5/exo5.asm b/semestre 3/architecture des ordinateurs/tme/tme5/exo5.asm new file mode 100644 index 0000000..1ca188b --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme5/exo5.asm @@ -0,0 +1,24 @@ +.data +n: .word 123 +.text + lui $8, 0x1001 + lw $9, 0($8) + + ori $11, $0, 1 + ori $10, $0, 31 + ori $13, $0, 0 +while: + bltz $10, end_while + srlv $12, $9, $10 + andi $12, $12, 1 + beq $12, $0, end_if + addiu $13, $13, 1 +end_if: + subu $10, $10, $11 + j while +end_while: + ori $2, $0, 1 + or $4, $0, $13 + syscall + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q1A.asm b/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q1A.asm new file mode 100644 index 0000000..322654a --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q1A.asm @@ -0,0 +1,54 @@ +.data +ch: .space 11 +.text +#main + # prologue + addiu $29, $29, -16 + # scanf + ori $2, $0, 5 + syscall + sw $2, 4($29) + # chaine[10] = 0 + lui $8, 0x1001 + sb $0, 10($8) + + # i = 9 + lw $9, 0($29) # i + ori $9, $0, 9 + sw $9, 0($29) + +while: + # i >= 0 + lw $9, 0($29) + bltz $9, end_while + # corps + # r = nb % 10 + lw $10, 4($29) # nb + ori $11, $0, 10 + div $10, $11 + mfhi $12 + sw $12, 8($29) + # nb /= 10 + mflo $12 + sw $12, 4($29) + # chaine[i] = r + 0x30 + # *(chaine + i) = r + 0x30 + lw $9, 0($29) + addu $13, $8, $9 + lw $10, 8($29) # r + addiu $14, $10, 0x30 + sb $14, 0($13) + + # i -= 1 + lw $9, 0($29) # i + addiu $9, $9, -1 + sw $9, 0($29) + j while +end_while: + ori $2, $0, 4 + or $4, $0, $8 + syscall + # épilogue + addiu $29, $29, 16 + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q1B.asm b/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q1B.asm new file mode 100644 index 0000000..47035aa --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q1B.asm @@ -0,0 +1,50 @@ +.data +ch: .space 11 +.text +#main + # prologue + addiu $29, $29, -16 + # scanf + ori $2, $0, 5 + syscall + sw $2, 4($29) + # chaine[10] = 0 + lui $8, 0x1001 + sb $0, 10($8) + + # i = 9 + lw $9, 0($29) # i + ori $9, $0, 9 + sw $9, 0($29) + +while: + # i >= 0 + lw $9, 0($29) + bltz $9, end_while + # corps + # r = nb % 10 + lw $10, 4($29) # nb + ori $11, $0, 10 + div $10, $11 + mfhi $12 # r + # nb /= 10 + mflo $10 + sw $10, 4($29) + # chaine[i] = r + 0x30 + # *(chaine + i) = r + 0x30 + addu $13, $8, $9 + addiu $12, $12, 0x30 + sb $12, 0($13) + + # i -= 1 + addiu $9, $9, -1 + sw $9, 0($29) + j while +end_while: + ori $2, $0, 4 + or $4, $0, $8 + syscall + # épilogue + addiu $29, $29, 16 + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q2.asm b/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q2.asm new file mode 100644 index 0000000..408f19a --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q2.asm @@ -0,0 +1,70 @@ +.data +ch: .space 11 +.text +#main + # prologue + addiu $29, $29, -16 + # scanf + ori $2, $0, 5 + syscall + sw $2, 4($29) + # chaine[10] = 0 + lui $8, 0x1001 + sb $0, 10($8) + + # i = 9 + lw $9, 0($29) # i + ori $9, $0, 9 + sw $9, 0($29) + +for: + # i >= 0 + lw $9, 0($29) + bltz $9, end_for + # corps + # r = nb % 10 + lw $10, 4($29) # nb + ori $11, $0, 10 + div $10, $11 + mfhi $12 # r + # nb /= 10 + mflo $10 + sw $10, 4($29) + # chaine[i] = r + 0x30 + # *(chaine + i) = r + 0x30 + addu $13, $8, $9 + addiu $12, $12, 0x30 + sb $12, 0($13) + + # i -= 1 + addiu $9, $9, -1 + sw $9, 0($29) + j for +end_for: + ori $2, $0, 4 + or $4, $0, $8 + syscall + + # nbzero = 0 + ori $12, $0, 0 + # i = 0 + ori $9, $0, 0 + +while: + sltiu $10, $9, 9 + beq $10, $0, end_while + addu $11, $8, $9 + lb $11, 0($11) + addiu $11, $11, -0x30 + bne $11, $0, end_while + addiu $12, $12, 1 + addiu $9, $9, 1 + j while +end_while: + ori $2, $0, 1 + or $4, $0, $12 + syscall + # épilogue + addiu $29, $29, 16 + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q3.asm b/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q3.asm new file mode 100644 index 0000000..eebc5ed --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme6/exo1-q3.asm @@ -0,0 +1,88 @@ +.data +ch: .space 11 +.text +#main + # prologue + addiu $29, $29, -16 + # scanf + ori $2, $0, 5 + syscall + sw $2, 4($29) + # chaine[10] = 0 + lui $8, 0x1001 + sb $0, 10($8) + + # i = 9 + lw $9, 0($29) # i + ori $9, $0, 9 + sw $9, 0($29) + +for: + # i >= 0 + lw $9, 0($29) + bltz $9, end_for + # corps + # r = nb % 10 + lw $10, 4($29) # nb + ori $11, $0, 10 + div $10, $11 + mfhi $12 # r + # nb /= 10 + mflo $10 + sw $10, 4($29) + # chaine[i] = r + 0x30 + # *(chaine + i) = r + 0x30 + addu $13, $8, $9 + addiu $12, $12, 0x30 + sb $12, 0($13) + + # i -= 1 + addiu $9, $9, -1 + sw $9, 0($29) + j for +end_for: + ori $2, $0, 4 + or $4, $0, $8 + #syscall + + # nbzero = 0 + ori $12, $0, 0 + # i = 0 + ori $9, $0, 0 + +while: + sltiu $10, $9, 9 + beq $10, $0, end_while + addu $11, $8, $9 + lb $11, 0($11) + addiu $11, $11, -0x30 + bne $11, $0, end_while + addiu $12, $12, 1 + addiu $9, $9, 1 + j while +end_while: + ori $2, $0, 1 + or $4, $0, $12 + #syscall + + ori $9, $0, 0 + ori $10, $0, 10 + subu $10, $10, $12 +for2: + sltu $11, $9, $10 + beq $11, $0, end_for2 + addu $13, $8, $9 + addu $14, $13, $12 + lb $15, 0($14) + sb $15, 0($13) + addiu $9, $9, 1 + j for2 +end_for2: + ori $2, $0, 4 + or $4, $0, $8 + syscall + + # épilogue + addiu $29, $29, 16 + ori $2, $0, 10 + syscall
\ No newline at end of file |
