网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > 课程设计 > 正文

打印杨辉三角汇编语言实现

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
打印杨辉三角汇编语言实现                      
       STACK  SEGMENT              DB        1024 DUP(?)       STACK  ENDS
        DATA  SEGMENT           N  DB        ?         MSG  DB        'please enter N(1~9): ',13,10,'
  • 上一篇资讯: java工程师实习报告
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师
            DATA  ENDS
            CODE  SEGMENT              ASSUME    CS:CODE, SS:STACK ,DS:DATA      START:              MOV       AX,DATA              MOV       DS,AX              MOV       AX, STACK   ; 初始化栈              MOV       SS, AX              MOV       SP, 1024
                  MOV       AH,09              LEA       DX,MSG              INT       21H
                  MOV       AH,01              INT       21H              MOV       N,AL
                  MOV       DH,0H              MOV       DL,N              DEC       DL              SUB       DX,30H
                  MOV       AX,DX              PUSH      AX              CALL      YHSJ
                  JMP       START
     
                  MOV       AX, 4C00H              INT       21H
     
     
    ; 输出杨辉三角的函数,接受一个栈上的参数N; 输出N阶杨辉三角       YHSJ:              MOV       BP, SP              MOV       AX, [BP+2]  ; 保存N到ax              SHR       AX, 1       ; N = N / 2              PUSH      AX              MOV       AX, [BP+2]  ; 保存N到ax              PUSH      AX              CALL      C           ; C(N, N/2)获取最后一行中间的那个值,即最大值              CALL      GETDIGIT    ; 计算该最大值的长度,如252则返回3              MOV       CX, AX      ; 保存最大长度到cx,用于事后格式用              XOR       DI, DI      ; 外层循环计数di,外层循环输出每一行              JMP       CP1        UP1:              INC       DI          ; 更新di        CP1:              CMP       DI, [BP+2]  ; 测试循环条件,循环N次459
     
                  JG        DONE1              MOV       AX, [BP+2]  ; 以下3句计算行前空格数 = (N-i)*cl,cl是最大长度              SUB       AX, DI              MUL       CL              CALL      SHOWSPACE   ; 输出行前空格              XOR       SI, SI      ; 内存循环计数si,内层循环输出一行中的每个数              JMP       CP2        UP2:              INC       SI          ; 更新di        CP2:              CMP       SI, DI      ; 测试循环条件,循环di次              JG        DONE2              PUSH      SI              PUSH      DI              CALL      C           ; 获取该行的位于si位置的组合数,调用C(di, si)              PUSH      AX          ; 保存该组合数              CALL      SHOW        ; 输出该数              MOV       AX, CX      ;┒以下3句输出数字间间隔空格,个数 = N - 1              SUB       AX, 1       ;┃              CALL      SHOWSPACE   ;┚              POP       AX          ;┒              CALL      GETDIGIT    ;┃获取该组合数长度              MOV       BX, AX      ;┃              MOV       AX, CX      ;┃              SUB       AX, BX      ;┃计算需要填充的空格数 = 最大长度 - 该数长度 + 1              ADD       AX, 1       ;┃本来应该先填充再输出数字间空格,顺序反过来是为了左对齐              CALL      SHOWSPACE   ;┚以上打括号的2段反过来是正常的顺序              JMP       UP2         ; 更新内层循环      DONE2:                        ; 内层循环结束              MOV       AH, 2       ; 以下5句实现换行              MOV       DL, 13              INT       21H              MOV       DL, 10              INT       21H              JMP       UP1         ; 更新外层循环      DONE1:                        ; 外层循环结束              RET       2           ; 释放函数参数使用的栈空间
    ; 求组合数的递归函数,接受栈上的2个参数n, m(n > m); 返回C(n, m),即n选m的个数; 算法是:; { C(n, m) = 1 (n < m 或 m = 0); { C(n, m) = C(n-1, m-1) + C(n-1, m) (n > m); 即某位置组合数等于上一行左右两数之和          C:              PUSH      BP              MOV       BP, SP              SUB       SP, 2       ; 预留一个存储位置              MOV       BX, [BP+6]  ; 保存m到bx              CMP       BX, [BP+4]  ; 如果m > n 返回1              JZ        L1              CMP       BX, 0       ; 如果m = 0 返回1              JZ        L1              MOV       AX, [BP+4]  ; 保存n到ax              DEC       AX          ; ax = ax - 1              DEC       BX          ; bx = bx - 1              PUSH      BX              PUSH      AX              CALL      C           ; 返回上一行左边的那个数              MOV       [BP-2], AX  ; 保存左肩膀上的数              MOV       AX, [BP+4]  ; 以下5句同理,返回上一行右肩膀上的数              DEC       AX              PUSH      [BP+6]              PUSH      AX              CALL      C              ADD       AX, [BP-2]  ; 和左肩膀上的数相加得出该组合数              JMP       L2         L1:              MOV       AX, 1         L2:              MOV       SP, BP              POP       BP              RET       4           ; ax返回组合数
    ; 递归以10进制输出ax; 方法很简单,就是求出余数,然后ax = ax / 10; ax = 0时退出,开始逆序输出求出的各位余数       SHOW:              MOV       BX, 10              CMP       AX, 0              JZ        OK1              DIV       BL              PUSH      AX              AND       AX, 00FFH              CALL      SHOW              POP       DX              MOV       DL, DH              OR        DL, 30H              MOV       AH, 2              INT       21H        OK1:              RET
    ; 获取一个数的长度,ax为参数,如果ax = 252则返回3; ax里是返回值   GETDIGIT:              MOV       BX, 10              XOR       DX, DX       NEXT:              CMP       AX, 0              JLE       OK2              DIV       BL              AND       AX, 0FFH              INC       DX              JMP       NEXT        OK2:              MOV       AX, DX              RET
    ; 输出ax个空格,参数ax,无返回值  SHOWSPACE:              MOV       BX, AX              MOV       AH, 2              MOV       DL, ' '      NEXTS:              CMP       BX, 0              JLE       DONES              INT       21H              DEC       BX              JMP       NEXTS      DONES:              RET        CODE  ENDS              END       START459
  • 上一篇资讯: java工程师实习报告
  • 下一篇资讯: 四年级的小学生暑假学习计划
  • 相关资讯

    网学推荐

    原创论文

    文章排行榜

    设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师