aboutsummaryrefslogtreecommitdiff
path: root/semestre 3/architecture des ordinateurs/td/25-10-15.md
blob: 50469046d5c5655c189ca3b3416eca911ac2d2e5 (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
---
tags:
  - sorbonne
  - informatique
  - architecture-des-ordinateurs
  - td
semestre: 3
---
```asm
beq $8, $9, label # va à label si $8 == $9
bne $8, $9, label # va à label si $8 != $9
blez $8, label    # va à label si $8 <= 0
bltz $8, label    # va à label si $8 < 0
bgez $8, label    # va à label si $8 >= 0
bgtz $8, label    # va à label si $8 > 0
j label           # va à label
jr r1             # va à l'adresse mémoire dans r1
```

```asm
.data
a:   .word -5
b:   .word 3
.text
# on commence par le nom de la fonction
main:
	lui $8, 0x1001
	lw $9, 0($8)
	# if
	bne $9, $0, else
	# then
	lw $9, 0($8) # on recharge à chaque fois qu'on l'utilise
	lw $10, 4($8)
	addu $9, $9, $10
	sw $9, 0($8)
	j endif
else:
	lw $9, 0($8)
	lw $10, 4($8)
	subu $9, $9, $10
	sw $9, 0($8)
endif:
	ori $2, $0, 10
	syscall
```

```asm
.data
p: .word 10 # 0 -> $9
q: .word 20 # 4 -> $10
i: .word 0  # 8 -> $11
s: .word 0  # 12 -> $12
.text
main:
	lui $8, 0x1001
	# i = p
	lw $9, 0($8)
	or $11, $0, $9
	sw $11, 8($8)
for:
	# i <= q
	lw $10, 4($8)
	lw $11, 8($9)
	slt $13, $10, $11
	bne $13, $0, end_for
	# s += i
	lw $12, 12($8)
	lw $11, 8($8)
	addu $12, $12, $11
	sw $12, 12($8)
	# i++
	lw $11, 8($8)
	addiu $11, $11, 1
	sw $11, 8($8)
	j for
end_for:
	# printf("%d", s)
	ori $2, $0, 1
	lw $12, 12($8)
	or $4, $0, $12
	syscall
	# exit()
	ori $2, $0, 10
	syscall
```

```asm
.data
max: .word 0
tab: .word -2, 1, 5, -7, 42, -9, 0
.text
main:
	lui $8, 0x1001
	ori $12, $0, $8
	addui $8, $8, 4
	# max = tab[0]
	lw $9, 4($8)
	or $10, $0, $9
	ori $11, $0, $8
	sw $10, 0($12)
while:
	# tab[i] != 0
	lw $9, 0($8)
	beq $9, 0, end_while
	# if tab[i] > max
	lw $10, 0($12)
	lw $9, 0($8)
	slt $10, $10, $9
	beq $10, $0, skip
	# max = tab[i]
	lw $9, 0($8)
	lw $10, 0($12)
	or $10, $0, $9
	sw $10, 0($12)
skip:
	# i++
	addiu $8, $8, 4
	j while
end_while:
	ori $2, $0, 1
	lw $4, 0($12)
	syscall
	ori $2, $0, 10
	syscall
```