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
mov ebx, 0
jmp .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) * 4] * [matrix_b + (ebx * m + edx) * 4]
;edi = a[eax][ebx]
push edi
push esi
mov [edi], eax
imul [edi], [n]
add [edi], ebx
imul [edi], 4
add [edi], matrix_a
;esi = b[ebx][edx]
mov [esi], ebx
imul [esi], [m]
add [esi], edx
imul [esi], 4
add [esi], matrix_b
;edi = a[eax][ebx] * b[ebx][edx]
imul [edi], [esi]
add ecx, [edi]
inc [cnt]
mov [edi], [cnt]
cmp [edi], [m]
pop esi
pop edi
jne .sum
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