WINDLX 體系結構 彙編實現矩陣乘法

貌似是 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章