zephyrkaka 发表于 2007-7-4 13:23:38

马老师,请教LOG对数子程序 以10为底,浮点运算.汇编. 有点问题 做出来不对

.include "m128def.inc"

.ORG$0000

RJMP        START

START:LDI        R16,HIGH(RAMEND)

                OUT        SPH,R16

                LDI        R16,LOW(RAMEND)

                OUT        SPL,R16

                CLRR16

                CLR R17

                CLR R11

                CLR R10

                CLR R9

      LDI R21,10

      MOV R12, R21

                CALL       LINOM

                CALL    GX

                CALL    FBTOD

          RET



LINOM:BST R9, 7

   BRTC LI10

   CLR R16

   SUB R16,R12

   MOV R12,R16

   CLR R16

   SBC R16,R11

   MOV R11,R16

   CLR R16

   SBC R16,R10

   MOV R10, R16

   CLR R16

   SUB R16, R9

   MOV R9, R16

LI10:LDI R16, $A0

LP10:SBRC R9, 7

   RJMP NX63

   LSL R12

   ROL R11

   ROL R10

   ROL R9

   DEC R16

   CPI R16,$80

   BRNE LP10

   RJMP G0

NX63:MOV R13,R9

   MOV R14,R10

   MOV R15,R11

   SBRS R12,7

   RJMP PP6

   RCALL INC3

   BRNE PP6

   INC R16

   SEC

   ROR R13

PP6:MOV R12,R16

   BLD R13,7

        RET



   

G0: CLR R12;若X〈-88.02969

    CLR R13

    CLR R14

    CLR R15   

    RET   ;长整数转换成浮点数字程序结束    各种函数计算子程序中自变量X,一律放在R12---R15四个寄存器中R12      内存放阶码,R13--R15存放尾数,R13内为尾数的高位字节









GX:RCALL LNX    ;下面计算LOGX   MDB=20LOGV+20LOG0.775计算LNX

    RCALL GLN10;计算LN10

    RCALL EXCH

    RJMP FPDI    ;转计算LGX=LNX/LN10

LNX:TST R12

    BREQ OV5

    SBRS R13,7

    RJMP LN1

OV5:SEV

    RET

LN1:ANDI R16, $7E

    MOVR0, R12

    LDIR17, $F3

    CP   R15, R17

    LDIR17, $04

    CPCR14, R17   

    LDIR17, $35

    CPCR13, R17

    BRCC LN5

    DECR0

    MOV R17, R15

    ORR17, R14

    ORR17, R13

    MOV R12, R17

    BREQ LN5A

    RCALL KP2

    LSL R19

    ROL R10

    ROL R11

    LSR R13

    ROR R14

    ROR R15

    LDI R17,$80

    ORR13,R17

    LDI R17, $7E

    MOV R12,R17

    RJMP LNTLP



LN5:ORI R16, $80

    RCALL KP2

    RCALL NEG3A

    LDI R17,$80

    ADD R9,R17

    LSR R13

    ROR R14

    ROR R15

    LDI R17,$C0

    ORR13,R17

    LDI R17,$7F

    MOV R12,R17

LNTLP:LSL R11

    ROL R10

    ROL R9

    DEC R12

    SBRS R9,7

    RJMP LNTLP

    RCALL FPD3

    PUSH R0

    RCALL FPLN1



    .DB$7E,$12,$49,$25

    .DB$7E,$4C,$CC,$CD

    .DB$7F,$2A,$AA,$AB

    .DB$81,$00,$00,$00

    .DB$01,$00

    INC R12

    POP R0

LN5A:LDI R17,$80

    ADD R0,R17

    BREQ LN53

    BRCS LN51

    NEG R0

    INC R16

LN51:RCALL LD1

    MOV R13,R0

    RCALL NRML

    RCALL GLN2

    RCALL FPMU

    RCALL GET1

    SBRSR16,0

    RJMPLN52

    RCALL FPSU

    RET

LN52:RCALL FPAD

LN53:RET

KP2:MOV R8,R12

    MOV R9, R13

    MOV R10,R14

    MOV R11,R15

    RET

NEG3A:COM R11

    COM R10

    COM R9

INC3A:LDI R17,255

      SUB R11,R17

          SBC R10,R17

          SBC R9,R17

          RET







;FPDI 子程序

FPDI:TST R12

   BREQ OV3   

   TST R8

   BRNE D1

   RJMP G0    ;被除数为0,商为0



D1:NEG R12   ;除数阶码求补,以加补码代替减原码

   RCALL DP   

   BRCS OV3

   BREQ OV3

   LDI R17, $80

   OR R9,R17

   OR R13,R17    ;恢复尾数最高位



FPD3:LDI R17,25    ;左移相减试商25次,最后一次舍入

    SUB R11,R15

    SBC R10,R14

    SBC R9,R13

    BRCS D2       ;第一次尾数相减试商

    INC R12       ;够减,商阶增1

    SEC

   BRNE D3      ;商阶增1后不为0,转计商;否则为益出

OV3:SEV

   RET

D2: ADD R11, R15

    ADC R10,R14

    ADC R9,R13   ;不够减则恢复被除数



LOOP2:LSL R11

    ROL R10

    ROL R9      ;被除数算术左移

    BRCS D4       ;进位位为1,够减,本位商1

    SUB R11,R15

    SBC R10,R14

    SBCR9,R13   ;否则相减试商

    BRCS D2A

   SEC

    RJMP D3       ;够减,本位商1



D2A:ADD R11,R15    ;不够减,恢复被除数

    ADC R10,R14   

    ADC R9,R13

    CLC            ;本位商0

    RJMP D3

D4: SUB R11,R15

    SBC R10,R14

    SBC R9,R13      ;被除数减去除数

D3: DEC R17

    BRNE D5         ;除法未完成,循环

    MOV R13,R5

    MOV R14,R6

    MOV R15,R7      ; 取回商

    BRCC COM3

    RCALL INC3      ;第25位商舍入

COM3:LDI R17,$7F

    SBRS R16,7

    AND R13,R17   ;配置商数符

DON3:RET



D5:ROL R7          ;在R5R6R7中记商

    ROL R6

    ROL R5

    RJMP LOOP2      ; 商数左移1位并记商





;//FPLN



FPLN1:ORI R16,$10

    RCALL LD3

    RCALL KP2

    RCALL FPMU

    RJMPFLN0

FPLN2:ANDI R16,$EF

FLN0:RCALL LD1

   POP R31

       POP R30

       LSL R30

       ROL R31

       LPM

       MOV R8,R0

       ADIW R30,1

       LPM

       MOV R9,R0

       ADIW R30,1

       LPM

       MOV R10,R0

       ADIW R30,1

       LPM

       MOV R11,R0

       ADIW R30,1

PLN:RCALL M1

    LPM

        MOV R8,R0

        ADIW R30,1

        LPM

        MOV R9,R0

        ADIW R30,1

        LPM

        MOV R10,R0

        ADIW R30,1

        LPM

        MOV R11,R0

        ADIW R30,1

        RCALL FPLAD

        LPM

        RCALL GET1

        DEC R0

        BRNE PLN

PEND:SBRS R16,4

   RJMP REND

       RCALL GET3

       RCALL M1

REND:LSR R31

   ROR R30

       ADIW R30,1

       IJMP

LD3:STS$78,R12;存浮点数

    STS$79,R13

    STS$7A,R14

    STS$7B,R15

    RET





;FPMU子程序

FPMU:TST R8

   BREQM0   ; 被乘数为0,积为0

   TST R12

   BRNEM1   ; 乘数为0,积也为0

M0:RJMP G0

M1:RCALL DP

   BRCS OV2

   BREQ OV2

   LDI R17,$80

   ORR9,R17

   ORR13,R17

   MOV R5, R13

   MOV R6,R14

   MOV R7, R15

   LDI R17, 25

   CLR R13

   CLRR14

   CLRR15

   CLC

LOOP1:BRCC M2

      ADD R15,R11

          ADC R14,R10

          ADC R13,R9

M2: ROR R13

    ROR R14

        ROR R15

        ROR R5

        ROR R6

        ROR R7

        DEC R17

        BRNE LOOP1

        SBRC R13,7

        RJMP M3

        ROL R5

        ROL R15

        ROL R14

        ROL R13

        SBRS R5,7

        RJMP M5

        RCALL INC3

        BRNE M5

        SEC

        ROR R13

        RJMP COM2

M5:DEC R12

   BRNE COM2



OV2: SEV

   RET

M3:SBRC R5,7

   RCALL INC3

COM2:LDI R17,$7F

   SBRS R16,7

       AND R13,R17

DON2:RET

DP:ANDI R16,$7F ;处理积/商数符,计算积/商阶码子程序

   SBRC R9,7   

   SUBI R16,$80

   SBRC R13,7

   SUBI R16,$80;积/商符号放在R16,7

   ADD R12,R8    ;移码相加

   LDI R17,$80

   BRCC DP1

   ADD R12,R17   ; 移码求和有进位,将和再加上$80,再进位为溢出

   RET

DP1: SUBR12,R17   ;移码求和无进位,将和减去$80,有借位或差为0为溢出

   RET

LD1: STS $70,R12

   STS $71,R13

   STS $72,R14

   STS $73,R15

   RET







NRML:ANDIR16,$BF

   CLR R14

   CLR R15

       LDI R20, $88

   MOV R12,R20

   RJMP NMLOP





GLN2:LDI R17, $80

   MOV R8,R17

   LDI R17,$31

   MOV R9,R17

   LDI R17,$72

   MOV R10,R17

   LDI R17,$18                   ;   此处计算LN2

   MOV R11,R17

   RET









GET1:LDS R8,$70            ;取浮点数

   LDS R9, $71

   LDS R10,$72

   LDS R11,$73

   RET



;//FPSU 子程序

FPSU: LDI R17, $80            ;浮点减法子程序

      SUB R13,R17   

FPAD:TST R8

   BREQ DON1

       TST R12

       BRNE FPLAD

SAV0:MOV R12,R8

   MOV R13,R9

       MOV R14,R10

       MOV R15,R11

DON1:RET

FPLAD:ANDI R16,$3F

      SBRC R9,7

          ORI R16,$80

          SBRC R13,7

          ORI R16,$40

          LDI R17,$80

          OR R9,R17

          OR R13,R17

          MOV R17,R12

          SUB R17,R8

          BREQ GOON

          BRCC NX3

          NEG R17

          CPI R17,24

          BRCC EXADP

NX2A:LSR R13

   ROR R14

       ROR R15

       DEC R17

   BRNE NX2A

       MOV R12,R8

       BRCC GOON

   RCALL INC3

       RJMP GOON

EXADP:RJMP EXAD

NX3:CPI R17,24

    BRCC COM1

LOOP:LSR R9

   ROR R10

       ROR R11

       DEC R17

       BRNE LOOP

       BRCC GOON

   RCALL INC3A

GOON:SBRC R16,6

   SUBI R16,$80

       SBRS R16,7

       RJMP SAMS

       SUB R15,R11

       SBC R14,R10

       SBC R13,R9

       BRCC NOM

       SUBI R16,$40

       RCALL NEG3

NOM:MOV R17,R13

    OR R17,R14

        OR R17,R15

        BREQ DONO

NMLOP:SBRC R13,7

       RJMP COM1

       LSL R15

           ROL R14

           ROL R13

           DEC R12

           BRNE NMLOP

OV1:SEV

    RET

SAMS:ADD R15,R11

   ADD R14,R10

       ADD R13,R9

       BRCC COM1

       ROR R13

       ROR R14

       ROR R15

       INC R12

       BREQ OV1

       BRNE COM1

       RCALL INC3

COM1:SBRC R16,6       ;CLV

   RET

COMA:LDI R17,$7F

   AND R13,R17

DON:RET



EXAD:RCALL SAV0

   SBRS R16,7

       RJMP COMA

       RET



DONO:CLR R12

   RET          

          

          

          

          

                   

GLN10:LDI R17,$82

   MOV R8,R17

   LDI R17,$13

   MOV R9,R17

   LDI R17,$5D

   MOV R10,R17

   LDI R17,$8E

   MOV R11,R17

   RET

machao 发表于 2007-7-4 16:12:57

抱歉,我实在没有时间看你的程序,另外我现在主要使用高级语言编写代码,尤其使用AVR时。



推荐你参考《AVR单片机实用程序设计》一书的5.3.4部分。该书是北航出的,作者为张克彦。书中例子全部采用汇编编写的。
页: [1]
查看完整版本: 马老师,请教LOG对数子程序 以10为底,浮点运算.汇编. 有点问题 做出来不对