貌似是 2011年10月份寫的,現在都不清楚了其中的一些細節,其實應該早點記錄的。
主要是 實現如下的代碼
; double s1 = 1.10001 ,s2 = 2.20002
; for(int i = 0 ; i < 10 ; i ++)
; for(j = 0 ; j < 10 ; j ++)
; MA[i][j] = MB[i][j] = 1
;下面是矩陣乘法的主循環
; for(int i = 0 ; i < 10 ; i ++)
; for(j = 0 ; j < 10 ; j ++)
; {
; for(data = 0,k = 0 ; k < 10 ; k ++)
; {
; data += MA[i][k] * MB[k][j];
; }
; MC[i][j] = data;
; }
;
其實就是三層循環,思路清晰就很好解決,會寫一層循環就會寫三層,寄存器的分別對應哪個值,一定要清楚 ,下面是代碼。不過是沒有優化的,因爲這個是北郵體系結構的作業,所以優化的代碼就不貼出,其實優化的手段就是減少相關。
;Author : Fu Xiang ;[email protected]
;採取用數組的形式來表示矩陣,假設數組下標從0 開始 ,矩陣爲 10*10
;那麼有 矩陣MA[i][j] <--> array[i * 10 + j]
;採取行存儲方式,即用數組來表示矩陣 比如10*10 的矩陣,那麼 數組的第一個元素 對應MA[0][0]
;第10個元素對應 MA[0][10] 第11個元素 對應M[1][0] 以此類推
;主要是實現如下的C 代碼
; double s1 = 1.10001 ,s2 = 2.20002
; for(int i = 0 ; i < 10 ; i ++)
; for(j = 0 ; j < 10 ; j ++)
; MA[i][j] = MB[i][j] = 1
; for(int i = 0 ; i < 10 ; i ++)
; for(j = 0 ; j < 10 ; j ++)
; {
; for(data = 0,k = 0 ; k < 10 ; k ++)
; {
; data += MA[i][k] * MB[k][j];
; }
; MC[i][j] = data;
; }
;
.data
MA: .space 400
MB: .space 400
MC: .space 400
s1: .float 1.0
.text
.global main
main:
addi r1,r0,MA ;將MA的地址 賦給r1
addi r3,r2,MB
addi r11, r1, #400 ;MA的 末地址
lf f2,s1
;對矩陣MA MB進行初始化
init:
sf 0(r1),f2 ;將f1的值賦給MA[i]
sf 0(r3),f2
addi r1,r1,#4 ;
addi r3,r3,#4
slt r2,r1,r11 ; 比較r1 和MA的末地址是否相等,
bnez r2,init ;不等 則繼續循環
;主循環 開始
addi r21,r0,#40 ;常量
addi r22,r0,#10 ;常量
addi r23,r0,#4
addi r29,r0,#0 ;
addi r7,r29,0 ;i = 0
loop1:
addi r8,r29,0 ;j = 0
loop2:
addi r9,r29,0 ;k = 0;
movi2fp f0,r29 ;data = 0 給變量賦0
;下面開始第三層的主循環
loop3:
multu r11,r7,r21 ;r11 = i * 40
multu r1,r9,r23 ;r1 = k * 4
addu r11,r11,r1 ;計算出 MA[i][k] 的地址
ld f2,MA(r11)
multu r13,r9,r21 ;r13 = k * 40
multu r1,r8,r23 ;;r1 = i * 4
addu r13,r13,r1 ;計算出 MB[k][i] 的地址
ld f4,MB(r13)
multf f6,f2,f4
addf f0,f0,f6 ;data += MA[i][k] * MB[k][j];
addi r9,r9,#1
slt r2,r9,r22 ;r9 即 k是否等於10
bnez r2,loop3 ;不等 繼續循環
;; 那麼 這裏要完成這個操作MC[i][j] = data;
multu r13,r7,r21 ;r13 = i *40
multu r1,r8,r23 ;r1 = j*4
addu r13,r13,r1 ;計算 MC[i][j] 的地址
sf MC(r13),f0
addi r8,r8,#1
slt r2,r8,r22 ;r8 即 j是否等於10
bnez r2,loop2 ;不等 繼續循環
addi r7,r7,#1
slt r2,r7,r22 ;r7 即 i是否等於10
bnez r2,loop1 ;不等 繼續循環
trap 0 ; end of program