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
|
---
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
```
|