در ابتدا برای تعریف ماتریس n*n ، به تعداد n به توان 2 از خانه حافظه به ماتریس اختصاص می دهیم که N خانه اول را به عنوان سطر اول ماتریس ، N خانه دوم را به عنوان سطر دوم و ... در نظر میگیریم.
سپس یک EQU با نام N تعریف میکنیم که نمایانگر طول سطر و ستون ماتریس مربع ما است. چون برنامه ی ضرب دو ماتریس احتیاج به 3 حلقه دارد، از LINE ، COLUMN و COUNTER برای ایجاد این سه حلقه استفاده میکنیم که مقدار اولیه آنها برابر N است. از TEMP هم به عنوان ظرفی برای محاسبه هر یک از درایه های ماتریس حاصل استفاده میکنیم. X و P هم به عنوان دو متغییر کمکی در طول برنامه استفاده می گردد.
قبل از شروع حلقه های محاسبه ، آدرس ماتریس ها A ، B و نتیجه را در سه ثبات SI ، BX و DI می ریزیم.( در آدرس دهی غیر مستقیم از طریق ثبات مجاز به استفاده از DI ، SI و BX در Data Segment و BP در Stack Segment می باشیم. ) با این کار آدرس اولین درایه ی ماتریس های A و B و نتیجه به ترتیب در SI و BX و DI ریخته می شود.
حال سه حلقه با نام های Back1 ، Back2 و Back3 با استفاده از Line ، Column و Counter ایجاد می کنیم که Back1 برای محاسبه سطر به سطر ماتریس نتیجه است که در درون خود Back2 را دارد که وظیفه آن محاسبه درایه به درایه یک سطر ماتریس است که آن هم در درون خود حلقه Back3 را داراست که وظیفه محاسبه ی یک درایه را دارد.
برای محاسبه هر سطر ابتدا با کم کردن Line (که با محاسبه هر سطر از مقدار آن کم می شود ) از N شماره سطر را پیدا کرده و درون CH می ریزیم. برای محاسبه هر سطر باید N درایه را محاسبه کنیم. حال شماره ی سطر موجود در CH را برای محاسبه ی هر درایه از یک سطر در AL ریخته و در N ضرب نموده و حاصل موجود در ثبات AX را به آدرس اولیه ماتریس A ، موجود در SI اضافه می کنیم تا آدرس اولین خانه سطر مورد محاسبه بدست آید. برای فهمیدن اینکه برای هر درایه چه ستونی از ماتریس B را باید در سطر مورد نظر از ماتریس Aضرب کنیم از متغییر P استفاده می کنیم که مقدار اولیه آن برابر صفر است بعد از محاسبه هر درایه از یک سطر مقدار آن بعلاوه یک شده و پس از محاسبه هر سطر مقدار آن دوبار صفر می گردد. پس P را درون AL ریخته و آن را به BX (حاوی آدرس اولیه ماتریس B ) اضافه می کنیم تا آدرس اولین درایه ی ستون P ام ماتریس B درون BX قرار گیرد.
برای مشاهده ی ادامه توضیحات فایل Pdf ضمیمه را دانلود نمایید...
PAGE 110,100
TITLE 'MATRIX.ASM' add two ASCII
;-----------------------------------------------
; Defining segment of program
; ---------------------------
CODESG SEGMENT
ASSUME SS:CODESG,DS:CODESG,CS:CODESG
ORG 100H
START: JMP MAIN ;1-Jump over data
;
; 1- Define data
; --------------
M_A DB 1,2,3,4,5,6,7,8,9,1,1,1,1,1,1,1
M_B DB 1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1
M_RESULT DW 16 DUP (?)
TEMP DW ?
N EQU 4
LINE DB N
COLUMN DB N
COUNTER DB N
X DW ?
P DB 0
;
; 2- The rest of instructions
; ---------------------------
MAIN PROC NEAR
MOV DI,OFFSET M_RESULT
MOV SI,OFFSET M_A
MOV BX,OFFSET M_B
BACK1:
MOV CH,N
SUB CH,LINE
MOV COLUMN,N
BACK2:
MOV AL,CH
MOV X,N
MUL X
ADD SI,AX
MOV AH,0
MOV AL,P
ADD BX,AX
MOV COUNTER,N
MOV TEMP,0
BACK3:
MOV AL,[SI]
MUL [BX]
ADD TEMP,AX
INC SI
ADD BX,N
DEC COUNTER
JNZ BACK3
;
MOV AX,TEMP
MOV [DI],AX
ADD DI,2
MOV SI,OFFSET M_A
MOV BX,OFFSET M_B
INC P
DEC COLUMN
JNZ BACK2
;
MOV P,0
DEC LINE
JNZ BACK1
;
MOV AX,4C00H ;8- End of
INT 21H ;9- processing
MAIN ENDP ; End of procedure
CODESG ENDS ; End of segment
END START ; End of program
;By : Mojtaba Alizadeh Mojia91@yahoo.com
فایل توضیحات :
موضوعات مشابه:
علاقه مندی ها (Bookmarks)