-
Notifications
You must be signed in to change notification settings - Fork 0
/
PILA(push,remove,print)--sincorregir.asm
169 lines (139 loc) · 4.47 KB
/
PILA(push,remove,print)--sincorregir.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
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#—AC————————>11/12/2015: PILA (push, remove, print)
#$s0 es la cima de la pila
#typedef struct _node_t {
# int val; /* valor del nodo; tamaño palabra */
# struct _node_t *prev; /* puntero al nodo anterior */
#} node_t;
.data
str1: .asciiz "Introduce valores en la pila, 0 acaba.\n"
str2: .asciiz "Introducir valor:"
str3: .asciiz "\n"
str4: .asciiz "valores de la pila:\n"
str5: .asciiz "Introducir valor para borrar: "
.text
main:
la $a0, str1
li $v0, 4
syscall
read:
la $a0, str2
li $v0, 4
syscall
li $v0, 5
syscall
beqz $v0,continue #deja de leer y pasa a hacer otras cosas
move $a0, $s0 #node_t *top
move $a1, $v0 #int val
jal push #node_t * push(node_t *top, int val)
move $s0, $v0 #actualizo la cima
b read
continue:
la $a0, str4
li $v0, 4
syscall
move $a0, $s0 #node_t *top
jal print #void print(node_t *top):
la $a0, str5
li $v0, 4
syscall
li $v0, 5
syscall
move $a0, $s0 #node_t *top
move $a1, $v0 #int val
jal remove #node_t * remove(node_t *top, int val)
move $a0, $s0
jal print #pinta de nuevo sin el valor eliminado
exit:
li $v0 10
syscall
######################################################################
# node_t * push(node_t *top, int val): devuelve direcion nodo #
######################################################################
push:
subu $sp, $sp, 32
sw $ra, 20($sp)
sw $fp, 16($sp)
addiu $fp, $sp, 28
sw $a0, 0($fp) #node_t *top
sw $a1, -4($fp) #int val (-4 para que no deesborde)
li $a0, 8
li $v0, 9 #reserva 8 byts de memoria
syscall
lw $a0, 0($fp) #node_t *top (restaurado)
lw $a1, -4($fp) #int val (restaurado)
sw $a1, 0($v0) #valor en posicion 0 del nodo
sw $s0, 4($v0) #nodo anterior en posicion 4 del nodo
#el nuevo nodo apunta a la cima ahora
lw $ra, 20($sp)
lw $fp, 16($sp)
addiu $sp, $sp, 32
jr $ra
#####################################################################
#void print(node_t *top): (recursivo y orden inverso al introducido #
#####################################################################
print:
beqz $a0, return #se cumplira si solo se introduce el valor "0"
#quiere decir que no hay nada guardado
printaux:
#aqui solo entra si hay algun nodo (se creara minimo 1 pila)
subu $sp, $sp, 32
sw $ra, 0($sp)
sw $fp, 4($sp)
addiu $fp, $sp, 28
sw $a0, -4($fp) #lo guarda para luego (recursivo)
#################################################################
#Esto es para imprimir en orden inverso al que se introdujeron #
#################################################################
# lw $a0, 0($a0) #
# #
# li $v0, 1 #
# syscall #
# la $a0, str3 #
# li $v0, 4 #
# syscall #
# #
# lw $a0, -4($fp) #
#################################################################
lw $a0, 4($a0) #el anterior nodo
beqz $a0, print_pila #si el siguiente nodo es 0 (no hara jal)
jal printaux
print_pila:
#################################################################
#Esto es para pintar en mismo orden en el que se introdujeron #
#################################################################
lw $a0, -4($fp) #obtiene el nodo #
lw $a0, 0($a0) #valor del nodo (posicion primera) #
#
li $v0, 1 #
syscall #
la $a0, str3 #
li $v0, 4 #
syscall #
#################################################################
lw $ra, 0($sp)
lw $fp, 4($sp)
addiu $sp, $sp, 32
#esto asi para que acabe tambien en el caso de no crear pila
#sin tener que restaurar
return:
jr $ra
######################################################################
# node_t * remove(node_t *top, int val): devuelve direccion del nodo #
######################################################################
remove:
#no borra la cima
lw $t1, 4($a0) #siguiente nodo
beqz $t1, notfound #si no hay siguiente nodo acaba
lw $t0, 0($t1) #valor del nodo
beq $a1, $t0, rm #si es igual pasa a eliminar
lw $a0, 4($a0) #siguiente nodo
b remove
rm:
lw $t2, 4($t1) #nodo siguiente al siguiente nodo
sw $t2, 4($a0)
move $v0, $t1 #devuelve direcion del nodo borrado
jr $ra #va a volver a el jal de remove primero
notfound:
li, $v0, 0 #devuleve null si no encuentra que borrar
jr $ra
#¿como seria hacer pop, eliminar la cima?