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

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