汇编-矩阵相乘

来源:互联网 发布:js获取上下文 编辑:程序博客网 时间:2024/06/09 16:14

 学完汇编了,最后做了一个小课设。

   题目:

    用户按格式输入若干个矩阵,编写程序计算它们的乘积并按格式输出。说明和要求如    下:

1)  程序要有输入文本提示(如:请输入矩阵3,格式为。。。)

2)用户输入的矩阵和打印矩阵的格式如下(10进制):

1 2 3

2 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



原创粉丝点击