永发信息网

汇编语言字除法,如果AX寄存器中商大于FFFFH怎么办?

答案:1  悬赏:80  手机版
解决时间 2021-04-05 04:02
  • 提问者网友:风月客
  • 2021-04-04 14:02
汇编语言字除法,如果AX寄存器中商大于FFFFH怎么办?
最佳答案
  • 五星知识达人网友:woshuo
  • 2021-04-04 15:10
这个时候就溢出了。需要编制专门的子程序处理,以下是一种实现:

;***********************************************************           
        DIVI  PROC      NEAR
              PUSH      SI
              PUSH      DI
              PUSH      BP
              PUSHF
              ; 被除数置于 dx,ax  (32位) 
              ; 除数置于 bx (16位) 
              ; 商置于 dx,ax
              ; 余数置于 cx
              ;------------------- 
              ;PUSH      BX
              ;POP       BP
              MOV       WORD PTR [R_BX], BX
              MOV       WORD PTR [RE_DIV],0
              MOV       WORD PTR [RE_DIV+2],0
              MOV       BP,08000H   ; 检查被除数的最高位是否为1
              AND       BP,DX       ; 是 则超出计算上限 ,直接退出
              CMP       BP,08000H
              JE        @DIVIEXIT
              CMP       DX,0
              JNE       @DIVI0
              CMP       AX, WORD PTR [R_BX]
              JNC       @DIVI0
              JMP       @DIVIEXIT
     @DIVI0:
              MOV       DI,0
              MOV       SI, WORD PTR [R_BX]
              MOV       CX,1
              MOV       BX,0
     @DIVI1:  PUSH      AX
              PUSH      DX
              SUB       AX,SI
              SBB       DX,DI
              JC        @DIVI2
              SHL       SI,1
              RCL       DI,1
              SHL       CX,1
              RCL       BX,1
              POP       DX
              POP       AX
              JMP       @DIVI1
     @DIVI2:  SHR       DI,1
              RCR       SI,1
              SHR       BX,1
              RCR       CX,1
              POP       DX
              POP       AX
              SUB       AX,SI
              SBB       DX,DI
              ADD       WORD PTR [RE_DIV],CX
              ADC       WORD PTR [RE_DIV+2],BX
              ;---------------------
              CMP       DX,0
              JNE       @DIVI0
              CMP       AX, WORD PTR [R_BX]
              JNC       @DIVI0
              ;----------------
              PUSH      AX
              MOV       DX,WORD PTR [RE_DIV+2]  ; 商的高位
              MOV       AX,WORD PTR [RE_DIV]    ; 商的低位
              POP       CX          ; 余数
              MOV       BX, WORD PTR [R_BX]
              ;----------------
              POPF
              POP       BP
              POP       DI
              POP       SI
              RET
      RE_DIV  DD        0
        R_BX  DW        ?
  @DIVIEXIT:
              MOV       CX,AX
              MOV       DX,0
              MOV       AX,0
              MOV       BX,WORD PTR [R_BX]
              POPF
              POP       BP
              POP       DI
              POP       SI
              RET
        DIVI  ENDP
;********************************************************
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯