Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2019-03-15 17:55:07, 3.2 KB) [[attachment:footerS.asm]]
- [получить | показать] (2019-03-15 17:52:50, 5.1 KB) [[attachment:projmode.png]]
Вам нельзя прикреплять файлы к этой странице.