این یه روش خیلی آسون و ابتدایی واسه ضرب دو ماتریس 3*3 هست که درایه هاش توی آرایه های A و B ذخیره شده
; A, B, and C are arrays of 9 32 bit words each
; i, j, and k are 32 bit words used as loop counters
mov eax, 2 ; we loop from 2 down to 0
mov [i], eax
for_i:
mov eax, 2 ; same here
mov [j], eax
for_j:
mov eax, [i] ; we multiply i by 3 and add j ...
mul al, 3
add eax, [j]
xor ebx, ebx ; and store a zero at that index ...
mov [C+eax], ebx ; in the C array
mov edi, eax ; and we keep the index in edi for later
mov eax, 2 ; again, we loop down from 2
mov [k], eax
for_k:
mov eax, [k] ; now, we get B[3*k+j] into ebx
mul al, 3
add eax, [j]
mov ebx, [B+eax]
mov eax, [i] ; and we get A[i*3+k] into eax
mul al, 3
add eax, [k]
mov eax, [A+eax]
mul eax, ebx ; and we multiply them into edx:eax
add [C+edi], eax ; we add eax into the sum and toss edx
dec [k] ; count down the loop index
jns for_k ; and loop until it is -1
dec [j] ; same here
jns for_j
dec [i] ; same here
jns for_i
اینم ضرب ماتریس 2*2
name "2x2_matrix"
include "emu8086.inc"
org 100h ; directive make tiny com file.
.model small
.stack 100h
.data
size dw 3
A db ?,?,?,?,?,?,?,?,?
B db ?,?,?
C db ?,?,?
message_a db 10,13,"type the elements of matrix A:$"
message_b db 10,13,"type the elements of array B:$"
rez db 10,13,"the result is:$"
.code
start:
mov ax,@data
mov ds,ax
mov bx, 0 ;
read_a:
;compare with sizexsize
mov ax, size
mul size
cmp bx, ax
je reset_counter
;display message
mov dx, offset message_a
mov ah, 09h
int 21h
;read element
mov ah, 01h
int 21h
sub al, 30h
mov A[bx], al
inc bx
jmp read_a
reset_counter:
mov bx, 0
jmp read_b
read_b:
;compare with size
mov ax, size
cmp bx, ax
je calcul
;display message
mov dx, offset message_b
mov ah, 09h
int 21h
;read element
mov ah, 01h
int 21h
sub al, 30h
mov B[bx], al
inc bx
jmp read_b
calcul:
mov bx,0
mov cx,0
for_i:
mov ax, size
cmp bx, ax
je print
mov al,b.size
mul bx
mov al, A[bx+1]
mov bh, B[bx+1]
mul bh
add C[bx], ah
mov al, b.A[bx+2]
mov bl, b.B[bx+2]
mul al
add C[bx], ah
mov al, b.A[bx+3]
mov bl, b.B[bx+3]
mul al
add C[bx], ah
inc bx
jmp for_i
print:
mov dx, offset rez
mov ah,09h
int 21h
mov ax,size
mul size
mov cx,ax
mov ax,0
mov bx,0
print_c:
cmp bx,cx
je finish
mov al, C[bx]
CALL PRINT_NUM
inc bx
jmp print_c
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
finish:
ret
end start
end