📄 asmpro13.asm
字号:
DATA SEGMENT ;数据段定义
INFORMATION1 DB "Please enter the matrix1!The array is 3*4!$" ;提示说明
INFORMATION2 DB "Please enter the matrix2!The array is 4*5!$" ;提示说明
tips DB 'input a number (00~99)$'
;enter DB 0DH,0AH,"$" ;换行
buf DB ?,? ;输入缓冲
M1 DB 0DH,0AH,"The array1:$" ;提示信息
M2 DB 0DH,0AH,"The array2:$"
M3 DB 0DH,0AH,"Array1*Array2:$"
matrix1 DB 12 dup(?) ;矩阵1
matrix2 DB 20 dup(?) ;矩阵2
result DW 15 DUP(?) ;矩阵相乘结果
DATA ENDS
enter MACRO
MOV AH,02h
MOV DL,0ah
INT 21h
MOV DL,0dh
INT 21h
ENDM
CODE SEGMENT ;定义代码段
main PROC FAR
ASSUME CS:CODE,DS:DATA
begin: MOV AX,DATA ;begin: MOV AX,DATA ;置DS段初值
MOV DS,AX
;MOV AX,A
LEA DX,INFORMATION1 ;取信息提示地址偏移量
MOV AH,09h ;MOV AH,9 ;9号功能调用显示提示信息
INT 21H
enter
LEA DX,m1 ;LEA DX,M1 ;提示输入矩阵1
MOV AH,9
INT 21H
MOV CX,12
MOV BP,0
enter
k0: CALL input
MOV matrix1[BP],DL
MOV AH,2
MOV DL,20h
INT 21h
INC BP
LOOP k0
enter;MOV AH,9 ;9号功能调用显示 INT 21H
LEA DX,INFORMATION2 ;取信息提示地址偏移量
MOV AH,09h ;MOV AH,9 ;9号功能调用显示提示信息
INT 21H
enter
MOV BP,0
LEA DX,m2 ;LEA DX,M2 ;提示输入矩阵2
MOV AH,9
INT 21H
enter
XOR BP,BP
MOV CX,20
m0: CALL input
MOV matrix2[BP],DL
MOV AH,2
MOV DL,20h
INT 21h
INC BP
LOOP m0 ;MOV BL,OFFSET MATRIX1 ;取矩阵1的偏移地址 (33)
;MOV BL,OFFSET MATRIX2 ;取矩阵2的偏移地址
;INPUT2: INT 21 ;2号功能调用,用来输入数组数值 (47)
XOR AX,AX
MOV DI,0
MOV SI,0
MOV Bp,0
MOV CX,0 ;CALL LINEMULCOLOUM ;调用矩阵1某行和矩阵2的列相乘子程序 (60)
q: CALL LINEMULCOLOUM
mov di,0
inc cx
mov si,cx
cmp cx,5
jnz q
MOV DI,4;inc di
MOV SI,0
MOV CX, 5
q1: CALL LINEMULCOLOUM
mov di,4
inc cx
mov si,cx
cmp cx,5
jnz q1
MOV DI,8;inc di
MOV SI,0
MOV CX,5
q2: CALL LINEMULCOLOUM
mov di,8
inc cx
mov si,cx
cmp cx,5
jnz q2
MOV AH,9
MOV DX,OFFSET M3
INT 21H
enter
call output
MOV AH,4CH
INT 21H
RET
main ENDP
LINEMULCOLOUM PROC NEAR ;矩阵相乘子程序
push cx
push si
MOV DX,0
MOV CX,4 ;设置循环次数
again: MOV AL,matrix1[DI]
mov ah,0 ;取矩阵1的偏移地址
MOV BL,matrix2[SI] ; 取矩阵2的偏移地址
mov bh,0 ;数值进栈保存 ;AGAIN: IMUL BL ;矩阵1的行和矩阵2的列相乘 (99)
MUL BL
ADD DX,AX
ADD DI,01H
ADD SI,5
LOOP again
MOV result[Bp],DX
ADD Bp,2
pop cx
pop si
RET
LINEMULCOLOUM ENDP
input PROC NEAR
PUSH AX
PUSH BX
PUSH CX
;check
s: MOV DI,2
s1: DEC DI
MOV AH,01h
INT 21h
CMP AL,20h
JZ ent
CMP AL,30h
JB s
CMP AL,39h
JA s
MOV buf[DI],AL
CMP DI,0
JNZ s1
DEC DI
ent: CMP DI,1
JZ s
INC DI
;count
MOV BL,10
MOV DL,buf[DI]
MOV DH,0
SUB DL,30h
CMP DI,1
JZ save
INC DI
l: MOV AL,buf[DI]
SUB AL,30h
MUL BL
ADD DX,AX
;save
save:
POP CX
POP BX
POP AX
RET
input ENDP
output proc near
LEA SI,result
MOV CX,3
m: PUSH CX
MOV CX,5
K: PUSH CX
MOV DX,0
MOV AX,[SI]
MOV CX,10000
DIV CX
MOV BX,DX
MOV DL,AL
cmp dl,0
jz a
ADD DL,30h
MOV AH,02h
INT 21h
a: MOV DX,0
MOV AX,BX
MOV CX,1000
DIV CX
MOV BX,DX
MOV DL,AL
ADD DL,30h
MOV AH,02h
INT 21h
MOV AX,BX
MOV CL,100
DIV CL
MOV BL,AH
MOV DL,AL
cmp dl,0
jz b
ADD DL,30h
MOV AH,2h
INT 21h
b: MOV AL,BL
MOV AH,0
MOV CL,10
DIV CL
MOV BL,AH
MOV DL,AL
ADD DL,30h
MOV AH,02h
INT 21h
MOV DL,BL
ADD DL,30h
MOV AH,02h
INT 21h
MOV DL,20h
MOV AH,02h
INT 21h
POP CX
ADD SI,2
LOOP k
enter
POP CX
LOOP m
ret
output endp
CODE ENDS
END begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -