卷积运算增强版

任务

使用MIPS汇编语言编写一个进行卷积运算的汇编程序(不考虑延迟槽)。

具体要求

    • 首先读取待卷积矩阵的行数m1和列数n1,然后读取卷积核的行数m2和列数n2。
    • 然后再依次读取待卷积矩阵(m1行n1列)和卷积核(m2行n2列)中的元素。
    • 卷积核的行列数分别严格小于待卷积矩阵的行列数.
    • 测试数据中0<m1, n1, m2, n2 <11
    • 输入的每个数的绝对值不超过1000000.
    • 最终输出进行卷积后的结果
    • 输出中,有m1-m2+1行,每行有n1-n2+1个数据,每个数据用空格分开。
    • 每个数据请使用64位的二进制补码形式输出
    • 请使用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

      

正确的输出应该是:

 

        
0000000000000000000000000000000000000000000000000000000000011001 0000000000000000000000000000000000000000000000000000000000011111 
0000000000000000000000000000000000000000000000000000000000101011 0000000000000000000000000000000000000000000000000000000000110001 
0000000000000000000000000000000000000000000000000000000000111101 0000000000000000000000000000000000000000000000000000000001000011 

      

提交要求

  • 请勿使用.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 arrhi:.word 0:101
  5 arrlo:.word 0:101
  6 space:.asciiz " "
  7 line:    .asciiz "\n"
  8 
  9 .text
 10     li    $v0,5        #scanf("%d",&m1)
 11     syscall
 12     move    $t0,$v0    #t0=m1
 13     li    $v0,5        #scanf("%d",&n1)
 14     syscall    
 15     move    $t1,$v0    #t1=n1
 16     
 17     li    $v0,5        #scanf("%d",&m2)
 18     syscall
 19     move    $t2,$v0    #t2=m2
 20     li    $v0,5        #scanf("%d",&n2)
 21     syscall    
 22     move    $t3,$v0    #t3=n2
 23     
 24     move    $s0,$0
 25     move    $s1,$0
 26     move    $s2,$0    
 27 read1:mult    $s0,$t1
 28     mflo    $s2
 29     add    $s2,$s2,$s1
 30     li    $v0,5
 31     syscall
 32     move    $t4,$v0
 33     sll    $s2,$s2,2
 34     sw    $t4,arr1($s2)    #t4=a[j][j]
 35     
 36     addi    $s1,$s1,1
 37     bne    $s1,$t1,read1
 38     
 39     move    $s1,$0
 40     addi    $s0,$s0,1
 41     bne    $s0,$t0,read1
 42     
 43     move    $s0,$0
 44     move    $s1,$0
 45     move    $s2,$0
 46 read2:mult    $s0,$t3
 47     mflo    $s2
 48     add    $s2,$s2,$s1
 49     li    $v0,5
 50     syscall
 51     move    $t4,$v0
 52     sll    $s2,$s2,2
 53     sw    $t4,arr2($s2)    #t4=b[j][j]
 54     
 55     addi    $s1,$s1,1
 56     bne    $s1,$t3,read2
 57     
 58     move    $s1,$0
 59     addi    $s0,$s0,1
 60     bne    $s0,$t2,read2
 61     
 62     sub    $t4,$t0,$t2
 63     addi    $t4,$t4,1    #t4=m1-m2+1
 64     sub    $t5,$t1,$t3
 65     addi    $t5,$t5,1    #t5=n1-n2+1
 66     
 67     move    $s0,$0    #s0=i
 68 for_begin1:
 69     beq    $s0,$t4,for_end1
 70     
 71     move    $s1,$0    #s1=j
 72     for_begin2:
 73         beq    $s1,$t5,for_end2
 74         move     $s2,$0    #s2=temp
 75         move    $t8,$0
 76         move    $t9,$0
 77         
 78         move    $s3,$0    #s3=m
 79         for_begin3:
 80             beq    $s3,$t2,for_end3
 81         
 82                 move    $s4,$0    #s4=n
 83                 for_begin4:
 84                     beq    $s4,$t3,for_end4
 85                     
 86                     add    $t6,$s0,$s3    #t6=i+m
 87                     slt    $s5,$t6,$t0
 88                     beq    $s5,$0,if_end
 89                     add    $t7,$s1,$s4    #t7=j+n
 90                     slt    $s5,$t7,$t1
 91                     beq    $s5,$0,if_end
 92                     
 93                     mult    $t6,$t1
 94                     mflo    $s5
 95                     add    $s5,$s5,$t7
 96                     sll    $s5,$s5,2
 97                     lw    $s6,arr1($s5)    #s6=a[i+m][j+n]
 98                     
 99                     mult    $s3,$t3
100                     mflo    $s5
101                     add    $s5,$s5,$s4
102                     sll    $s5,$s5,2
103                     lw    $s7,arr2($s5)    #s7=b[m][n]
104                     
105                     mthi    $t8
106                     mtlo    $t9
107                     madd    $s6,$s7
108                     mfhi    $t8
109                     mflo    $t9    
110             
111                 if_end:
112                     addi    $s4,$s4,1
113                     j    for_begin4
114                 for_end4:
115                     mult    $s0,$t5
116                     mflo    $s5
117                     add    $s5,$s5,$s1
118                     sll    $s5,$s5,2
119                     sw    $t8,arrhi($s5)    #hi[i][j]=temphi
120                     sw    $t9,arrlo($s5)    #lo[i][j]=templo
121         
122             addi    $s3,$s3,1
123             j    for_begin3
124         for_end3:
125             nop
126         
127         addi    $s1,$s1,1
128         j    for_begin2
129     for_end2:
130         nop
131     addi    $s0,$s0,1
132     j    for_begin1
133 for_end1:
134     nop
135     
136     move    $s0,$0
137 for_begin5:
138     beq    $s0,$t4,for_end5
139     
140     move    $s1,$0
141     for_begin6:
142         beq    $s1,$t5,for_end6
143         
144         mult    $s0,$t5
145         mflo    $s2
146         add    $s2,$s2,$s1
147         sll    $s2,$s2,2
148         lw    $a0,arrhi($s2)
149         li    $v0,35
150         syscall
151         lw    $a0,arrlo($s2)
152         li    $v0,35
153         syscall
154         la    $a0,space
155         li    $v0,4
156         syscall    
157         
158         addi    $s1,$s1,1
159         j    for_begin6
160     for_end6:
161         la    $a0,line
162         li    $v0,4
163         syscall
164         
165     addi    $s0,$s0,1
166     j    for_begin5
167 for_end5:
168     li    $v0,10
169     syscall

 

转载于:https://www.cnblogs.com/tuoniao/p/10348679.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值