Прикреплённый файл «footerS.asm»

Загрузка

   1 .globl main
   2 .data
   3 error:	.asciiz "Error: $fp or $s* registers is changed"
   4 serror:	.asciiz "Error: stack smash"
   5 .text
   6 main:	li	$s2 22		# Набьём регистры $s
   7 	li	$s3 33
   8 	li	$s4 44
   9 	li	$s5 55
  10 	li	$s6 66
  11 	li	$s7 77
  12 	li	$fp 88
  13 	
  14 	move	$s0 $sp		# Стек до ввода
  15 	sw	$zero ($gp)	# Флаг конца ввода
  16 	li	$s1 0		# Флаг вещественного ввода
  17 innxt:	li	$v0 6		# Введём очередное число
  18 	syscall
  19 	mfc1	$v0 $f0
  20 	cvt.w.s	$f1 $f0
  21 	cvt.s.w	$f2 $f1
  22 	c.eq.s	$f2 $f0		# Оно было целое?
  23 	movf	$s1 $v0		#   весь ввод вещественный
  24 inflt:	lw	$t0 ($gp)
  25 	bnez	$t0 infin	# Ввод окончен
  26 	addi	$sp $sp -4
  27 	sw	$v0 ($sp)	# Очередное число
  28 	b	innxt
  29 infin:	sub	$a0 $s0 $sp	# Столько памяти надо
  30 	li	$v0 9		# Закажем её
  31 	syscall
  32 	add	$t0 $v0 $a0	# Переложим из стека
  33 movnxt:	sub	$t0 $t0 4	# Сверху вниз
  34 	bltu	$t0 $v0 movfin	# Всё переложили
  35 	lw	$t1 ($sp)	# Снимем очередной ввод
  36 	addi	$sp $sp 4
  37 	bnez	$s1 movflt	# Если не вещественный ввод
  38 	mtc1	$t1 $f0		#   преобразуем в целое
  39 	cvt.w.s	$f0 $f0
  40 	mfc1	$t1 $f0
  41 movflt:	sw	$t1 ($t0)	# И положим в память
  42 	b 	movnxt
  43 movfin: li	$t0 20		# Набьём регистры $t
  44 	li	$t1 21
  45 	li	$t2 22
  46 	li	$t3 23
  47 	li	$t4 24
  48 	li	$t5 25
  49 	li	$t6 26
  50 	li	$t7 27
  51 	li	$t8 28
  52 	li	$t9 29
  53 	move	$a1 $v0		# $a0 — размер, $a1 — адрес
  54 	jal	function	# Вызов функции
  55 	move	$t0 $v0		# Количество данных в выводе
  56 	move	$t1 $v1		# Сами данне
  57 	addu	$t0 $t1 $t0	# Граница данных
  58 outnxt:	bgeu	$t1 $t0	outfin	# Всё вывели
  59 	lw	$a0 ($t1)	# Выведем очередное число
  60 	bnez	$s1 outflt	# Вещественный вывод?
  61 	li	$v0 1		# Целочисленный аваод
  62 	syscall
  63 	j	outcr
  64 outflt:	mtc1	$a0 $f12	# Вещественный вывод
  65 	li	$v0 2
  66 	syscall
  67 outcr:	li	$a0 10		# Выведем перевод строки
  68 	li	$v0 11
  69 	syscall
  70 	addiu	$t1 $t1 4	# Изменим счётчик
  71 	b 	outnxt
  72 outfin:	subu	$t0 $sp $s0	# Проверим контрольную сумму
  73 	beqz	$t0 nosmsh
  74 	la	$a0 serror
  75 	b	doerr
  76 nosmsh:	addu	$t0 $t0 $s2	# сохраняемых регистров
  77 	addu	$t0 $t0 $s3
  78 	addu	$t0 $t0 $s4
  79 	addu	$t0 $t0 $s5
  80 	addu	$t0 $t0 $s6
  81 	addu	$t0 $t0 $s7
  82 	addu	$t0 $t0 $fp
  83 	beq	$t0 385 regok
  84 	la	$a0 error
  85 doerr:	li	$v0 4
  86 	syscall
  87 	li	$a0 1
  88 	li	$v0 17
  89 	syscall
  90 regok:	li	$v0 10
  91 	syscall
  92 .kdata
  93 kerror:	.asciiz	"Error "
  94 address:.asciiz	" at "
  95 	
  96 .ktext 0x80000180
  97 	mfc0	$k0 $13		# Причина
  98 	beq	$k0 0x20 ein	# Если не 0x20
  99 	li	$v0 4
 100 	la	$a0 kerror
 101 	syscall
 102 	mfc0	$a0 $13		# Выведем причину ошибки
 103 	li	$v0 34
 104 	syscall
 105 	li	$v0 4
 106 	la	$a0 address
 107 	syscall
 108 	mfc0	$a0 $14		# Выведем адрес ошибки
 109 	li	$v0 34
 110 	syscall
 111 	li	$v0 10		# Выйдем
 112 	syscall
 113 ein:	sw	$k0 ($gp)	# Положим не 0 в ($gp)
 114 	mfc0	$k0 $14
 115 	addiu	$k0 $k0 4
 116 	mtc0	$k0 $14
 117 	mtc0	$zero $13	# Clear Cause register
 118         mfc0	$k0 $12		# Fix Status register
 119         andi	$k0 0xfffd	# Clear EXL bit
 120         ori	$k0 0x1		# Enable interrupts
 121         mtc0	$k0 $12
 122 	eret
 123 .text

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

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