彙編-矩陣相乘

 學完彙編了,最後作了一個小課設。spa

   題目:code

    用戶按格式輸入若干個矩陣,編寫程序計算它們的乘積並按格式輸出。說明和要求如    下:
內存

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
相關文章
相關標籤/搜索