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 ;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