Saturday, May 30, 2009

Matrix multiplication

Write a program in 8086 assembly language that multiplies two 2*2 matrices to create a third matrix of size (2*2). Make suitable assumptions, if any. Properly document the program.

Solution.

;
; BUILD - TASM MATMUL.ASM
; TLINK MATMUL
;
; USAGE - MATMUL

READNUM MACRO NUM
PUSH AX
PUSH BX
MOV AH, OLH ;GET CHAR FROM KEYBOARD INT 21H CALL DOS SERVICE
SUB AL, ‘0’ ;ASCII NUM TO DECIMAL
MOV BH, OAH
MUL BH MULTIPLY BY 10
MOV NUM, AL STORE FIRST DIGIT IN NUM
MOV AH, OLH GET CHAR FROM KEYBOARD
INT 21H CALL DOS SERVICE
SUB AL, ‘0’ ASCII NUM TO DECIMAL
ADD NUM , AL ADD SECOND DIGIT
POP BX
POP AX
ENDM
PRINTSTRING MACRO MSG ;PRINTSTRING – THE USER
DEFINED MACRO
MOV AH, 09H DISPLAY STRING FUNCTION
MOV DX, OFFSET MSG ;INITIALIZE DX TO MSG
INT 21H CALL DOS SERVICE

_DATA SEGMENT _DATA – NAME OF USER DEFINED SEGMENT

CREQU 0DB ASCII CODE FOR CARRIAGE
RETURN
LF EQU OAH ;ASCII CODE FOR LINE FEED
M EQU 3 ;ORDER OF MATRIX
MSG DB ‘PROGRAM FOR FINDING THE PRODUCT OF MATRICES(M X M)$’
MSGO DB CR,LF,’ENTER ELEMENTS OF MATRIX A IN ROW MAJOR…$’
MSGL DB CR,LF,’ENTER ELEMENTS OF MATRIX B IN ROW MAJOR…$’
MSG2 DB CR,LF,’ELEMENT:’,‘$’
MSG3 DB CR,LF,’PRODUCT MATRIX’
C=A*B…….’, ‘$’
;VARIABLES FOR MATRIX MANIPULATION
MATA DB 20 DUP(0)
MATB DB 20 DUP(0)
MATC DB 20 DUP(0)
NEWLINE DB CR, LF, ‘$’

SPACE DB ‘$’
MATRIX OPERATION INDEX VARIABLES
I DB?
J DB?
K DB?
RESULT DB 5 DUP(0)
TNUM DB?
_DATA ENDS ;END OF _DATA SEGMENT

_CODE SEGMENT
;INITIALIAZE CS, DS
ASSUME CS: CODE, DS: _DATA
START: MOV AX, _DATA ;INITIALIZE OS TO THE
DATA SEGMENT
MOV DS, AX
PRINTSTRING MSG
;READ MATRIX A
PRINT STRING MSG0
;PUT ALL INPUT PARAMETERS ONTO THE STACK IN REVERSE ORDER
MOV AL, M
PUSH SI
CALL READMATRIX
ADD SP,4
PUSH OPERATIONS
;READ MATRIX B
PRINTSTRING MSGL

;PUT ALL INPUT PARAMETERS ONTO THE STACK IN REVERSE
ORDER
MOV AL,M
PUSH AX
MOV SI, OFFSET MATB
PUSH SI
CALL READMATRIX
ADD SP,4 ;ADJUST STACK FOR TWO PUSH OPERATIONS

;MAT C=MATA*MATB
;PUT ALL INPUT PARAMETERS ONTO THE STACK IN REVERSE ORDER

PRINTSTRING MSG3
MOV AL,M
PUSH AX,
MOV AX, OFFSET MATC
PUSH AX
MOV AX, OFFSET MATB
PUSH AX
MOV AX, OFFSET MATA
PUSH AX
CAL MULTIMATRIX
ADD SP,8 :ADJUST STACK FOR FOUR PUSH
OPERATION
MOV AL,M
PUSH AX
MOV SI, OFFSET MATC
PUSH SI
CALL PRINTMATRIX
ADD SP,4 ;ADJUST STACK FOR TWO PUSH OPERATION
MOV AH,4CH ;PROGRAM TERMINATE FUNCTION
MOV AL, 00H ;RETURN CODE
FOR ERROR LEVEL SETTING
INT 21 H ;CALL DOS SERVICE
;MACRO: MELEADDR
;LOGIC
;ADDR = ADDR(MAT)+J+(I-I)*ORDER
;RETURNS:
;BX-EFFECTIVE ADDRESS OF AN ELEMENT

MELEADDR MACRO MAT,I,J,ORDER

PUSH AX
MOV AL,I
DEC AL
MOV AH,00 ;AX = (I-I)
MOV BI, ORDER ;AX = (I-I)*ORDER
NUL BI
ADD AI,J
MOV BX,MAT
ADD BX,AX

(I-I)* ORDER

POP AX
ENDM

;MULTIMATRIX (A,B,C ORDER)
;C=A*B

MULTIMATRIX PROC NEAR
PUSH BP
MOV BP,SP ;MAKE STACK
ADDRESSABLE
PUSH SI
PUSH DI
PUSH CX
PUSH BX
PUSH AX
MOV SI, [BP+4] ; MATRIX A
MOV DI, [BP+6] ;MATRIX B
MOV BX,[BP+8] ; MATRIX C
MOV DX, [BP+10] ;ORDER OF MATRIX. USE
LOWER BYTE
;DL-ORDER OF THE MATRIX

MOV A1,01
MOV I, A1 ;I=1

MNEXTI:
MOV A1,01
MOV J1, A1 ;J=1
MNEXTJ:
MOV A1,01
MOV K, 01 ;K=1
MOV CL, 00 ;C[I][J]=0
MNEXTK:
MEMEADDR [BP+4],I,K,DL
MOV AH,00
MOV AL,[BX] ;AL=B[I][K]
MELEADDR [BP+6],K,J,DL
MUL BYTE PTR [BX] ;AX = B[I][K]
ADD CL,AL
C[I][J]=C[I][J]+B[I][K]*C[K][J]
;K=K+1
MOV AL,K
INC AL
MOV K,AL
CMP AL,DL
JLE MNEXTK ;REPEAT FOR K <= ORDER
MELEADDR [BP+8],I,J,DL
MOV [BX],CL ;PUT C[I][J] INTO C MATRIX

;J=J+1
MOV AL,J
INC AL
MOV J,AL
CMP AL,DL
JLE MNEXTI ;REPEAT FOR I ,= ORDER

POP AX ;RESTORE
REGISTERS
POP BX
POP CX
POP DI
POP SI
POP BP
RET
MULTIMATRIX ENDP

;FUNCTION: READ MATRIX (MATRIX, ORDER OF MATRIX)
;INPUT:
;PUT PARAMETERS INTO THE STACK IN REVERSE ORDER
;RETURNS:
; MATRIX

READMATRIX PROC NEAR
PUSH BP
MOV BP,SP ;SAVE REGISTERS
ADDRESSABLE
PUSH BX
PUSH AX
MOV SI, [BP+4] ;POINTER TO THE MATRIX

MOV AX, [BP+6] ;ORDER OF MATRIX
MOV CH, AL ;CH=I INDEX CONTROL
NEXTI:
MOV AX, [BP+6] ;CL=J INDEX CONTROL
MOV CL, AL
NEXTJ:
INC SI ;INDEX FOR NEXT ELEMENT
PRINTSTRING MSG2
READNUM TNUM ;READ NUMBER
MOV AL, TNUM ;STORE INTO AL
MOV [SI], AL ;STORE NUMBER INTO TABLE
DEC CL ;REPEAT FOR ALL
JNZ NEXTJ COLUMNS
DEC CH ;REPEAT FOR ALL ROWS
POP AX ;RESTORE THE REGISTERS
POP BX
POP BP
RET
READMATRIX ENDP
FUNCTION: PRINTMATRIX(MATRIX, ORDER OF MATRIX)
PRINTMATRIX PROC NEAR
PUSH BP
MOV BP, SP MAKE STACK ADDRESABLE
PUSH BX
PUSH AX
MOV SI, [BP+4] SI=POINTER TO MATRIX
MOV SI, [BP+6] ORDER OF MATRIX
MOV CH, AL CH=I INDEX CONTROL

PNEXTI:
PRINTSTRING NEW LINE
MOV AX, [BP+6]
MOV CL, AL ` ;CL=J INDEX CONTROL
PNEXTJ:
INC SI ;INDEX FOR NEXT ELEMENT
;DISPLAY ELEMENT
PUSH SI
MOV AH, 0 ;AX,=MAT[I][J]
MOV AL, BYTE PTR [SI]
MOV SI, OFFSET RESULT
CALL HEX2ASC
PRINTSTRING RESULT
PRINTSTRING SPACE
POP SI
DEC CI
JNZ PNEXTJ ;REPEAT FOR ALL COLUMNS
DEC CH
JNZ PNEXTI ;REPEAT FOR ALL ROWS
POP AX ;RESTORE REGISTERS
POP BX
POP BP
RET

PRINTMATRIX ENDP
;FUNCTION TO CONVERT HEXADECIMAL NUMBER TO ASCII STRING
;AX – INPUT NUMBER
;SI – POINTER TO RESULT STORAGE AREA

HEX2ASC PROC NEAR
PUSH AX ;SAVE REGISTERS
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV CX, 00H ;COUNTER FOR INTERMEDIATE DATA PUSHED

MOV BX,OAH ;LOAD 10 IN BL
RPTL:
MOV DX, 00
DIV BX ;DIVIDE NUM BY 10
ADD DL, ’0’ ;CONVERT REMAINDER TO ASCII
PUSH DX ;STORE ASCII DIGIT ONTO THE STACK
INC CX ;UPDATE COUNTER

CMP AX, 0AH ;IS NUM LESS THAN OR EQUAL TO 10
JGE RPTL

ADD AL, ‘0’
MOV [SI], AL
;POP ALL INTERMEDIATE DATA FROM STACK AND STORE IN RESULT RPT2:
POP AX ;POP DATA
INC SI ;ADVANCE RESULT STRING POINTER
MOV [SI], AL ;STORE IN RESULT
LOOP RPT2

INC SI
MOV AL, ‘$’
MOV [SI], AL ;APPEND END OF STRING

POP SI ;RESTORE THE REGISTERS
POP DX
POP CX
POP BX
POP AX
RET

HEX2ASC ENDP
_CODE ENDS ;END OF SEGMENT
END START ;END OF PROGRAM

No comments:

Post a Comment