为方便查看,贴上实验4-3所用的循环展开的代码。
.data
str: .asciiz "the data of matrix 3:\n"
mx1: .space 512
mx2: .space 512
mx3: .space 512
.text
initial: daddi r22,r0,mx1 ; 这个initial模块是给三个矩阵赋初值
daddi r23,r0,mx2 ; 获取三个矩阵的初始地址
daddi r21,r0,mx3
input: daddi r9,r0,64 ; r0是0,r9保存元素个数
daddi r8,r0,0 ; r8清零
loop1: dsll r11,r8,3 ; r8*8,获取偏移地址
dadd r10,r11,r22 ; mx1初值为2
dadd r11,r11,r23 ; mx2初值为3
daddi r12,r0,2
daddi r13,r0,3
sd r12,0(r10)
sd r13,0(r11)
daddi r8,r8,1 ; r8自增
slt r10,r8,r9 ; 是否已经给矩阵全部赋值
bne r10,r0,loop1
mul: daddi r16,r0,8 ; r16是8
daddi r17,r0,0 ; r17是0
loop2: daddi r18,r0,0 #这个循环是执行for(int i = 0, i < 8; i++)的内容
loop3: daddi r19,r0,0 #这个循环是执行for(int j = 0, j < 8; j++)的内容
daddi r20,r0,0 #r20存储在计算result[i][j]过程中每个乘法结果的叠加值
; 0
dsll r8,r17,6 #这个循环的执行计算每个result[i][j]; i*64
dsll r9,r19,3 ; k*8
dadd r8,r8,r9 ; i*64+k*8
dadd r8,r8,r22 ; mx1[i*64+k*8]
ld r10,0(r8) #取mx1[i][k]的值
dsll r8,r19,6 ; k*64
dsll r9,r18,3 ; j*8
dadd r8,r8,r9 ;<