学完汇编了,最后作了一个小课设。spa
题目:code
用户按格式输入若干个矩阵,编写程序计算它们的乘积并按格式输出。说明和要求如 下:
内存
1) 程序要有输入文本提示(如:请输入矩阵3,格式为。。。)2)用户输入的矩阵和打印矩阵的格式以下(10进制):1 2 32 11 2即每行以换行结束,行内每两个数之间用空格分开。连续输入两个换行视为开始输入下一个矩阵,此时要有提示信息;3)约定矩阵总个数在4之内,每一个矩阵的行列数不超过4*4,矩阵中的数值不超过20;4)当用户输入的矩阵个数>=4,或用户输入”over“字符串时,显示相乘结果;5)当用户输入的矩阵行列数没法知足相乘要求时,要有提示,并指明错误矩阵的编号;此时用户能够从第一个矩阵开始从新输入。
下面是本身写的程序,不是很符合要求,可是用起来可能更方便1.输入矩阵时数与数之间用空格隔开;
2.换行结束当前矩阵输入;
3.开始输入矩阵时若输入Q 或者q表示全部矩阵输入完毕;下面是源码:
;*************************************************************** ;*功能:根据用户输入的矩阵,计算结果并输出 * ;*做者:KDF5000 * ;*时间:2012.12.2 * ;*具体功能: * ;* 1.任意矩阵数,固然要知足相乘条件,前一个列数等于后一个行数 * ;* 2.任何数值,不要查过内存。。。。64位。。。。 * ;**************************************************************** ;输入矩阵 MES为输入提示,MATROW存储每行输入,QFLAG保存取出信号 ,MATNUM为当前矩阵编号 ;NUMTEM为临时保存输入数值以便保存到矩阵;COLTEM用于存放矩阵第一行的列数,以便检查是否 ;输入列数不一致 INMAT MACRO MES,MAT,MATROW,QFLAG,MATNUM,NUMTEM LOCAL NEWMAT,INPUT,P1,P2,EXIT,P0,NEXT,ERROR JMP NEWMAT ERROR: LEA DX,ERRORMES MOV AH,9 INT 21H ;输出提示信息 NEWMAT: MOV CL,MATNUM LEA DX,MES MOV AH,9 INT 21H ADD CL,30H MOV DL,CL MOV AH,2 INT 21H MOV EBX,0 MOV MAT,0 MOV MAT+4,0 MOV DI,4 INPUT: ;输出回车换行 LEA DX,CLR MOV AH,9 INT 21H CMP MAT,1 JE P0 JMP NEXT P0: MOV EBX,MAT+4 NEXT: CMP EBX,MAT+4 JNE ERROR ;向临时矩阵行中输入数据 LEA DX,MATROW MOV AH,10 INT 21H ;判断是否是直接输入换行,若是是直接提示输入下一个矩阵 CMP MATROW+2,0DH JE EXIT CMP MATROW+2,'Q' JE EXIT CMP MATROW+2,'q' JE EXIT ADD MAT,1 MOV MAT+4,0 ;取出 刚输入的一行放入矩阵 MOV SI,2 P1: CMP MATROW[SI],0DH JE INPUT CMP MATROW[SI],20H JE P2 ADD DI,4 CALL GETNUM P2: INC SI JMP P1 EXIT: CMP MATROW+2,'Q' JE Q CMP MATROW+2,'q' JE Q CMP MATROW+2,0DH JE P3 JMP P4 P3: CMP MAT,0 JE ERROR P4: CMP EBX,MAT+4 JNE ERROR JMP ENDF Q: MOV QFLAG,'Q' JMP ENDF GETNUM PROC PUSH EBX MOV BX,0 ;记录数字位数 INSTACK: MOV AL,MATROW[SI] SUB AL,30H MOV NUMTEM[BX],AL INC BX INC SI CMP MATROW[SI],20H JE NEXTNUM CMP MATROW[SI],0DH JE NEXTNUM JMP INSTACK NEXTNUM: PUSH SI MOV MAT[DI],0 MOV CL,10 MOV SI,0 MOV CH,0 DEC BX P: CMP SI,BX JAE QUIT MOV AL,NUMTEM[SI] CBW MUL CL CWD ADD MAT[DI],EAX INC SI JMP P QUIT: MOV AL,NUMTEM[SI] CBW CWD ADD MAT[DI],EAX ADD MAT+4,4 POP SI DEC SI POP EBX RET ENDP ENDF: POP CX ENDM ;输入矩阵结束 ;两个矩阵相乘 ,BUF,BUF1,分别为两个矩阵, ROW 记录行,COL 记录列,TEM 记录乘的结果 MULMATR MACRO MAT1,MAT2,TEM,ROW,COL,MFLAG LOCAL P1,P2,P3,EXIT,ERROR,QUIT PUSH CX MOV ROW,0 MOV COL,0 MOV CX,4 MOV EAX,MAT1+4 DIV CX CWD CMP EAX,MAT2 JNE ERROR MOV EBX,0 MOV DI,8 P1: MOV EAX,MAT1 CMP ROW,AX JAE EXIT P2: MOV TEM[DI],0 MOV SI,0 MOV EAX,MAT2+4 CMP COL,AX JB P3 ADD ROW,1 MOV COL,0 JMP P1 P3: MOV AX,ROW MOV ECX,MAT1+4 MUL CL MOV BP,AX MOV EBX,MAT1+8[BP][SI] MOV AX,SI MOV CL,4 DIV CL MOV ECX,MAT2+4 MUL CL MOV BP,AX XCHG COL,SI MOV EAX,MAT2+8[BP][SI] MUL EBX ADD TEM[DI],EAX XCHG COL,SI ADD SI,4 MOV EAX,MAT1+4 CMP SI,AX JB P3 ADD COL,4 ADD DI,4 JMP P2 EXIT: MOV EAX,MAT1 MOV TEM,EAX MOV EAX,MAT2+4 MOV TEM+4,EAX JMP QUIT ERROR: MOV MFLAG,'E' POP CX QUIT: ENDM ;矩阵相乘结束 ;输出矩阵相乘的结果 OUTMAT MACRO RESULT,TEM LOCAL L1,L2,EXIT MOV EBX,0 ;记录行 MOV ECX,0 ;记录列 MOV DI,4 L1: ADD DI,4 MOV EAX,TEM[DI] CALL OUT10 ADD ECX,4 CMP ECX,TEM+4 JAE L2 JMP L1 L2: LEA DX,CLR MOV AH,9 INT 21H INC EBX CMP EBX,TEM JE EXIT MOV ECX,0 JMP L1 OUT10 PROC ;利用取余输出每一位 PUSH SI PUSH ECX MOV ECX,10 ;设置除数 MOV EDX,0 MOV SI,OFFSET RESULT-1 LOOP: DIV ECX DEC SI ADD EDX,30H MOV [SI],DL MOV EDX,0 CMP EAX,0 JNE LOOP MOV DX,SI MOV AH,9 INT 21H POP ECX POP SI RET OUT10 ENDP EXIT: ENDM ;输出矩阵相乘的结果结束 ;转移矩阵 ,将MAT1转移到MAT2 MOVMAT MACRO MAT1,MAT2 PUSH CX MOV EAX,MAT1+4 MOV CL,4 DIV CL MOV ECX,MAT1 MUL CL ADD AX,2 MOV CX,AX LEA EDI,MAT2 LEA ESI,MAT1 CLD REP MOVSD POP CX ENDM ;转移矩阵结束 .386 DATA SEGMENT USE16 MATROW DB 20 DB ? DB 20 DUP(0) MATNUM DB 0 MAT1 DD 20 DUP(0) MAT2 DD 20 DUP(0) NUMTEM DB 3 DUP(0) ;临时存储数值比便输出多位数 COLTEM DW 0 ROW DW 0 ;矩阵相乘时记录行 COL DW 0 ;矩阵相乘时记录列 QFLAG DB 0 MFLAG DB 0 TEM DD 20 DUP(0) ;存放临时矩阵 DD '$' DB 8 DUP(0) DB 20H RESULT DB '$' CLR DB 0AH,0DH,'$' WARING DB '~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~欢迎使用本系统~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~',0DH,0AH DB '************************************************************',0DH,0AH DB '* 1.输入矩阵时数与数之间用空格隔开; *',0DH,0AH DB '* 2.换行结束当前矩阵输入; *',0DH,0AH DB '* 3.开始输入矩阵时若输入Q 或者q表示全部矩阵输入完毕; *',0DH,0AH DB '************************************************************$' MES DB 0AH,0DH,'请输入矩阵 $' OUTMES DB 0AH,0DH,'相乘结果为:', 0AH,0DH,'$' ERRORMES DB 0AH,0DH,'请检查矩阵是否输入错误!',0AH,0DH,'$' MULERROR DB '请检查前面两个矩阵行列是否知足要求!',0AH,0DH,'$' NUMERRORMES DB '至少输入两个矩阵!',0AH,0DH,'$' DATA ENDS STACK SEGMENT USE16 STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT USE16 ASSUME DS:DATA,SS:STACK,CS:CODE,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX ;输出提示信息 LEA DX,WARING MOV AH,9 INT 21H ;设置cl记录矩阵个数 BEGIN: MOV MFLAG,0 MOV MATNUM,0 LOOP1: INC MATNUM INMAT MES,MAT2,MATROW,QFLAG,MATNUM,NUMTEM CMP MATNUM,1 JE L1 CMP QFLAG,'Q' JE EXIT MULMATR MAT1,MAT2,TEM,ROW,COL,MFLAG CMP MFLAG,'E' JE ERROR JMP NEXT ERROR: LEA DX,MULERROR MOV AH,9 INT 21H JMP BEGIN NEXT: MOVMAT TEM,MAT1 JMP L2 L1: MOVMAT MAT2,MAT1 L2: JMP LOOP1 EXIT: LEA DX,CLR MOV AH,9 INT 21H ;结果提示信息 LEA DX,OUTMES MOV AH,9 INT 21H CMP MATNUM,2 JE NUMERROR ;输出结果 OUTMAT RESULT,MAT1 JMP EXIT1 NUMERROR: LEA DX,NUMERRORMES MOV AH,9 INT 21H EXIT1: MOV AH,4CH INT 21H CODE ENDS END START