楊氏三角 彙編 16位

題目:
輸出楊氏三角

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          ;行號*20開始
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章