Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.
 Все файлы | Выбранные файлы: удалить переместить на страницу скопировать на страницу

Вам нельзя прикреплять файлы к этой странице.