您的位置:首页 > 其它

WINDLX 体系结构 汇编实现矩阵乘法

2012-03-12 14:45 387 查看
貌似是 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 ;fuxiang90@gmail.com
;采取用数组的形式来表示矩阵,假设数组下标从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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: