Прикреплённый файл «ListOps.asm»
Загрузка 1 .eqv cell.next 0 # смещение до ссылки
2 .eqv cell.data 4 # смещение до данных
3 .eqv cell 8 # размер структуры (1 слово данных)
4
5 .data
6 list: .align 2 # стартовый элемент списка
7 .space cell # второе слово не используется
8
9 # Добавление %data после эелемента %cell
10 .macro append %cell %data
11 mv a0 %cell
12 mv a1 %data
13 call list_append
14 .end_macro
15
16 # Поиск %value в списке %list
17 .macro find %list %value
18 la a0 %list
19 li a1 %value
20 call list_prev
21 lw a0 cell.next(a0)
22 .end_macro
23
24 # Вставка значения %value в упорядоченный список %list
25 .macro insert %list %value
26 la a0 %list
27 li a1 %value
28 call list_gt
29 call list_append
30 .end_macro
31
32 # Удаление ячейки, стоящей после %cell
33 .macro delete %cell
34 mv a0 %cell
35 call list_delete
36 .end_macro
37
38 # Вывод регистра в нужном формате с разделителем
39 .macro print %reg %ecall %sep
40 mv a0 %reg
41 li a7 %ecall
42 ecall
43 li a0 %sep
44 li a7 11
45 ecall
46 .end_macro
47
48 # Вывод адреса и содержимого ячейки (или 0)
49 .macro printl %reg
50 beqz %reg null
51 lw a1 cell.data(%reg)
52 print %reg 34 ' '
53 print a1 1 '\n'
54 j fin
55 null: print %reg 1 '\n'
56 fin:
57 .end_macro
58
59 # Вывод всего списка %list
60 .macro print_list %list
61 la a0 list
62 call list_print
63 .end_macro
64
65 .text
66 main: li s1 8
67 la s2 list
68 fill: append s2 s1 # Добавление в начало списка
69 addi s1 s1 -1
70 bgtz s1 fill
71 print_list a0 # Должна получиться возрастающая последовательность
72 find list 5
73 printl a0
74 find list 4
75 delete a0 # Должен удалиться следующий элемент — 5
76 la a0 list
77 delete a0 # Должен удалиться первый элемент — 1
78 print_list a0
79 insert list 5 # Должен вставиться после 4
80 insert list 5 # Должен вставиться после 5
81 insert list 42 # Должен вставиться в конец
82 insert list 1 # Должен вставиться в начало
83 print_list a0
84 find list 11 # Нет такого
85 printl a0
86 li a7 10
87 ecall
88
89 # Вывод всего списка list
90 list_print: # list
91 mv t1 a0
92 lp_nxt: lw t1 cell.next(t1)
93 beqz t1 lp_end
94 lw t0 cell.data(t1)
95 print t0 1 ' '
96 j lp_nxt
97 lp_end: li a0 '\n'
98 li a7 11
99 ecall
100 ret
101
102 # Вставка после cell нового элемента со значением data
103 list_append: # cell data
104 mv t2 a0
105 lw t1 cell.next(t2) # ссылка на следующий элемент
106 li a0 cell # заказ памяти под структуру
107 li a7 9
108 ecall
109 sw t1 cell.next(a0) # перекладывавем ссылку на следующий
110 sw a1 cell.data(a0) # записываем данные
111 sw a0 cell.next(t2) # подменяем ссылку на новый адрес
112 ret
113
114 # Удаление из списка элемента, стоящего после cell
115 # Возвращается адрес этого элемента или 0, если cell — последний
116 list_delete: # cell
117 mv t1 a0 # Предыдущий элемент
118 lw a0 cell.next(a0) # Удаляемый элемент
119 bnez a0 ld_del # (Если он есть)
120 ret # Если там 0, вернём 0
121 ld_del: lw t0 cell.next(a0) # Элемент после удаляемого
122 sw t0 cell.next(t1) # Переписываем ссылку на него
123 # здесь должно быть освобождение двух слов памяти по адресу a0
124 ret
125
126 # Поиск по условию value в списке list, возвращается предыдущий элемент
127 # или последний, если условие не выполняется
128 # Условие — инструкция сравнения+перехода двух регистров %branch
129 .macro list_cond %branch
130 proc: # list value
131 lw t1 cell.next(a0) # Следующий элемент списка
132 beqz t1 yes # Список закончился, элемент не найден
133 lw t0 cell.data(t1) # Значение для сравнения
134 %branch t0 a1 yes # Найден ли элемент?
135 mv a0 t1 # Перейдём к следующему
136 j proc
137 yes: ret
138 .end_macro
139 list_prev: list_cond beq # Поиск равного
140 list_gt: list_cond bgt # Поиск большего
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.Вам нельзя прикреплять файлы к этой странице.
