題目:
輸出楊氏三角
INCLUDE MACRO.LIB
OUTARRY MACRO ARRY ;輸出數組
PUSH DI
PUSH CX
PUSH AX
PUSH DX
PUSH BX
PUSH SI
MOV SI,CX
XOR DI,DI
XOR CX,CX
MOV BX,10
;循環,訪問ARRY[DI]內容
OUTPUT:
XOR DX,DX
MOV AX,ARRY[DI]
;輸出ARRY[DI]內容
ROTATE:
DIV BX;
ADD DX,30H
INC CX
PUSH DX
XOR DX,DX
CMP AX,0 ;商是否爲零
JNZ ROTATE
MOV AH, 2
PRINT:
POP DX ;數字
INT 21H
DEC CX
CMP CX,0
JNZ PRINT
MOV DL, 0 ;空格
INT 21H
ADD DI,2
CMP DI,SI
JNG OUTPUT
MOV AH, 2
MOV DL, 0DH
INT 21H
MOV DL, 0AH
INT 21H
POP SI
POP BX
POP DX
POP AX
POP CX
POP DI
ENDM
CALCULATE MACRO ARRY1,ARRY2 又ARRY1計算出ARRY2的數組內容
XOR BX,BX;
LOP2:
CMP BX,0
JE JUDGE1
CMP BX,CX
JE JUDGE1
JMP JUDGE2
JUDGE1: ;ARRY2的第一個數和最後一個數均爲1
MOV AX,1
MOV ARRY2[BX],AX
JMP JUDGELOP2
JUDGE2: ;ARRY2[I] = ARRY1[I] + ARRY1[I+1]
MOV AX,ARRY1[BX-2]
ADD AX,ARRY1[BX]
MOV ARRY2[BX],AX
JUDGELOP2:
ADD BX,2
CMP BX,CX
JNG LOP2
ENDM
COPYARRY MACRO ARRY1,ARRY2 ;將ARRY2的內容複製到ARRY1中
PUSH CX
MOV AX,CX
DIV DIVED
INC AX
MOV CX,AX
MOV AX,SEG ARRY1
MOV ES,AX
MOV DI,OFFSET ARRY1
MOV SI,OFFSET ARRY2
CLD
REP MOVSW
POP CX
ENDM
STACKSG SEGMENT STACK 'S'
DW 64 DUP('ST')
STACKSG ENDS
DATA SEGMENT
NOTE DB "Please set Number N (N <= 10):","$"
ARRYA DW 20 DUP(?) ;上一行數組A
ARRYB DW 20 DUP(?) ;當前行數組B
CT DW 0
ROW DW ? ;(行號-1)*2
DIVED DB 2
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE , DS:DATA , SS:STACKSG
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV AH,9
LEA DX,NOTE
INT 21H
XOR AX,AX
;----------------------------------------
;輸入要輸出的行數
NEWCHARA:
MOV AH,1
INT 21H
SUB AL,30H
JL STEP2
CMP AL,9
JG STEP2
CBW
XCHG AX,BX
MOV CX,10
MUL CX
XCHG AX,BX
ADD BX,AX
INC CT
JMP NEWCHARA
;----------------------------------------
STEP2:
MOV AX,BX
SUB AL,1
MUL DIVED
MOV ROW,AL
MOV CX,0 ;行號*2 從0開始
LOP1:
CALCULATE ARRYA,ARRYB ;計算當前行的數字
OUTARRY ARRYB ;輸出當前行的數字
COPYARRY ARRYA,ARRYB ;將數組B複製到A中
ADD CX,2
CMP CX,WORD PTR ROW
JNG SB
JMP EXIT
SB: JMP FAR PTR LOP1
;----------------------------------------
EXIT: MOV AX,4C00H
INT 21H
MAIN ENDP
CODE ENDS
END MAIN