-
Notifications
You must be signed in to change notification settings - Fork 0
/
calculadora.asm
98 lines (79 loc) · 4.38 KB
/
calculadora.asm
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
# feito na IDE MARS versão 4.5
.data
s_mais: .asciiz " + "
s_menos: .asciiz " - "
s_mult: .asciiz " x "
s_divis: .asciiz " / "
s_igual: .asciiz " = "
pular_linha: .asciiz "\n"
menu_text: .asciiz "Escolha a operação (1 para +), (2 para -), (3 para /), (4 para x) e 0 para sair: "
pedir_valor_x: .asciiz "Informe o primeiro valor: "
pedir_valor_y: .asciiz "Informe o segundo valor: "
.text
j menu # salta pra label do menu
menu:
la $a0, pular_linha # imprime a string que pula uma linha
li $v0, 4 # carrega o valor 4 pra usar a syscall de printar string
syscall # chama a syscall
la $a0, menu_text # imprime a string do menu
li $v0, 4 # carrega o valor 4 pra usar a syscall de printar string
syscall # chama a syscall
li $v0, 5 # carrega o valor 5 pra usar a syscall de ler um int (o valor que é lido é armazenado no registrador v0)
syscall # chama a syscall
move $t0, $v0 # coloca o valor que ta no registrador v0 (usado pra syscall) no t0
li $t1, 1 # carrega o valor 1 no registrador t1
beq $t1, $t0, soma # caso o valor que foi lido no input seja 1, vai saltar pra soma
li $t1, 2 # carrega o valor 1 no registrador t1
beq $t1, $t0, subtrair # caso o valor que foi lido no input seja 2, vai saltar pra subtrair
li $t1, 3 # carrega o valor 1 no registrador t1
beq $t1, $t0, dividir # caso o valor que foi lido no input seja 3, vai saltar pra dividir
li $t1, 4 # carrega o valor 1 no registrador t1
beq $t1, $t0, multiplicar # caso o valor que foi lido no input seja 4, vai saltar pra multiplicar
li $t1, 0 # carrega o valor 0 no registrador t1
beq $t1, $t0, encerrar # caso o valor que foi lido no input seja 0, vai saltar pra encerrar
leitor:
la $a0, pedir_valor_x # imprime a string que pede o primeiro valor
li $v0, 4 # carrega o valor 4 pra usar a syscall de printar string
syscall # chama a syscall
# valores double utilizam 2 registradores por conta da precisão
li $v0, 7 # carrega o valor 7 pra usar a syscall de ler double (por padrão o valor vai pro registrador $f0)
syscall # chama a syscall
mov.d $f2, $f0 # move o double que foi lido (está em f0 e f1) para f2
la $a1, pedir_valor_y # imprime a string que pede o segundo valor
li $v0, 4 # carrega o valor 4 pra usar a syscall de printar string
syscall # chama a syscall
li $v0, 7 # carrega o valor 7 pra usar a syscall de ler double (por padrão o valor vai pro registrador $f0)
syscall # chama a syscall
mov.d $f4, $f0 # move o double que foi lido (está em f0) para f4
jr $ra # salta pra label que está com o endereço salvo no registrador ra
soma:
jal leitor # salta pra label leitor e guarda o endereço da label soma no registrador ra
add.d $f0, $f2, $f4 # guarda no registrador f0 o valor da soma dos registradores f2 e f4
mov.d $f12, $f0 # move o resultado que está em f0 para o f12 (o registrador que a syscall printa o valor para doubles)
li $v0, 3 # carrega o valor 3 para usar a syscall de printar doubles
syscall # chama a syscall
j menu # salta pra label do menu
subtrair:
jal leitor # salta pra label leitor e guarda o endereço da label subtrair no registrador ra
sub.d $f0, $f2, $f4 # guarda no registrador f0 o valor da subtração dos registradores f2 e f4
mov.d $f12, $f0 # move o resultado que está em f0 para o f12 (o registrador que a syscall printa o valor para doubles)
li $v0, 3 # carrega o valor 3 para usar a syscall de printar doubles
syscall # chama a syscall
j menu # salta pra label do menu
dividir:
jal leitor # salta pra label leitor e guarda o endereço da label dividir no registrador ra
div.d $f0, $f2, $f4 # guarda no registrador f0 o valor da divisão dos registradores f2 e f4
mov.d $f12, $f0 # move o resultado que está em f0 para o f12 (o registrador que a syscall printa o valor para doubles)
li $v0, 3 # carrega o valor 3 para usar a syscall de printar doubles
syscall # chama a syscall
j menu # salta pra label do menu
multiplicar:
jal leitor # salta pra label leitor e guarda o endereço da label multiplicar no registrador ra
mul.d $f0, $f2, $f4 # guarda no registrador f0 o valor da multiplicação dos registradores f2 e f4
mov.d $f12, $f0 # move o resultado que está em f0 para o f12 (o registrador que a syscall printa o valor para doubles)
li $v0, 3 # carrega o valor 3 para usar a syscall de printar doubles
syscall # chama a syscall
j menu # salta pra label do menu
encerrar:
li $v0, 10 # carrega o valor 10 no registrador v0 que chama a syscall que encerra a execução
syscall