DATA SEGMENT
ARR DB 400 DUP(0) ;存储矩阵
N DB 0 ;矩阵的阶数
NUM DB 0 ;正整数变量
FRONT DB 0 ;头下标,初始值为0
REAR DB 0 ;尾下标
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX ;设置数据段寄存器指向DATA段
CALL READDEC ;调用子程序输入N
MOV N,AL ;将输入的矩阵阶数保存到变量N中
MOV REAR,AL ;设置尾下标为N
DO: ;最外层循环
MOV CH,FRONT
MOV CL,FRONT ;CH用作行坐标,CL用作列坐标
FOR1: ;第一个内层for循环,填充最上面一行
CMP CL,REAR
JNL EXITFOR1 ;循环的条件cl<rear
MOV AL,N
MUL CH
ADD AL,CL
ADC AH,0
MOV BX,AX ;以上五行根据行下标ch和列下标cl,计算该矩阵元素在一维数组中的偏移地址ch*N+cl,并赋值给BX
INC NUM ;正整数变量加1
MOV AL,NUM
MOV ARR[BX],AL ;矩阵元素赋值
INC CL ;列下标增1,从左向右赋值
JMP FOR1
EXITFOR1:
DEC CL
MOV CH,FRONT
INC CH
FOR2: ;第二个内层for循环,填充最右边一列
CMP CH,REAR
JNL EXITFOR2 ;循环条件:ch<rear
MOV AL,N
MUL CH
ADD AL,CL
ADC AH,0
MOV BX,AX
INC NUM
MOV AL,NUM
MOV ARR[BX],AL
INC CH ;行坐标加1,从上到下赋值
JMP FOR2
EXITFOR2:
DEC CH
MOV CL,REAR
SUB CL,2
FOR3: ;第三个内层for循环,填充最下面一行
CMP CL,FRONT
JL EXITFOR3 ;循环条件cl>=front
MOV AL,N
MUL CH
ADD AL,CL
ADC AH,0
MOV BX,AX
INC NUM
MOV AL,NUM
MOV ARR[BX],AL
DEC CL ;列坐标减1,从右向左赋值
JMP FOR3
EXITFOR3:
INC CL
MOV CH,REAR
SUB CH,2
FOR4: ;第四个内层for循环,填充最左边一列
CMP CH,FRONT
JNG EXITFOR4 ;循环条件ch>front
MOV AL,N
MUL CH
ADD AL,CL
ADC AH,0
MOV BX,AX
INC NUM
MOV AL,NUM
MOV ARR[BX],AL
DEC CH ;行坐标减1,从下到上赋值
JMP FOR4
EXITFOR4:
INC FRONT
DEC REAR
MOV AL,CH
INC AL
MUL N
ADD AL,CL
ADC AH,0
INC AX
MOV BX,AX
MOV AL,ARR[BX]
OR AL,AL
JNZ OUTPUT
JMP DO
OUTPUT: ;输出矩阵
LEA BX,ARR
MOV CH,0 ;ch做行坐标
LOP1:
CMP CH,N
JNL EXITLOP1
MOV CL,0 ;cl做列坐标
LOP2: ;内层循环输出矩阵一行内容
CMP CL,N
JNL EXITLOP2
MOV AL,CH
MUL N
ADD AL,CL
ADC AH,0
MOV BX,AX ;计算矩阵元素在数组中的偏移地址
MOV AL,ARR[BX]
MOV AH,0
PUSH CX
CALL WRITEDEC
POP CX
MOV AH,2
MOV DL,9
INT 21H ;输出水平制表符
INC CL
JMP LOP2
EXITLOP2:
MOV AH,2
MOV DL,10
INT 21H ;输出换行
INC CH
JMP LOP1
EXITLOP1:
MOV AH,4CH
INT 21H
READDEC PROC ;输入十进制数,返回值AX
MOV CX,10
XOR BX,BX
LOPREAD:
MOV AH,01H
INT 21H
CMP AL,’ ’
JZ EXITREAD
CMP AL,13
JZ EXITREAD
SUB AL,30H
PUSH AX
MOV AX,BX
MUL CX
POP DX
ADD AL,DL
ADC AH,0
MOV BX,AX
JMP LOPREAD
EXITREAD:
MOV AX,BX
RET
READDEC ENDP
WRITEDEC PROC ;输出十进制数,参数:AX
XOR CX,CX
MOV BX,10
DIV10:
XOR DX,DX
DIV BX
PUSH DX
INC CX
TEST AX,AX
JNZ DIV10
POPNUM:
POP DX
ADD DL,‘0’
MOV AH,2
INT 21H
LOOP POPNUM
RET
WRITEDEC ENDP
CODE ENDS
END START