搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2007-7-4 13:23:38 | 显示全部楼层 |阅读模式
.include "m128def.inc"

.ORG  $0000

RJMP        START

START:  LDI        R16,HIGH(RAMEND)

                OUT        SPH,R16

                LDI        R16,LOW(RAMEND)

                OUT        SPL,R16  

                CLR  R16

                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

    MOV  R0, R12

    LDI  R17, $F3

    CP   R15, R17

    LDI  R17, $04

    CPC  R14, R17   

    LDI  R17, $35

    CPC  R13, R17

    BRCC LN5

    DEC  R0

    MOV R17, R15

    OR  R17, R14

    OR  R17, R13

    MOV R12, R17

    BREQ LN5A

    RCALL KP2

    LSL R19

    ROL R10

    ROL R11

    LSR R13

    ROR R14

    ROR R15

    LDI R17,$80

    OR  R13,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

    OR  R13,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

    SBRS  R16,0

    RJMP  LN52

    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

    SBC  R9,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

    RJMP  FLN0

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

     BREQ  M0     ; 被乘数为0,积为0

     TST R12

     BRNE  M1     ; 乘数为0,积也为0

M0:  RJMP G0

M1:  RCALL DP

     BRCS OV2

     BREQ OV2

     LDI R17,$80

     OR  R9,R17

     OR  R13,R17

     MOV R5, R13

     MOV R6,R14

     MOV R7, R15

     LDI R17, 25

     CLR R13

     CLR  R14

     CLR  R15

     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: SUB  R12,R17   ;移码求和无进位,将和减去$80,有借位或差为0为溢出

     RET

LD1: STS $70,R12

     STS $71,R13

     STS $72,R14

     STS $73,R15

     RET







NRML:ANDI  R16,$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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-7-4 16:12:57 | 显示全部楼层
抱歉,我实在没有时间看你的程序,另外我现在主要使用高级语言编写代码,尤其使用AVR时。



推荐你参考《AVR单片机实用程序设计》一书的5.3.4部分。该书是北航出的,作者为张克彦。书中例子全部采用汇编编写的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 17:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表