HUANH      MACRO                    ; 宏定义5句代码实现换行

       MOV           AH, 2       

     MOV           DL, 13

      INT             21H

     MOV           DL, 10

     INT             21H

ENDM

DATA SEGMENT

              MSG           DB       'Please input a number: $'

              RESULT      DB        'The YiangHui triangle:$'

              CON           DB       'Do you want to continue?(Y/N): $'

ERROR   DB        'Data out of range!$'

              AHEAD   DB      '   $'

              BETWEEN  DB        '     $'

              BACK          DB        ' $'

              a                   DW              ?            ;a为阶数

              b                   DW              ?            ;b是行数

              c                   DW              ?

              d                   DW              ?            ;记录位数,控制空格数

DATA ENDS

CODE SEGMENT

              ASSUME  CS:CODE,DS:DATA

SHURU PROC                                     ;输入子程序,数字存在BP

                     XOR           BP,BP

                     MOV           BX,10

                     MOV           CX,3            ;控制输入位数,外加一位回车

input:            MOV           AH,1           ;键盘输入数据

                     INT             21H

                     CMP            AL,0DH             ;以回车结束输入

                     JZ               OK

                     SUB            AL,30H              ;化ASCII为HEX

                     CBW                                       ;字节扩展为字

                     XCHG               AX,BP

                     MUL           BX                     ;扩大10倍

                     ADD           BP,AX               ;加一位

LOOP          input

OK:

                     RET

SHURU  ENDP

START:      MOV           AX,DATA   

               MOV           DS,AX 

MAIN:             MOV            DX,OFFSET MSG    ; 输出字符串,请输入一个数

              MOV           AH,9

              INT                     21H

                CALL          SHURU                            ; 调用输入函数,显示输入的数

                     CMP             BP,15                                 ; 输入的数在BP里

                    JB               MZTJ                                       ; 满足条件

                    HUANH

                     MOV            DX,OFFSET ERROR      ; 准备显示错误信息

                    MOV           AH,9                                         

                    INT             21H 

             HUANH                                  

                    JMP             MAIN

MZTJ:          HUANH

                   MOV           DX,OFFSET RESULT     ; 显示提示字符串

                   MOV           AH,9

                   INT             21H

                     HUANH

                   MOV           AX,BP                       ;准备显示杨辉三角,AX=BP=阶数

                   CALL          Showspace

                   MOV           DL,'1'               ;第一行显示空格完毕,输出'1'

                   MOV           AH,2

                   INT             21H

                   CMP            BP,1              ;阶数BP与1比较

                   JZ               exit

                   MOV           b,2         ;b=2

                   MOV           CX,BP         ;CX为阶数

                   MOV           a,BP             ;a为阶数

                   DEC            a           

                   CALL          yhsj

exit:              HUANH

                     MOV           AX,BP                ;准备显示杨辉三角,AX=BP=阶数

                   CALL          Showspace

                   MOV           DL,'1'          ;第一行显示空格完毕,输出'1'

                   MOV           AH,2

                   INT             21H

                     JMP              NEAR PTR input1

yhsj:              MOV           c,1                       ;杨辉三角

                   HUANH

                   DEC            BP

                   MOV           AX,BP

                   CALL          Showspace       ;控制首数字前面的空格数

                   MOV           DL,'1'                       ;首数字必为1   

                   MOV           AH,2

                   INT             21H

                   MOV            DX,OFFSET BETWEEN

                   MOV           AH,9

                    INT             21H

                   MOV           AX,1

                   PUSH          b

                   CALL          Calculate

                   POP             b

                   INC             b                        ;b为行数

                   DEC            CX

                   CMP            CX,1

                   JA               yhsj

                   DEC            b

                   CMP            b,2

                   JZ               ok3

                   CALL          fyhsj

ok3:             HUANH

                   INC             a

                   MOV           AX,a

                   CALL          Showspace

                   MOV           DL,'1'

                   MOV           AH,2

                   INT             21H

input1:          HUANH                                         ;判断是否继续

                     MOV           DX,OFFSET CON    ;显示提问字符串,继续?

                   MOV           AH,9

                   INT             21H

                     MOV           AH,1           ;键盘输入数据

                     INT             21H

                     CMP            AL,59H              ;以回车结束输入

                     JNZ                     exit1

                     HUANH

                     JMP              NEAR PTR MAIN

exit1:         MOV           AH,4CH

                   INT             21H

fyhsj:            MOV           c,1         ;反杨辉三角

                   HUANH

                   INC             BP

                   MOV           AX,BP

                   CALL          Showspace

                   MOV           DL,'1'

                   MOV           AH,2

                   INT             21H

                   MOV           DX,OFFSET BETWEEN

                   MOV           AH,9

                   INT             21H

                   MOV           AX,1

                   DEC            b

                   PUSH          b

                   CALL          Calculate

                   POP             b

                   INC             CX

                   CMP            CX,a

                   JB               fyhsj

                   RET

Showspace:

                   MOV           BX, AX        ;首行显示空格,空格数即为输入的阶数

                   MOV           AH, 9

                   MOV           DX,OFFSET AHEAD

nexts:

                   CMP            BX, 0           ;BX减1,控制输出的空格数

                   JZ               dones

                   INT             21H

                   DEC            BX

                   JMP             nexts

dones:

                   RET

Calculate:     DEC            b

                   MUL           b

                   DIV             c

                   INC             c

                   CMP            b,0

                   JZ               ok1

                   PUSH          AX        ;保存所得数据

                   MOV           d,0

                   CALL          ShowNum

                   MOV           AX,6

                   SUB            AX,d

                   CALL          Showspace1

                   POP             AX

                   CALL          Calculate

ok1:

                   RET

ShowNum:   MOV           BX, 10         ;显示某数,并记录位数

                   CMP            AX, 0

                   JZ               ok2

                   INC             d

                   DIV             BL

                   PUSH          AX

             AND           AX, 00FFH

                     CALL       SHOWNum

                   POP             DX

                   MOV           DL, DH

                   OR              DL, 30H

                   MOV           AH, 2

                   INT             21H

ok2:

                   RET

Showspace1:MOV           BX, AX

                   MOV           AH, 9

                   MOV           DX,OFFSET BACK

next:             CMP            BX, 0

                   JZ               done

                   INT             21H

                   DEC            BX

                   JMP             next

done:

                   RET

CODE ENDS

              END     START