/* #include unsigned int A[][4] = {{ 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9,10,11,12}, {13,14,15,16}}; unsigned int B[][4] = {{ 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9,10,11,12}, {13,14,15,16}}; unsigned int C[][4] = {{ 0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}}; unsigned int multiply(unsigned int x, unsigned int y){ unsigned int a, b, c; unsigned int i; a = x; b = y; c = 0; for (i = 0; i < 32; i++) { if ((b & 1) == 1) { c += a; } a = a << 1; b = b >> 1; } return(c); } int main() { unsigned int i, j, k; for (i = 0; i < 4; i++){ for (j = 0; j < 4; j++){ C[i][j] = 0; for (k = 0; k < 4; k++) C[i][j] += multiply(A[i][k], B[k][j]); } } for (i = 0; i < 4; i++){ for (j = 0; j < 4; j++){ printf("%5u", C[i][j]); } printf("\n"); } return 0; } */ .data A: .word 1, 2, 3, 4 .word 5, 6, 7, 8 .word 9,10,11,12 .word 13,14,15,16 B: .word 1, 2, 3, 4 .word 5, 6, 7, 8 .word 9,10,11,12 .word 13,14,15,16 C: .zero 64 P: .string "%5u" .text .globl main multiply: addi sp, sp, -32 sw ra, 28(sp) sw a1, 24(sp) sw a2, 20(sp) li a0, 0 # product li a1, 32 # counter loop: andi a2, a5, 1 beq a2, zero, shift add a0, a0, a4 shift: slli a4, a4, 1 srli a5, a5, 1 addi a1, a1, -1 bne a1, zero, loop lw a2, 20(sp) lw a1, 24(sp) lw ra, 28(sp) addi sp, sp, 32 jr ra main: addi sp,sp,-32 sw ra,28(sp) start: li s3, 0 # i next_i: li s4, 0 # j next_j: li a3, 0 # C[i][j] = 0; li s5, 0 # k ld_a: lui a1, %hi(A) addi a2, a1, %lo(A) slli a6, s3, 2 # i*4 add a6, a6, s5 # [i][k] slli a6, a6, 2 # to word offset add a2, a2, a6 lw a4, 0(a2) # A[i][k] ld_b: lui a1, %hi(B) addi a2, a1, %lo(B) slli a6, s5, 2 # k*4 add a6, a6, s4 # [k][j] slli a6, a6, 2 # to word offset add a2, a2, a6 lw a5, 0(a2) # B[k][j] mult: call multiply # A[i][k] * B[k][j] add a3, a3, a0 # C[i][j] += A[i][k] * B[k][j]; check_k: addi s5, s5, 1 # k++ li a7, 4 # for (k = 0; k < 4; k++) bne s5, a7, ld_a st_c: lui a1, %hi(C) addi a2, a1, %lo(C) slli a6, s3, 2 # i*4 add a6, a6, s4 # [i][j] slli a6, a6, 2 # to word offset add a2, a2, a6 sw a3, 0(a2) # C[i][j] check_j: addi s4, s4, 1 # j++ li a7, 4 # for (j = 0; j < 4; j++) bne s4, a7, next_j check_i: addi s3, s3, 1 # i++ li a7, 4 # for (i = 0; i < 4; i++) bne s3, a7, next_i print_c: li s3, 0 # i p_next_i: li s4, 0 # j p_next_j: lui a1, %hi(C) addi a2, a1, %lo(C) slli a6, s3, 2 # i*4 add a6, a6, s4 # [i][j] slli a6, a6, 2 # to word offset add a2, a2, a6 lw a1, 0(a2) # C[i][j] lui a5, %hi(P) addi a0, a5, %lo(P) call printf p_check_j: addi s4, s4, 1 # j++ li a7, 4 # for (j = 0; j < 4; j++) bne s4, a7, p_next_j print_return: li a0, 10 # ENTER call putchar p_check_i: addi s3, s3, 1 # i++ li a7, 4 # for (i = 0; i < 4; i++) bne s3, a7, p_next_i finish: li a0, 0 # return 0 lw ra, 28(sp) addi sp, sp, 32 jr ra .end