Прикреплённый файл «StackGeom.asm»
Загрузка 1 .global main
2 .eqv TMIN 8
3 .macro .TABLE %name
4 .data
5 %name: .word 0 # адрес начала стека
6 .word 0 # адрес вершины стека
7 .word 0 # адрес границы стека
8 .word 0 # нижняя граница
9 .text
10 li a0 TMIN
11 li a7 9
12 ecall
13 la t0 %name
14 sw a0 (t0)
15 sw a0 4(t0)
16 sw a0 12(t0)
17 addi a0 a0 TMIN
18 sw a0 8(t0)
19 .end_macro
20 .text
21
22 # Заведение нового массива и копирование туда старого
23 .macro scale %cmd # stack -> stack
24 mv t5 a0 # Описатель стека
25 lw t1 (t5) # Старый массив
26 lw t2 4(t5) # Вершина
27 lw t3 8(t5) # Граница
28 sub t4 t3 t1 # Размер
29 %cmd t3 t4 1 # Новый размер (%cmd — либо srai, либо slli)
30 mv a0 t3
31 li a7 9 # Заказ памяти
32 ecall
33 sw a0 (t5) # Новый массив
34 add t6 a0 t3
35 sw t6 8(t5) # Новая граница
36 srai t3 t3 2
37 add t6 a0 t3
38 sw t6 12(t5) # Новая нижняя граница
39 mv t6 t1
40 copy: bge t1 t2 done # Пока не достигли границы
41 lw t0 (t1) # копируем массив
42 sw t0 (a0)
43 addi t1 t1 4
44 addi a0 a0 4
45 j copy
46 done: sw a0 4(t5) # Новая вершина
47 # TODO NOT IMPLEMENTED free t1
48 mv a0 t5 # восстановим a0
49 .end_macro
50
51 downscale:
52 scale srai
53 ret
54 upscale:
55 scale slli
56 ret
57
58 # Добавление element в стек stack
59 push: # stack element -> stack
60 addi sp sp -8
61 sw ra -4(sp)
62 sw a1 (sp)
63
64 lw t1 4(a0) # Вершина
65 lw t2 8(a0) # Граница
66 bltu t1 t2 push_same # Не надо масштабировать
67 call upscale # Увеличиваем массив вдвое
68 lw a1 (sp) # Восстанавливаем a1
69 lw t1 4(a0) # Новая вершина
70 push_same:
71 sw a1 (t1) # Положим a1 на стек
72 addi t1 t1 4
73 sw t1 4(a0) # Обновим вершину
74 lw ra -4(sp)
75 addi sp sp 8
76 ret
77
78 # Снятие элемента со стека stack
79 pop: # stack -> element
80 addi sp sp -4
81 sw ra (sp)
82
83 lw t1 4(a0) # Вершина
84 lw t2 12(a0) # Нижняя граница
85 bgeu t1 t2 pop_same # Не надо масштабировать
86 lw t3 8(a0) # Граница
87 lw t0 (a0) # Начало
88 sub t3 t3 t0 # Размер
89 li t0 TMIN
90 ble t3 t0 pop_same # Не надо масштабировать
91 call downscale # Уменьшаем массив вдвое
92 lw t1 4(a0) # Новая вершина
93 pop_same:
94 addi t1 t1 -4
95 lw t0 (t1) # Снимем значение
96 sw t1 4(a0) # Обновим вершину
97 mv a0 t0
98
99 lw ra (sp)
100 addi sp sp 4
101 ret
102
103 main: .TABLE stack
104 li s1 1
105 li s0 29
106 loop: la a0 stack
107 mv a1 s1
108 call push
109 addi s1 s1 1
110 blt s1 s0 loop
111
112 li s1 1
113 li s0 29
114 oloop: la a0 stack
115 call pop
116 li a7 1
117 ecall
118 li a0 ' '
119 li a7 11
120 ecall
121 addi s1 s1 1
122 blt s1 s0 oloop
123
124 li a7 10
125 ecall
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.Вам нельзя прикреплять файлы к этой странице.
