从键盘输入一个4*4的矩阵。
要求:
(1)每个元素都是4位十进制数。
(2)在屏幕上输出该矩阵和它的转置矩阵。
(3)输出这两个矩阵的和(对应元素相加)。
(4)数据的输入和结果的输出都要有必要的提示,且提示独占一行。
(5)要使用到子程序。
代码段
data segment ;数据段
str dw 10 dup(?)
str1 db 'Please input your matrix:',0ah,0dh,'$'
str2 db 'Your matrix is:',0ah,0dh,'$'
str3 db 'Your transpose matrix is:',0ah,0dh,'$'
str4 db 'The sum of matrices is:',0ah,0dh,'$'
crlf db 0ah,0dh,'$'
m1 dw 16 dup(?) ;原始矩阵
m2 dw 16 dup(?) ;转置矩阵
m3 dw 16 dup(?) ;矩阵之和
x dw ? ;判断是否满足四位数
data ends
stack segment stack ;堆栈段
dw 20 dup(?)
stack ends
code segment ;代码段
assume cs:code,ds:data,ss:stack
main proc far
start:
mov ax,data
mov ds,ax
mov ah,09h
lea dx,str1
int 21h
call input_data
mov ah,09h
lea dx,crlf
int 21h
mov ah,09h
lea dx,str2
int 21h
call output_data1
call exchange
mov ah,09h
lea dx,str3
int 21h
call output_data2
mov ah,09h
lea dx,crlf
int 21h
mov ah,09h
lea dx,str4
int 21h
call sum_data
call output_data3
mov ax,4c00h
int 21h
main endp
input_data proc near ;从键盘输入一个4*4矩阵
mov di,0
mov si,0
mov bx,0
L1:
mov ax,0
mov cx,0
mov dx,0
mov ah,01h
int 21h ;输入一个四位元素中的一位,转化为数值
inc di
sub al,30h ;转化为数值,存入ax中
cbw
xchg ax,bx
mov cx,10
mul cx
add bx,ax
mov cx,4 ;判断是否是四位数,是则存入
cmp di,cx
je L2
jmp L1
L2:
mov m1[si],bx
mov bx,0
mov ax,0
inc si
inc si
mov ah,02h
mov dl,' '
int 21h
mov cx,0
mov cx,x
inc cx
mov x,cx
mov di,0
mov dx,x
mov cx,4
cmp dx,cx
je L3
mov dx,x
mov cx,8
cmp dx,cx
je L3
mov dx,x
mov cx,12
cmp dx,cx
je L3
mov cx,16
cmp dx,cx
je L4
jmp L1
L3:
lea dx,crlf;换行
mov ah,09h
int 21h
jmp L1
L4:
lea dx,crlf;换行
mov ah,09h
int 21h
ret
input_data endp
;*********************************************
output_data1 proc near ;输出原矩阵
mov si,0
O3:
mov bx,0
mov ax,0
mov cx,0
mov ax,m1[si]
O1:
mov dx,0
mov di,10
div di
push dx
inc cx
cmp ax,0
jnz O1
O2:
pop dx
add dx,30h
mov ah,02h
int 21h
loop O2
mov ah,02h
mov dl,' '
int 21h
add si,2
cmp si,8
je O4
cmp si,16
je O4
cmp si,24
je O4
cmp si,32
je O5
jmp O3
O4:
mov ah,09h
lea dx,crlf
int 21h
jmp O3
O5:
mov ah,09h
lea dx,crlf
int 21h
ret
output_data1 endp
;****************************************
exchange proc near;进行矩阵的转置,从而得到转置矩阵
mov si,0
mov di,0
mov cx,0
mov dx,0
mov ax,0
E2:
mov ax,m1[si]
mov m2[di],ax
add si,8
inc di
inc di
inc dx
inc dx
cmp dx,8
je E1
jmp E2
E1:
mov dx,0
inc cx
inc cx
mov si,cx
cmp cx,8
je E3
jmp E2
E3:
mov ah,09h
lea dx,crlf
int 21h
ret
exchange endp
;*******************************************************
output_data2 proc near ;输出转置矩阵
mov si,0
T3:
mov bx,0
mov ax,0
mov cx,0
mov ax,m2[si]
T1:
mov dx,0
mov di,10
div di
push dx
inc cx
cmp ax,0
jnz T1
T2:
pop dx
add dx,30h
mov ah,02h
int 21h
loop T2
mov ah,02h
mov dl,' '
int 21h
add si,2
cmp si,8
je T4
cmp si,16
je T4
cmp si,24
je T4
cmp si,32
je T5
jmp T3
T4:
mov ah,09h
lea dx,crlf
int 21h
jmp T3
T5:
mov ah,09h
lea dx,crlf
int 21h
ret
output_data2 endp
;*********************************************************
sum_data proc near;计算矩阵的和,结果转移到m3中
mov ax,0
mov si,0
S1:
mov ax,m1[si]
add ax,m2[si]
mov m3[si],ax
add si,2
cmp si,32
je S2
jmp S1
S2:
ret
sum_data endp
;*********************************************************
output_data3 proc near ;输出两矩阵之和
mov si,0
F3:
mov bx,0
mov ax,0
mov cx,0
mov ax,m3[si]
F1:
mov dx,0
mov di,10
div di
push dx
inc cx
cmp ax,0
jnz F1
F2:
pop dx
add dx,30h
mov ah,02h
int 21h
loop F2
mov ah,02h
mov dl,' '
int 21h
add si,2
cmp si,8
je F4
cmp si,16
je F4
cmp si,24
je F4
cmp si,32
je F5
jmp F3
F4:
mov ah,09h
lea dx,crlf
int 21h
jmp F3
F5:
mov ah,09h
lea dx,crlf
int 21h
ret
output_data3 endp
code ends
end start