汇编-矩阵相乘
来源:互联网 发布:js获取上下文 编辑:程序博客网 时间:2024/06/09 16:14
学完汇编了,最后做了一个小课设。
题目:
用户按格式输入若干个矩阵,编写程序计算它们的乘积并按格式输出。说明和要求如 下:
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,NUMTEMLOCAL NEWMAT,INPUT,P1,P2,EXIT,P0,NEXT,ERROR JMP NEWMATERROR: 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,4INPUT: ;输出回车换行 LEA DX,CLR MOV AH,9 INT 21H CMP MAT,1 JE P0 JMP NEXTP0: MOV EBX,MAT+4NEXT: 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,2P1: CMP MATROW[SI],0DH JE INPUT CMP MATROW[SI],20H JE P2 ADD DI,4 CALL GETNUMP2: INC SI JMP P1EXIT: CMP MATROW+2,'Q' JE Q CMP MATROW+2,'q' JE Q CMP MATROW+2,0DH JE P3 JMP P4P3: CMP MAT,0 JE ERRORP4: CMP EBX,MAT+4 JNE ERROR JMP ENDFQ: MOV QFLAG,'Q' JMP ENDFGETNUM 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 INSTACKNEXTNUM: PUSH SI MOV MAT[DI],0 MOV CL,10 MOV SI,0 MOV CH,0 DEC BXP: 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 RETENDP ENDF: POP CXENDM;输入矩阵结束;两个矩阵相乘 ,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,8P1: MOV EAX,MAT1 CMP ROW,AX JAE EXITP2: MOV TEM[DI],0 MOV SI,0 MOV EAX,MAT2+4 CMP COL,AX JB P3 ADD ROW,1 MOV COL,0 JMP P1P3: 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 P2EXIT: MOV EAX,MAT1 MOV TEM,EAX MOV EAX,MAT2+4 MOV TEM+4,EAX JMP QUITERROR: MOV MFLAG,'E' POP CXQUIT:ENDM;矩阵相乘结束;输出矩阵相乘的结果OUTMAT MACRO RESULT,TEM LOCAL L1,L2,EXIT MOV EBX,0 ;记录行 MOV ECX,0 ;记录列 MOV DI,4L1: ADD DI,4 MOV EAX,TEM[DI] CALL OUT10 ADD ECX,4 CMP ECX,TEM+4 JAE L2 JMP L1L2: LEA DX,CLR MOV AH,9 INT 21H INC EBX CMP EBX,TEM JE EXIT MOV ECX,0 JMP L1OUT10 PROC ;利用取余输出每一位 PUSH SI PUSH ECX MOV ECX,10 ;设置除数 MOV EDX,0 MOV SI,OFFSET RESULT-1LOOP: 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 RETOUT10 ENDPEXIT:ENDM;输出矩阵相乘的结果结束;转移矩阵 ,将MAT1转移到MAT2MOVMAT 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 CXENDM;转移矩阵结束.386DATA SEGMENT USE16MATROW DB 20 DB ? DB 20 DUP(0)MATNUM DB 0MAT1 DD 20 DUP(0)MAT2 DD 20 DUP(0)NUMTEM DB 3 DUP(0) ;临时存储数值比便输出多位数COLTEM DW 0ROW DW 0 ;矩阵相乘时记录行COL DW 0 ;矩阵相乘时记录列QFLAG DB 0MFLAG DB 0TEM DD 20 DUP(0) ;存放临时矩阵 DD '$' DB 8 DUP(0) DB 20HRESULT 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 ENDSSTACK SEGMENT USE16 STACK DB 200 DUP(0)STACK ENDSCODE SEGMENT USE16 ASSUME DS:DATA,SS:STACK,CS:CODE,ES:DATASTART: 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 NEXTERROR: LEA DX,MULERROR MOV AH,9 INT 21H JMP BEGINNEXT: MOVMAT TEM,MAT1 JMP L2L1: MOVMAT MAT2,MAT1L2: JMP LOOP1EXIT: 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 EXIT1NUMERROR: LEA DX,NUMERRORMES MOV AH,9 INT 21HEXIT1: MOV AH,4CH INT 21HCODE ENDS END START
- 汇编-矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘
- 矩阵相乘!
- 开源 免费 java CMS - FreeCMS-数据对象-linkClass
- Ext.tree.DWRTreeLoader
- jdk内置工具(一)
- 浙大PAT 1006题 1006. Sign In and Sign Out
- 正则表达式30分钟入门教程
- 汇编-矩阵相乘
- 音乐播放器移植到开发板上
- 浙大PAT 1007题 1007. Maximum Subsequence Sum
- linux常用命令
- 函数调用中栈帧内容
- 浙大PAT 1008题 1008. Elevator
- SCTP相关术语
- 浙大PAT 1009题 1009. Product of Polynomials
- PHP中获取当前页面的完整URL