用汇编语言设计程序实现10!,并用调用子程序的方法实现1!+2!+3!+……+10! 50

 我来答
永恒pascal
2016-10-30 · TA获得超过4357个赞
知道大有可为答主
回答量:3902
采纳率:93%
帮助的人:719万
展开全部
        CODE  SEGMENT
              ASSUME    CS:CODE
              ORG       100H
      START:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              MOV       DI,0
              MOV       SI,0
              MOV       BX,10
     @MAIN1:  MOV       CX,BX
              CALL      FACT
              ADD       SI,AX
              ADC       DI,DX
              DEC       BX
              JNZ       @MAIN1
              
              MOV       AX,SI
              MOV       DX,DI
              CALL      DISPDXAX
              MOV       AH,4CH
              INT       21H
;=====================================
; cx中存放要求阶乘的数 
; 阶乘结果在dx、ax中 
        FACT  PROC      NEAR
              PUSH      BX
              PUSH      SI
              PUSH      DI
              PUSHF
              MOV       DX,0
              MOV       AX,1
     @FACT1:  MOV       BX,CX
              CALL      MULT
              LOOP      @FACT1
              POPF
              POP       DI
              POP       SI
              POP       BX
              RET
        FACT  ENDP

;========================================================
; 无符号乘法子程序 (mul指令只能实现16位乘16位,
;     本子程序实现32位乘16位--限定数的大小,结果仍为32位) 
; 被乘数放置于dx,ax 中, 乘数放置于 bx中 
; 结果放置于dx,ax中(dx为高16位,ax为低16位) 
        MULT  PROC      NEAR
              PUSH      CX
              PUSH      SI
              PUSH      DI
              PUSHF
              MOV       SI,0
              MOV       DI,0
              CMP       BX,0
              JE        @MULTEXIT
     @MULT1:  SHR       BX,1
              JNC       @MULT2
              ADD       SI,AX
              ADC       DI,DX
     @MULT2:  SHL       AX,1
              RCL       DX,1
              CMP       BX,0
              JNE       @MULT1
              MOV       DX,DI
              MOV       AX,SI
              POPF
              POP       DI
              POP       SI
              POP       CX
              RET
  @MULTEXIT:
              MOV       AX,0
              MOV       DX,0
              POPF
              POP       DI
              POP       SI
              POP       CX
              RET
        MULT  ENDP
;============================================
; 将要显示的32位无符号数置于dx、ax中 
    DISPDXAX  PROC      NEAR
              MOV       WORD PTR [Y],AX
              MOV       WORD PTR [Y+2],DX
       ; 以下将 Y (16进制)转为10进制串并输出
              MOV       AX,WORD PTR [Y]
              MOV       DX,WORD PTR [Y+2]
              MOV       BX,WORD PTR [Z]
              MOV       CX,WORD PTR [Z+2]
              MOV       WORD PTR N,0
        MM0:  INC       WORD PTR N
              SUB       AX,BX
              SBB       DX,CX
              JNC       MM0
              DEC       WORD PTR N
              ADD       AX,BX
              ADC       DX,CX
              MOV       WORD PTR[Y],AX
              MOV       WORD PTR[Y+2],DX
        MM1:  LEA       DI,CC
              ADD       DI,9
         M2:
              MOV       AX,WORD PTR [Y]
              MOV       DX,WORD PTR [Y+2]
              MOV       BX,10000
              DIV       BX
              PUSH      AX
              PUSH      DX
      ; 以下转换10进制的低4位
              POP       DX
              MOV       CX,4
              MOV       AX,DX
         M3:  MOV       DX,0
              MOV       BX,10
              DIV       BX
              ADD       DL,30H
              MOV       [DI],DL
              DEC       DI
              LOOP      M3
      ; 以下转换10进制的高万位
              POP       AX
              MOV       CX,1
         M4:  MOV       DX,0
              MOV       BX,10
              DIV       BX
              ADD       DL,30H
              MOV       [DI],DL
              DEC       DI
              LOOP      M4
              MOV       AX,WORD PTR N
              MOV       CX,5
         M5:  MOV       DX,0
              MOV       BX,10
              DIV       BX
              ADD       DL,30H
              MOV       [DI],DL
              DEC       DI
              LOOP      M5
      ; 输出换行回车
              LEA       DX,LFCR
              MOV       AH,9
              INT       21H
      ; 输出两数的和的10进制串
              LEA       DX,CC
              MOV       AH,9
              INT       21H
              RET
           Y  DD        ?
          CC  DB        10 DUP(' '),10,13,'$'
        LFCR  DB        10,13,'$'
           Z  DD        100000
           N  DW        0
    DISPDXAX  ENDP

        CODE  ENDS
              END       START
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式