extern io_get_dec
extern io_print_dec
extern io_print_char
section .bss
n resd 1
m resd 1
k resd 1
cnt resd 1
matrix_a resd 10000
matrix_b resd 10000
matrix_c resd 10000
section .text
global main
main:
call io_get_dec
mov [n], eax
call io_get_dec
mov [m], eax
call io_get_dec
mov [k], eax
.prep_matrix_a:
mov edi, matrix_a ;edi - указатель на матрицу
mov esi, 0 ;esi - элемент матрицы
mov ebx, [n]
imul ebx, [m] ;ebx - всего элементов в матрице
.read_matrix_a:
cmp esi, ebx
je .prep_matrix_b
push ecx
push ebx
call io_get_dec
pop ecx
pop ebx
mov [edi], eax
add edi, 4
inc esi
jmp .read_matrix_a
.prep_matrix_b:
mov edi, matrix_b ;edi - указатель на матрицу
mov esi, 0 ;esi - элемент матрицы
mov ebx, [m]
imul ebx, [k] ;ebx - всего элементов в матрице
.read_matrix_b:
cmp esi, ebx
je .end
push ecx
push ebx
call io_get_dec
pop ecx
pop ebx
mov [edi], eax
add edi, 4
inc esi
jmp .read_matrix_b
.prep_matrix_c:
mov edi, matrix_c ;указатель на матрицу
mov esi, 0
mov ebx, [n]
imul ebx, [k]
.fill_matrix_c:
cmp esi, ebx
je .end
;esi - счетчик элементов в matrix_c
;ecx - значение элемента
;eax - номер элемента
;ebx - [n]
mov ecx, 0
mov eax, esi
mov edx, 0
mov ebx, [n]
;eax - номер по строке
;edx - номер по столбцу
;c[eax][edx] - заполняем
div ebx
cmp [cnt], [m]
jne .sum
.next
mov [edi], ecx
add edi, 4
inc esi
jmp .fill_matrix_c
.sum:
; += a[eax][ebx] * b[ebx][edx]
; += [matrix_a + eax * n + ebx] * [matrix_b + ebx * m + edx]
mov ebx, [matrix_a + eax * n + ebx]
imul ebx, [matrix_b + ebx * m + edx]
add ecx, ebx
inc [cnt]
jmp .next
.prep_print_matrix_c:
mov edi, matrix_b ;edi - указатель на матрицу
mov esi, 0 ;esi - элемент матрицы
mov ebx, [m]
imul ebx, [k] ;ebx - всего элементов в матрице
;[cnt] - счетчик столбцов
.print_matrix_c:
cmp esi, ebx
je .end
mov eax, [edi]
call io_print_dec
inc [cnt]
mov eax, [cnt]
cmp eax, [n]
jne .print_prob
mov [n], 0
mov eax, 10
call io_print_char
jmp .print_matrix_c
.print_prob
mov eax, 32
call io_print_char
mov [edi], ecx
add edi, 4
inc esi
jmp .print_matrix_c
.end:
xor eax, eax
ret