diff options
Diffstat (limited to 'semestre 3/architecture des ordinateurs')
8 files changed, 300 insertions, 20 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 f49db8f..0e1de16 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 @@ -236,7 +236,7 @@ Quand on utilise la mémoire, on a besoin de copier les valeurs dans les registr Signature des instructions d'accès mémoire : `Codop Rt, Imm16(Rs)` |> `Rt` est la destination ou le registre source -|> `Imm16(Rs)` est la zone mémoire avec `Rs` étant le décallage +|> `Imm16(Rs)` est la zone mémoire avec `Rs` étant le décalage en octet On se place tjs du côté du processeur pour les opcodes |> `l.` servent à *load* @@ -251,4 +251,88 @@ lh $4, 4($3) # load le half-word contenu dans l'adresse 4 + $3 dans $4 lw $4, -2(3) # load le word contenu dans l'adresse -2 + 3 dans $4 ``` -Par défaut, tout est signé, si on veut être en non signé, on rajoute `u`, i.e. `lhu` pour récupérer un `uint16`
\ No newline at end of file +Par défaut, tout est signé, si on veut être en non signé, on rajoute `u`, i.e. `lhu` pour récupérer un `uint16` + +Il n'existe pas de pointeur +|> besoin de mettre à jour la mémoire +|> faut faire attention aux problèmes de synchronisation + +Il y a toujours au moins un transfert mémoire vers CPU +|> est celui qui place le code dans IR +## Structures de contrôle +Pour ne plus faire une instruction séquentielle, on doit faire des sauts +|> deux types : inconditionnels et conditionnels +-> changent PC + +Sauts inconditionnels -> les jumps (commencent par `j`) +|> `j label` saute au label +|> `jr Rt` saute à valeur contenu dans Rt + +Sauts conditionnels -> les branchements (commencent par `b`) +|> saute si une condition est vraie +|> voir le memento + +Afficher la valeur absolue d'un nombre +```asm +.data +n: .word -1 + +.text + lui $3, 0x10010000 + lw $4, 0($3) + +# syntaxe du *if then* ici + bgez $4, show + sub $4, $0, $4 +show: + ori $2, $0, 1 + syscall + + ori $2, $0, 10 + syscall +``` + +Pour utiliser plusieurs conditions, on a besoin d'utiliser une instruction avant +|> `slt $10, $8, $9` met `$10` à `1` si `$8 < $9`, il le met à `0` sinon +-> on utilise un branchement après +|> si on veut une comparaison large $a\leqslant b$, on vérifie si $a > b$ est faux + +Pour faire un `if else`, on fait : +```asm + bcond ..., $0, else + # instruction du if + j next +else: + # instruction du else +next: + # suite +``` + +Pour faire un `while`, on fait : +```asm +boucle: + bcond ..., $0, next + # instruction du while + j boucle +next: + # suite +``` + +Le codage de `j label` est +|> `00010 Immédiat_sur_26_bits` +-> besoin de calculer la bonne adresse pour qu'elle soit sur 26 bits +|> on fait `PC = PC[31:28] | I * 4` +|> `PC[31:28]` permet de rester dans la partie code +|> `I` est l'immédiat avec en plus `[1:0]` qui sont nuls car multiple de 4 +|> `* 4` provient du multiple de 4 + +Branchement sont en format I +|> immédiat est donc sur 16 bits +-> on a tjs besoin de le mettre sur 32 bits +|> on fait `PC = PC + 4 + (I * 4)` +|> le calcul du PC suivant est donc relatif à la ligne d'instruction en cours + +**Dans tous les cas, on a besoin de savoir où se trouve l'étiquette pour la coder** +|> on a donc besoin de le faire en deux étapes (on les appelle "passe") +1. on s'occupe de toutes les instructions sans traiter les étiquettes +2. on traite les étiquettes après qu'on connait bien tout
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/td/25-10-08.md b/semestre 3/architecture des ordinateurs/td/25-10-08.md new file mode 100644 index 0000000..45c488e --- /dev/null +++ b/semestre 3/architecture des ordinateurs/td/25-10-08.md @@ -0,0 +1,71 @@ +--- +tags: + - sorbonne + - informatique + - architecture-des-ordinateurs + - td +semestre: 3 +--- +`.text` permet de donner les instructions +`.data` permet de mettre des variables globales en mémoire +-> elles sont chargées en mémoire +|> `.data` est dans la partie donnée utilisateur +|> `.text` est dans la partie dédiée au programme + +La mémoire user commence en `0x10010000` + +La directive `.align` permet d'aligner les `.space` + +Pour init des chaînes de caractère, on utilise `.asciiz` pour bien rajouter le caractère de fin de chaîne ! + +`sw $9, 4($8)` est `0b101011 01000 01001 0000 0000 0000 0100` + +```asm +.data +var1: .word 0xFF + .align 2 +var2: .space 4 +.text + lui $8,0x1001 + ori $8,$8,0x0000 + lw $9,0($8) + addiu $9,$9,5 + sw $9,4($8) # 4 car c'est un word + + ori $2, $0, 10 + syscall +``` + +```c title="équivalent du programme assembleur du dessus" +int var1 = 255; +int var2; + +int main(){ + var2 = 47 + 5; + return 0; +} +``` + +| Adresse | octet $n$ | octet $n+1$ | octet $n+2$ | octet $n+3$ | mot | +| ---------- | --------- | ----------- | ----------- | ----------- | ---------- | +| 0x10010000 | 0x00 | 0x01 | 0x00 | 0x00 | 0x00000100 | +| 0x10010004 | 0x11 | 0x22 | 0x33 | 0xFF | 0xFF332211 | +| 0x10010008 | 0x31 | 0x32 | 0x33 | 0x00 | "123" | +| 0x1001000c | | | | | | +```asm +.data +tab: .word 1,2,34,256,-1 +chaine: .asciiz "toto" +.text + lui $8, 0x1001 + lw $4, 12($8) + ori $2, $0, 1 + syscall + + addiu $9, $8, 20 # récupère l'addresse de la chaîne + lw $4, 8($9) + syscall + + ori $2, $0, 10 + syscall +``` diff --git a/semestre 3/architecture des ordinateurs/tme/tme3/exercice5.asm b/semestre 3/architecture des ordinateurs/tme/tme3/exercice5.asm index 16cece8..b9c3fb0 100644 --- a/semestre 3/architecture des ordinateurs/tme/tme3/exercice5.asm +++ b/semestre 3/architecture des ordinateurs/tme/tme3/exercice5.asm @@ -1,24 +1,31 @@ .data .text lui $3, 0xAABB - ori $3, $3, 0xCCDF + ori $3, $3, 0xCCDD - # variable définissant le bit qu'on déplace - ori $4, $0, 3 - # on génère le mask pour sélectionner le bit -st: ori $8, $0, 1 # est le mask - ori $9, $0, 3 # est le décallage pour le mask - subu $9, $9, $4 # le nombre de décallage du bit pour le mask - sllv $8, $8, $9 # on génére le mask - # on applique le mask - and $10, $3, $8 # on sélectionne le bon bit - srlv $10, $10, $4 # on décalle le bit - # on ajoute le résultat - or $5, $5, $10 - # on boucle - ori $11, $0, 1 - subu $4, $4, $11 - bgez $4, st + # on sélectionne o_1, on le décalle de 3, on l'ajoute + # on sélectionne o_2, on le décalle de 2, on l'ajoute + # on sélectionne o_3, on le décalle de 1, on l'ajoute + # on sélectionne o_4, on le décalle de 0, on l'ajoute + + ori $6, $0, 31 # est le nombre - 1 de bit à modifier + or $7, $0, $6 # est notre i de la boucle qui bouge +repeat: + ori $8, $0, 1 # masque + sub $10, $6, $7 # décallage pour sélection + sllv $8, $8, $10 # on adapte notre masque pour prendre le bon + and $9, $3, $8 # on sélectionne le bit + srlv $9, $9, $10 # on remet le bit à l'origine + sllv $9, $9, $7 # on le décalle + or $4, $4, $9 # on l'ajoute + # on calcule le nouveau i dans $7 + ori $12, $0, 1 + sub $7, $7, $12 + # on boucle si $7 >= 0 + bgez $7, repeat + + ori $2, $0, 35 + syscall ori $2, $0, 10 - syscall
\ No newline at end of file + syscall diff --git a/semestre 3/architecture des ordinateurs/tme/tme4/exo1.asm b/semestre 3/architecture des ordinateurs/tme/tme4/exo1.asm new file mode 100644 index 0000000..da99bd9 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme4/exo1.asm @@ -0,0 +1,6 @@ +.data +o1: .byte 1 +o2: .byte 2 +o3: .byte 3 +o4: .byte 4 +m1: .word 0xAABBCCDD
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme4/exo2.asm b/semestre 3/architecture des ordinateurs/tme/tme4/exo2.asm new file mode 100644 index 0000000..9c66651 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme4/exo2.asm @@ -0,0 +1,32 @@ +.data +v1: .word -1 +v2: .word 0xFF + +o: .byte 0xFF +.text + lui $8, 0x1001 + lw $9, 0($8) + or $4, $0, $9 + ori $2,$0,1 + syscall + + lw $10, 4($8) + or $4, $10, $10 + syscall + + addi $9, $9, 1 + sw $9, 0($8) + addi $10, $10, 1 + sw $10, 4($8) + + addi $8, $8, 8 # on récupère l'adresse de o + lb $9, 0($8) + or $4, $0, $9 + syscall # affiche -1 car il l'étend + lbu $10, 0($8) + or $4, $0, $10 + syscall # affiche 255 car il n'est pas signé + + ori $2, $0, 10 + syscall +
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme4/exo3.asm b/semestre 3/architecture des ordinateurs/tme/tme4/exo3.asm new file mode 100644 index 0000000..4ccd63a --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme4/exo3.asm @@ -0,0 +1,19 @@ +.data +ch: .asciiz "coucou" +.text + lui $8, 0x1001 + ori $2, $0, 4 + or $4, $0, $8 + syscall + + # on garde en mémoire les deux caractères + lb $9, 0($8) + lb $10, 1($8) + # on les échanges + sb $9, 1($8) + sb $10, 0($8) + # et on affiche + syscall + + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme4/exo4.asm b/semestre 3/architecture des ordinateurs/tme/tme4/exo4.asm new file mode 100644 index 0000000..28a4c30 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme4/exo4.asm @@ -0,0 +1,31 @@ +# "123456" = 0x31 32 33 34 35 36 00 +.data +cod: .byte 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x00 +.text + lui $8, 0x1001 + ori $2, $0, 4 + or $4, $0, $8 + syscall + + lb $16, 2($8) + or $4, $0, $16 + ori $2, $0, 1 + syscall + + # "0" est représenté par 0x30 + # les autres chiffres sont à la suite de 0x30 jusqu'à 0x39 ("9") + # pour transformer le code ASCII d'un chiffre en chiffre, il suffit donc de lui soustraire 0x30 pour obtenir le chiffre + + # on a besoin de mettre 0x30 dans un registre car l'opcode subi n'existe pas + ori $9, $0, 0x30 + sub $17, $16, $9 + or $4, $0, $17 + syscall + + ori $18, $0, 0x34 # est l'ascii de "4" + sub $18, $18, $9 + or $4, $0, $18 + syscall + + ori $2, $0, 10 + syscall
\ No newline at end of file diff --git a/semestre 3/architecture des ordinateurs/tme/tme4/exo5.asm b/semestre 3/architecture des ordinateurs/tme/tme4/exo5.asm new file mode 100644 index 0000000..c63dc69 --- /dev/null +++ b/semestre 3/architecture des ordinateurs/tme/tme4/exo5.asm @@ -0,0 +1,30 @@ +.data +tab: .word 4, 23, 12, 3, 8, 1 + .align 2 +s: .space 4 + .align 2 +p: .space 4 +.text + lui $8, 0x1001 # @tab + addiu $9, $8, 24 # @s + addiu $10, $9, 4 # @p + # s = tab[3] + lw $11, 12($8) + sw $11, 0($9) + # p = tab[4] + lw $12, 16($8) + sw $12, 0($10) + + # tab[0] = s + 1 + addi $13, $11, 1 + sw $13, 0($8) + # tab[1] = s + p + add $13, $11, $12 + sw $13, 4($8) + # tab[2] = tab[5] + lw $13, 20($8) + sw $13, 8($8) + + # exit() + ori $2, $0, 10 + syscall
\ No newline at end of file |
