aboutsummaryrefslogtreecommitdiff
path: root/semestre 3/architecture des ordinateurs/td/25-10-08.md
blob: eb4a9e35690a3250b7617a009fea23a13cf8e2bc (plain)
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
```