⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doublediv.lst

📁 这是单片机MS-51双字节带符号数除法扩展子程序
💻 LST
字号:
8051 Assembler           Version 1.00   05/11/105 12:59:09    Page 1
C:\Documents and Settings\xulxl\My Documents\单片机\DoubleDiv.a51



    1 0000              
    2 0000              ;入口参数:(R7 R6) =被除数, (R5 R4) = 除数
    3 0000              ;出口: (R7 R6) = 商数,(OVER = 溢出标志位
    4 0000              ;工作寄存器:   (R3 R2) =部分余数, (R1)= 计数器,(R0) =差值暂存
    5 0000              
    6 0000              
    7 0000              
    8 0000                             ORG 0000H
    9 0000                             SIG1    BIT     00H      ;定义三个位变量
   10 0000                             SIG2    BIT     01H
   11 0000                             SIG     BIT     02H
   12 0000              ;判断除数和被除数是不是为0,并做相应的处理
   13 0000 ED           Start:         MOV             A,      R5
   14 0001 7003                        JNZ             checkdividend
   15 0003 EC                          MOV             A,      R4
   16 0004 607B                        JZ              over             ;如果为0,则置溢出标志位
   17 0006                      ;判断被除数               
   18 0006 EF           checkdividend: MOV             A,      R7
   19 0007 7004                        JNZ             begindiv         ;非0则开始执行
   20 0009 EE                          MOV             A,      R6
   21 000A 7001                        JNZ             begindiv
   22 000C 22                          RET
   23 000D                             
   24 000D              ;判断两个数的符号,并且做相应的处理             
   25 000D EF           begindiv:      MOV             A,      R7
   26 000E 33                          RLC             A
   27 000F 9200                        MOV             SIG1,   C        ;存放被除数符号
   28 0011 ED                          MOV             A,      R5
   29 0012 33                          RLC             A
   30 0013 9201                        MOV             SIG2,   C        ;存放除数符号
   31 0015 8200                        ANL             c,      SIG1     ;计算积的符号
   32 0017 4006                        JC              posi             ;若两数均负积正则转posi
   33 0019 A200                        MOV             c,      SIG1     ;两数非全负时积的符号
   34 001B 7201                        ORL             c,      SIG2
   35 001D 8001                        SJMP            sign
   36 001F B3           posi:          CPL             C                ;取反
   37 0020 9202         sign:          MOV             SIG,    C        ;商的符号
   38 0022 EF                          MOV             A,      R7
   39 0023 20E706                      JB              Acc.7,  cp1      ;被除数为负转求补
   40 0026 ED           step1:         MOV             A,      R5
   41 0027 20E70E                      JB              Acc.7     cp2    ;除数为负转求补
   42 002A 8018         step2:         SJMP    doublediv                ;开始除法
   43 002C                      ;被除数求补
   44 002C EE           cp1:           MOV             A,      R6
   45 002D F4                          CPL             A
   46 002E 2401                        ADD             A,#01H
   47 0030 FE                          MOV             R6,     A
   48 0031 EF                          MOV             A,      R7
   49 0032 F4                          CPL             A
   50 0033 2401                        ADD             A,      #01H
   51 0035 FF                          MOV             R7,     A
   52 0036 80EE                        SJMP    step1
   53 0038                       ;除数求补              
   54 0038 EC           cp2:                   MOV             A,      R4
   55 0039 F4                                  CPL             A
   56 003A 2401                                ADD             A,      #01H
   57 003C FC                                  MOV             R4,     A
8051 Assembler           Version 1.00   05/11/105 12:59:09    Page 2
C:\Documents and Settings\xulxl\My Documents\单片机\DoubleDiv.a51



   58 003D ED                                  MOV             A,      R5
   59 003E F4                                  CPL             A
   60 003F 2401                                ADD             A,      #01H
   61 0041 FD                                  MOV             R5,     A
   62 0042 80E6                                SJMP    step2
   63 0044              
   64 0044              ;双字节除法开始
   65 0044              ;入口参数:(R7 R6) =被除数, (R5 R4) = 除数
   66 0044              ;出口: (R7 R6) = 商数,(OVER = 溢出标志位
   67 0044              ;工作寄存器:   (R3 R2) =部分余数, (R1)= 计数器,(R0) =差值暂存
   68 0044              
   69 0044 E4           doublediv:     CLR             A              
   70 0045 FA                                  MOV             R2,     A
   71 0046 FB                                  MOV             R3,     A
   72 0047 7910                                MOV             R1,     #10H     ;双字节除法计数器置16    
   73 0049                                     ;开始(R3,R2,R7,R6)移位操作
   74 0049 C3           div1:                  CLR             C
   75 004A EE                                  MOV             A,      R6       ;被除数低8位左移
   76 004B 33                                  RLC             A
   77 004C FE                                  MOV             R6,     A
   78 004D EF                                  MOV             A,      R7       ;被除数高8位循环左移  
   79 004E 33                                  RLC             A
   80 004F FF                                  MOV             R7,     A
   81 0050 EA                                  MOV             A,      R2       ;余数低8位循环左移
   82 0051 33                                  RLC             A
   83 0052 FA                                  MOV             R2,     A
   84 0053 EB                                  MOV             A,      R3       ;余数高8位循环左移
   85 0054 33                                  RLC             A
   86 0055 FB                                  MOV             R3,     A
   87 0056                                     ;开始部分余数减除数
   88 0056 EA           div2:                  MOV             A,      R2       ;低8位先减
   89 0057 9C                                  SUBB            A,      R4
   90 0058 F8                                  MOV             R0,     A        ;暂存差值
   91 0059 EB                                  MOV             A,      R3       
   92 005A 9D                                  SUBB            A,      R5       ;高8位相减
   93 005B 4004                                JC              next             ;若部分余数<除数转next
   94 005D 0E                                  INC             R6               ;若部分余数>=除数则商1
   95 005E FB                                  MOV             R3,     A        ;新余数存R3R2
   96 005F E8                                  MOV             A,      R0
   97 0060 FA                                  MOV             R2,     A
   98 0061 D9E6         next:                  DJNZ            R1,     div1     ;16位未除完则循环                    
   99 0063 EB                                  MOV             A,      R3       ;16位除完则开始看余数
  100 0064 20E70F                              JB              Acc.7,    add1   ;若余数最高位为1则进1
  101 0067 C3                                  CLR             C                ;开始余数除2
  102 0068 EA                                  MOV             A,      R2
  103 0069 33                                  RLC             A                ;余数低8位乘2
  104 006A FA                                  MOV             R2,     A
  105 006B EB                                  MOV             A,      R3
  106 006C 33                                  RLC             A                ;余数高8位乘2
  107 006D 9D                                  SUBB            A,      R5       ;余数*2-除数
  108 006E 400E                                JC              noover           ;若余数*2<除数则结束
  109 0070 7004                                JNZ             add1             ;若够减则转进1
  110 0072 EA                                  MOV             A,      R2       ;高8位相等时比较低8位
  111 0073 9C                                  SUBB            A,      R4
  112 0074 4008                                JC              noover           ;余数*2<除数则转结束
  113 0076                              ;商进1处理
  114 0076 EE           add1:          MOV             A,      R6               
8051 Assembler           Version 1.00   05/11/105 12:59:09    Page 3
C:\Documents and Settings\xulxl\My Documents\单片机\DoubleDiv.a51



  115 0077 2401                                ADD             A,      #01H
  116 0079 FE                                  MOV             R6,     A
  117 007A EF                                  MOV             A,      R7
  118 007B 3400                                ADDC    A,      #00H
  119 007D FF                                  MOV             R7,     A
  120 007E                                     
  121 007E 758100       noover:                MOV             OVER,   #00H     ;清溢出标志
  122 0081                                     
  123 0081                                      
  124 0081 7581FF       over:                  MOV             OVER,   #0FFH    ;置溢出标志
  125 0084 200201                              JB              SIG,    cp3      ;如果商的结果为负则求补
  126 0087                                                            
  127 0087 22           enddiv:                RET
  128 0088                                ;商为负时求补                     
  129 0088 EE           cp3:           MOV             A,      R6
  130 0089 F4                                  CPL             A
  131 008A 2401                                ADD             A,      #01H
  132 008C FE                                  MOV             R6,     A
  133 008D EF                                  MOV             A,      R7
  134 008E F4                                  CPL             A
  135 008F 2401                                ADD             A,      #01H
  136 0091 FF                                  MOV             R7,     A
  137 0092 80F3                                SJMP    enddiv
  138 0094                                     END                        

Defined Symbols:
  SIG                                       000002  2
  SIG1                                      000000  0
  SIG2                                      000001  1

Defined Labels:
  ADD1                                      000076  118
  BEGINDIV                                  00000D  13
  CHECKDIVIDEND                             000006  6
  CP1                                       00002C  44
  CP2                                       000038  56
  CP3                                       000088  136
  DIV1                                      000049  73
  DIV2                                      000056  86
  DOUBLEDIV                                 000044  68
  ENDDIV                                    000087  135
  NEXT                                      000061  97
  NOOVER                                    00007E  126
  OVER                                      000081  129
  POSI                                      00001F  31
  SIGN                                      000020  32
  START                                     000000  0
  STEP1                                     000026  38
  STEP2                                     00002A  42

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -