您的位置:首页 > 其它

汇编-矩阵相乘

2012-12-29 21:45 183 查看
学完汇编了,最后做了一个小课设。

题目:

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

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,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: