📄 matrix.asm
字号:
.MODEL SMALL
.STACK 64
;******************************************
.DATA
msg0 db 'please input matrixA(3*4)(element-range: 0 to 255):$'
msg1 db 'please input matrixB(4*5)(element-range: 0 to 255):$'
msg2 db 'do matrixA*matrixB,get matrixC(3*5):$'
msg3 db ' Matrix Multiply $'
LF db 0ah
CR db 0dh
SPA db 20h
GENE db 1,10,100
matrixA db 12 dup(0)
matrixB db 20 dup(0)
matrixC dw 15 dup(0)
tempNum db 0,0,0
I db 0
J db 0
K db 0
buffer db 256 dup(?)
argList dw ?,?,? ;READMATRIX arg-list
;******************************************
.CODE
;MAIN proc
MAIN PROC FAR
START:
mov ax,@data
mov ds,ax
mov es,ax
;*******
;set text mode
mov ah,00h
mov al,03h
int 10h
mov ah,09h
lea dx,msg3 ;get msg addr
int 21h
call LFCR
call LFCR
;matrixA input
lea ax,matrixA
mov argList,ax
mov ax,12
mov argList+2,ax
lea ax,msg0
mov argList+4,ax
call READMATRIX
call LFCR
call LFCR
;matrixB input
lea ax,matrixB
mov argList,ax
mov ax,20
mov argList+2,ax
lea ax,msg1
mov argList+4,ax
call READMATRIX
;C=A mul B
call MATRIXMUL
call LFCR
call LFCR
;print matrixC
mov ah,09h
lea dx,msg2 ;get msg addr
int 21h
call LFCR
call PRINTMATRIXC
;press any key to exit
mov ah,08h
int 21h
;*******
;return DOS
mov ax,4C00H
int 21h
MAIN ENDP
;MAIN proc
;*************sub procedures*****************
;READMATRIX proc
READMATRIX PROC NEAR
push ax
push bx
push cx
push dx
push si
push di
mov ah,09h
mov dx,argList+4 ;get msg addr
int 21h
call LFCR
;*********************
call READSOURCE
mov cx,argList+2 ;get matrix element count
mov si,0000h ;buffer index
mov di,0000h
GOON: mov al,buffer[si]
inc si
mov dx,0000h
lea bx,GENE
cmp al,'$'
jz EXIT
cmp al,CR
jz GTNM
cmp al,SPA
jz GTNM
sub al,30h
mov tempNum[di],al
inc di
jmp GOON
GTNM: dec di
mov al,tempNum[di]
mov ah,[bx]
inc bx
mul ah
add dl,al
cmp di,0
jnz GTNM
PUTIN: mov ax,argList+2
sub ax,cx
mov di,ax
mov bx,argList
mov [bx][di],dl ;put in one matrix element
mov di,0000h
loop GOON
EXIT: pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
READMATRIX ENDP
;READMATRIX proc
;READSOURCE proc
READSOURCE PROC NEAR
push ax
push si
mov si,0000h
NEXT: mov ah,01h
int 21h
mov buffer[si],al
inc si
cmp al,CR
jz GOON1
cmp al,SPA
jz GOON2
cmp al,'$'
jz HU
jmp NEXT
GOON1: call LFCR
GOON2: jmp NEXT
HU: mov al,'$'
mov buffer[si],al
dec si
mov al,SPA
mov buffer[si],al
pop si
pop ax
ret
READSOURCE ENDP
;READSOURCE proc
;LFCR proc
LFCR PROC NEAR
push ax
push dx
mov ah,02h
mov dl,CR
int 21h
mov ah,02h
mov dl,LF
int 21h
pop dx
pop ax
ret
LFCR ENDP
;LFCR proc
;MATRIXMUL proc
MATRIXMUL PROC NEAR
push ax
push bx
push cx
push dx
push si
mov dx,0000h
LOOPI: inc I
cmp I,4
jz QUIT
mov al,00h
mov J,al
LOOPJ: inc J
cmp J,6
jz LOOPI
mov al,00h
mov K,al
LOOPK: inc K
cmp k,5
jz GO
;done
mov al,I
dec al
mov cl,4
mul cl
mov ah,K
dec ah
add al,ah
mov ah,00h
mov si,ax
mov al,matrixA[si]
mov ah,00h
push ax
mov al,K
dec al
mov cl,5
mul cl
mov ah,J
dec ah
add al,ah
mov ah,00h
mov si,ax
mov al,matrixB[si]
mov ah,00h
pop bx
mul bl
add dx,ax
;done
jmp LOOPK
GO: ;done
mov al,I
dec al
mov cl,5
mul cl
mov ah,J
dec ah
add al,ah
mov ah,00h
mov si,ax
add si,si
mov matrixC[si],dx
mov dx,0000h
;done
jmp LOOPJ
QUIT: pop si
pop dx
pop cx
pop bx
pop ax
ret
MATRIXMUL ENDP
;MATRIXMUL proc
;PRINTMATRIXC proc
PRINTMATRIXC PROC NEAR
push ax
push bx
push cx
push dx
push si
mov cx,15
LP: mov ax,15
sub ax,cx
mov si,ax
mov dx,si
add si,si
mov ax,matrixC[si]
call PRINTELEM
;check if could cr lf
inc dx
mov ax,dx
mov dx,0000h
mov bx,5
div bx
cmp dx,0000h
jnz GOLP
call LFCR
GOLP: loop LP
pop si
pop dx
pop cx
pop bx
pop ax
ret
PRINTMATRIXC ENDP
;PRINTMATRIXC proc
;PRINTELEM proc
PRINTELEM PROC NEAR
push ax
push bx
push dx
mov dx,007eh
push dx
GO1: mov bx,10
mov dx,0000h
div bx
push dx
cmp ax,0
jnz GO1
GO2: pop ax
cmp al,7eh
jz QT
add al,30h
mov dl,al
mov ah,02h
int 21h
jmp GO2
QT: mov ah,02h
mov dl,SPA
int 21h
pop dx
pop bx
pop ax
ret
PRINTELEM ENDP
;PRINTELEM proc
END START ;end of assembly
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -