學完彙編了,最後作了一個小課設。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