卷积运算
Posted tuoniao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积运算相关的知识,希望对你有一定的参考价值。
任务
使用MIPS汇编语言编写一个进行卷积运算的汇编程序(不考虑延迟槽)。
具体要求
- 首先读取待卷积矩阵的行数m1和列数n1,然后读取卷积核的行数m2和列数n2。
- 然后再依次读取待卷积矩阵(m1行n1列)和卷积核(m2行n2列)中的元素。
- 卷积核的行列数分别严格小于待卷积矩阵的行列数.
- 测试数据中0<m1, n1, m2, n2 <11
- 输入的每个数的绝对值不超过2^10.
- 最终输出进行卷积后的结果
- 输出中,有m1-m2+1行,每行有n1-n2+1个数据,每个数据用空格分开。
- 请使用syscall结束程序:
li $v0, 10
syscall
特别的
- 卷积窗口的移动步长为1,且不采用填充。
样例
给出以下输入:
4
3
2
2
1
2
3
4
5
6
7
8
9
10
11
12
0
1
2
3
正确的输出应该是:
25 31
43 49
61 67
提交要求
- 请勿使用
.globl main
。 - 不考虑延迟槽。
- 只需要提交.asm文件。
- 程序的初始地址设置(Mars->Settings->Memory Configuration)为Compact,Data at Address 0。
题解
1 .data 2 arr1: .word 0:101 3 arr2: .word 0:101 4 arr3: .word 0:101 5 space:.asciiz " " 6 line: .asciiz " " 7 8 .text 9 li $v0,5 #scanf("%d",&m1) 10 syscall 11 move $t0,$v0 #t0=m1 12 li $v0,5 #scanf("%d",&n1) 13 syscall 14 move $t1,$v0 #t1=n1 15 16 li $v0,5 #scanf("%d",&m2) 17 syscall 18 move $t2,$v0 #t2=m2 19 li $v0,5 #scanf("%d",&n2) 20 syscall 21 move $t3,$v0 #t3=n2 22 23 move $s0,$0 24 move $s1,$0 25 move $s2,$0 26 read1:mult $s0,$t1 27 mflo $s2 28 add $s2,$s2,$s1 29 li $v0,5 30 syscall 31 move $t4,$v0 32 sll $s2,$s2,2 33 sw $t4,arr1($s2) #t4=a[j][j] 34 35 addi $s1,$s1,1 36 bne $s1,$t1,read1 37 38 move $s1,$0 39 addi $s0,$s0,1 40 bne $s0,$t0,read1 41 42 move $s0,$0 43 move $s1,$0 44 move $s2,$0 45 read2:mult $s0,$t3 46 mflo $s2 47 add $s2,$s2,$s1 48 li $v0,5 49 syscall 50 move $t4,$v0 51 sll $s2,$s2,2 52 sw $t4,arr2($s2) #t4=b[j][j] 53 54 addi $s1,$s1,1 55 bne $s1,$t3,read2 56 57 move $s1,$0 58 addi $s0,$s0,1 59 bne $s0,$t2,read2 60 61 sub $t4,$t0,$t2 62 addi $t4,$t4,1 #t4=m1-m2+1 63 sub $t5,$t1,$t3 64 addi $t5,$t5,1 #t5=n1-n2+1 65 66 move $s0,$0 #s0=i 67 for_begin1: 68 beq $s0,$t4,for_end1 69 70 move $s1,$0 #s1=j 71 for_begin2: 72 beq $s1,$t5,for_end2 73 move $s2,$0 #s2=temp 74 75 move $s3,$0 #s3=m 76 for_begin3: 77 beq $s3,$t2,for_end3 78 79 move $s4,$0 #s4=n 80 for_begin4: 81 beq $s4,$t3,for_end4 82 83 add $t6,$s0,$s3 #t6=i+m 84 slt $s5,$t6,$t0 85 beq $s5,$0,if_end 86 add $t7,$s1,$s4 #t7=j+n 87 slt $s5,$t7,$t1 88 beq $s5,$0,if_end 89 90 mult $t6,$t1 91 mflo $s5 92 add $s5,$s5,$t7 93 sll $s5,$s5,2 94 lw $s6,arr1($s5) #s6=a[i+m][j+n] 95 96 mult $s3,$t3 97 mflo $s5 98 add $s5,$s5,$s4 99 sll $s5,$s5,2 100 lw $s7,arr2($s5) #s7=b[m][n] 101 102 mult $s6,$s7 103 mflo $s5 104 add $s2,$s2,$s5 105 106 if_end: 107 addi $s4,$s4,1 108 j for_begin4 109 for_end4: 110 mult $s0,$t5 111 mflo $s5 112 add $s5,$s5,$s1 113 sll $s5,$s5,2 114 sw $s2,arr3($s5) #c[i][j]=temp 115 116 addi $s3,$s3,1 117 j for_begin3 118 for_end3: 119 nop 120 121 addi $s1,$s1,1 122 j for_begin2 123 for_end2: 124 nop 125 addi $s0,$s0,1 126 j for_begin1 127 for_end1: 128 nop 129 130 move $s0,$0 131 for_begin5: 132 beq $s0,$t4,for_end5 133 134 move $s1,$0 135 for_begin6: 136 beq $s1,$t5,for_end6 137 138 mult $s0,$t5 139 mflo $s2 140 add $s2,$s2,$s1 141 sll $s2,$s2,2 142 lw $a0,arr3($s2) 143 li $v0,1 144 syscall 145 la $a0,space 146 li $v0,4 147 syscall 148 149 addi $s1,$s1,1 150 j for_begin6 151 for_end6: 152 la $a0,line 153 li $v0,4 154 syscall 155 156 addi $s0,$s0,1 157 j for_begin5 158 for_end5: 159 li $v0,10 160 syscall
以上是关于卷积运算的主要内容,如果未能解决你的问题,请参考以下文章