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

用汇编语言设计程序实现10!,并用调用子程序的方法实现1!+2!+3!+……+10!... 用汇编语言设计程序实现10!,并用调用子程序的方法实现1!+2!+3!+……+10! 展开
 我来答
永恒pascal
2016-10-10 · TA获得超过4358个赞
知道大有可为答主
回答量:3902
采纳率:93%
帮助的人:909万
展开全部
        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

; 将要显示的无符号数置于 ax 中 
      DISPAX  PROC      NEAR
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DS
              PUSH      CS
              POP       DS
              MOV       BYTE PTR NZ,0
              PUSH      AX
              LEA       SI,DIVARR
              MOV       CX,5
         @1:
              POP       AX
              MOV       DX,0
              MOV       BX,[SI]
              DIV       BX
              PUSH      DX
              CMP       AL,0
              JNE       @2
              CMP       BYTE PTR NZ,1
              JE        @2
              CMP       CX,1
              JE        @2
              MOV       DL,20H
              JMP       @3
         @2:
              ADD       AL,30H
              MOV       DL,AL
              MOV       BYTE PTR NZ,1
         @3:
              MOV       AH,2
              INT       21H
              INC       SI
              INC       SI
              LOOP      @1
              POP       DX
              POP       DS
              POP       SI
              POP       DX
              POP       CX
              POP       BX
              RET
      DIVARR  DW        10000,1000,100,10,1
          NZ  DB        0
      DISPAX  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       ; 不停地减 10万 ,得到被10万除的商,放在 n 中
              SBB       DX,CX       ;=====
              JNC       MM0         ;=====
              DEC       WORD PTR N  ;  保存 高5位
              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

提交
取消

辅 助

模 式