ASM51除法 精确选择逼近法 

贵州家电维修网 http://www.gz112.cn 2008-4-8 11:39:10 来源:贵阳蓝天整理



; FDiv V2.00c
; 除数: HexCodeH HexCodeL  被除数: HexCodeD3..1
; 商: Result3..1
; 算法:精确选择逼近法
; 和FDIV V1.00 V 2.00b时间比较:
;--------------------------------------------------------------------------------------
;     计算         ----- V1.00 用时 ----- V2.00用时 ----- V2.00b用时 ----- V2.00c用时
;--------------------------------------------------------------------------------------
;  ffffffh / 01h   ----- >>1 min    ----- 38ms 445us ----- 4ms943us -----     97 us
;  0f187eh / 02h   ----- > 21 s     ----- 11ms 355us ----- 3ms104us -----   1ms398us
;  00618ah / 05h   ----- 235 ms     ----- 8ms 445us  ----- 1ms219us -----   1ms235us
;  006ffah / 05h   ----- 281 ms     ----- 7ms  79us  ----- 1ms409us -----   1ms366us
;  689dd3h / 3dadh ----- 18ms 309us ----- 8ms 566us  ----- 1ms 54us -----   1ms 58us
;  f0ef71  / 1005h ----- 161 ms     ----- 1ms 342us  ----- 1ms542us -----   1ms546us
;  000001h / 01h   ----- 109 us     -----  49us      -----   56us   -----    41 us
;  ( Based on 12M)
; Efficiency compare:     V2.00c  *****************
;                         V2.00b  ***************
;                         V2.00   **********
;                         V1.00   *
;---------------------------------------------------------------------------------------
;===========================================================================================
;HexCodeD3 equ 20h
;HexCodeD2 equ 21h
;HexCodeD1 equ 22h
;
;HexCodeH  equ 23h
;HexCodeL  equ 24h
;
;Result3   equ 25h
;Result2   equ 26h
;Result1   equ 27h

;HexTemp3  equ 28h
;HexTemp2  equ 29h
;HexTemp1  equ 2ah

;org 0000h
;sjmp FDivV2
;org 0030h

;======================================================================================
proc FDivV2
FDivV2:
     push psw
     push a
     push 0                   ; R0 is MultiFlag
                              ;  0  ->  100000h    3 -> 100h
                              ;  1  ->  10000h     4 -> 10h
                              ;  2  ->  1000h      5 -> 1h
     mov r0,#0
     sjmp FDivOperate2
     mov a,HexCodeD3          ; If Mode is HexCodeD3..1 (1 byte)/HexCodeH..L(1 byte)
     jnz FDivOperate2         ;  then operate mode1 , use command ‘DIV‘
     mov r0,#2
     mov a,HexCodeD2
     jnz FDivOperate2
     mov r0,#4
     mov a,HexCodeH
     jnz FDivOperate2

FDivOperate1:
     mov a,HexCodeD1
     mov b,HexCodeL
     div ab
     mov Result1,a
     mov Result2,#0
     mov Result3,#0
     sjmp return1

return:
     pop HexCodeD1
     pop HexCodeD2
     pop HexCodeD3
return1:
     pop 1
     pop 0
     pop a
     pop psw
     ret

FDivOperate2:
     push 1

     mov Result3,#0           ; Result3..1 <- 000000h
     mov Result2,#0
     mov Result1,#0

     push HexCodeD3           ; HexCodeD3..1 pushed to stack
     push HexCodeD2
     push HexCodeD1

     mov a,HexCodeH
     jz PreProcess
     sjmp AutoSetFlag

PreProcess:
     mov b,HexCodeL
     mov a,HexCodeD3
     div ab
     mov HexCodeD3,b
     mov b,a
     mov a,Result3
     add a,b
     mov Result3,a
     mov b,HexCodeL
     mov a,HexCodeD2
     div ab
     mov HexCodeD2,b
     mov b,a
     mov a,Result2
     add a,b
     mov Result2,a
     mov b,HexCodeL
     mov a,HexCodeD1
     div ab
     mov HexCodeD1,b
     mov b,a
     mov a,Result1
     add a,b
     mov Result1,a
PreProcessEnd:

AutoSetFlag:                       ; Auto Set MultiFlag
     SetH:
          inc r0                   ; HexCode3..1 (4 bits)     HexCodeH..L (4 bits)       MultiFlag
          inc r0                   ;       6                        4                        3 *100
          mov a,HexCodeH           ;       6                        3                        2 *1000
          jz SetL                  ;       6                        2                        1 *10000
          anl a,#0f0h              ;       6                        1                        0 *100000
          jz AutoSetFlagEnd        ;    .......
          inc r0
          sjmp AutoSetFlagEnd
     SetL:
          dec r0
          dec r0
          mov a,HexCodeL
          anl a,#0f0h
          jz AutoSetFlagEnd
          inc r0
AutoSetFlagEnd:
;    mov a,r0                      ; This 4 lines are added in V2.00c
;    jz Addon_Cal1                 ; add 2 new computing procedures
;    dec a                         ; improve time for computing H=0
;    jz Addon_Cal2
;    sjmp CalculateTemp
;Addon_Cal1:

CalculateTemp:                     ; Caluate HexTemp3..1 due to MultiFlag
     mov a,r0                      ; If r0>6, then return
     clr cy
     subb a,#6
     jnc return

     mov HexTemp3,#0
     mov HexTemp2,HexCodeH
     mov HexTemp1,HexCodeL
     mov a,#6
     clr cy
     subb a,r0
     push a
     LoopCal:                      ; shift HexTemp3..1 close to HexCode3..1
          pop a
          dec a
          jz CalTempEnd
          push a
          mov a,HexTemp1
          mov b,#10h
          mul ab
          mov HexTemp1,a
          push b
          mov a,HexTemp2
          mov b,#10h
          mul ab
          pop 1
          add a,r1
          mov HexTemp2,a
          mov a,b
          addc a,#0
          push a
          mov a,HexTemp3
          mov b,#10h
          mul ab
          pop b
          add a,b
          mov HexTemp3,a
          sjmp LoopCal
     CalTempEnd:

Process:
      push HexCodeD1
      push HexCodeD2
      push HexCodeD3

      clr cy
      mov a,HexCodeD1                  ; HexCodeD3..1 = HexCodeD3..1 - HexTemp3..1
      subb a,HexTemp1                  ; and if HexCodeD<HexTemp then jump out
      mov HexCodeD1,a
      mov a,HexCodeD2
      subb a,HexTemp2
      mov HexCodeD2,a
      mov a,HexCodeD3
      subb a,HexTemp3
      jc ProcessEnd
      mov HexCodeD3,a

      pop a
      pop a
      pop a

     CalculateResult:                  ; result = Result + Flag
          mov a,r0
          jz Add100000
          dec a
          jz Add10000
          dec a
          jz Add1000
          dec a
          jz Add100
          dec a
          jz Add10

          Add1:
               mov a,Result1
               add a,#1
               mov Result1,a
               mov a,Result2
               addc a,#0
               mov Result2,a
               mov a,Result3
               addc a,#0
               mov Result3,a
               sjmp CalResultEnd
          Add10:
               mov a,Result1
               add a,#10h
               mov Result1,a
               mov a,Result2
               addc a,#0
               mov Result2,a
               mov a,Result3
               addc a,#0
               mov Result3,a
               sjmp CalResultEnd
          Add100:
               mov a,Result2
               add a,#1
               mov Result2,a
               mov a,Result3
               addc a,#0
               mov Result3,a
               sjmp CalResultEnd
          Add1000:
               mov a,Result2
               addc a,#10h
               mov Result2,a
               mov a,Result3
               addc a,#0
               mov result3,a
               sjmp CalResultEnd
          Add10000:
               mov a,Result3
               add a,#1
               mov Result3,a
               sjmp CalResultEnd
          Add100000:
               mov a,Result3
               add a,#10h
               mov Result3,a
      CalResultEnd:

      jmp Process

ProcessEnd:

      pop HexCodeD3
      pop HexCodeD2
      pop HexCodeD1

      inc r0
      jmp CalculateTemp

end
】 【返回上一页】 【打 印】 【  
更多关于“学院”的新闻
学院评论:(评论内容只代表网友观点,与本站立场无关!)

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

版权及免责声明:


1 .贵州家电维修网所有内容的版权均属于作者或页面内声明的版权人。未经贵州家电维修网的许可,任何其他个人或组织均不得以任何形式将贵州家电维修网的各项资源转载、复制、编辑或发布使用于其他任何场合。

2 .已经本网授权使用作品的,应在授权范围内使用,并注明 “ 来源:贵州家电维修网” 。

3 .本网注明“ 来源:XXX (非贵州家电维修网)” 的作品,均转载自其他媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

4 .因作品内容、版权和其他问题需要同本网联系的,请 30日内进行。

报修热线0851-85164808  
蓝天电器:是贵州家电维修网指定家电维修单位。蓝天电器技术人员均经过专业培训,对家电维修知识有着坚实的基础,并取得了维修家用电器的资格证书。多年来我部在各社区和单位的维修中赢得了社会各界的广泛认可。源于顾客的厚爱,蓝天电器本着“技术取胜 服务社会”的宗旨,对产品的维修质量有保证,服务有跟踪。为便捷顾客,蓝天电器提供上门服务,让顾客更省心、放心。
服务项目:各种彩电、功放、影碟、录象机等家庭影院。冰柜、空调、冷库、电冰箱等制冷设备。电脑、音箱、软件、显示器等电脑相关。风扇、电饭煲、洗衣机、微波炉、电热水器等家用电器。