1466 views|0 replies

1140

Posts

0

Resources
The OP
 

C5000 compiles SUBC instruction to implement division [Copy link]

Solve y=(ax^2-bx+c)/(dx+e) by programming, and put the quotient and remainder in the data memory 1000H and 1001H respectively. (1) Given a=8, b=6, c=10, d=7, e=9, x=5, find y. (2) Given a=0.9, b=0.1, c=0.5, d=0.4, e=0.2, x=0.8, find y. .title "division.asm" .mmregs Y .usect "Y",10H ; If the stack is to be used in the program, it must be set up first X .usect "X",1 .data ; Use pseudo instructions .sect, .text or .data to change the segment table: .word 8,6,10,7,9; Put a, b, c, d, e into the stack respectively tal: .word 5; Independently allocate space for the value of X .def start start: STM #Y,AR2 RPT #4 MVPD table,*AR2+ ;First open up a larger stack area and fill it with known numbers STM #X,AR3 MVPD tal,*AR3 ; From program memory to data memory LD #0,A LD #0,B; Clear the accumulator to 0 STM #Y,AR3; Give the first address of the data segment to ARx STM #X,AR2 SQURA *AR2,A ;A=(*AR2)^2 STL A,*AR4 ; Assign the low byte of the accumulator to the space pointed to by AR4 MAC *AR4,*AR3+,B ; After B=aX^2 calculation, AR3 points to the next address STL B,*(0201H) LD #0,A ; Accumulator initialization MAC *AR2,*AR3+,A ;A = A+bX STL A,*AR4 SUB *AR4,B ;B=B-*AR4 => B=aX^2-bX ADD *AR3+,B ;B=aX^2-bX+c STL B,*(0201H) LD #0,A MAC *AR2,*AR3+,A ADD *AR3,A;A=dX+e STM #0203h,AR4 STM #0204h,AR5 STL A,*AR4 STL B,*AR5 ;Verify answer RPT #15 SUBC *AR4,B ;Division STL B,*(1000H) ;Business STH B,*(1001H) ;Remainder end: B end .end .title "vectors.asm" .ref start .sect ".vectors" B start .end division.obj vectors.obj -o division.out -m division.map -estart MEMORY { PAGE 0: EPROM:org=0e000h  len = 0100h
    VECT:   org=0ff80h  len = 0004h
PAGE    1:
    SPRAM:  org=0060h   len = 0020h
    DARAM1: org=0100h   len = 0010h
    DARAM2: org=0080h   len = 0002h
}
SECTIONS
{


    .text   :>EPROM     PAGE    0
    .data   :>EPROM     PAGE    0
        X   :>DARAM1    PAGE    1
        Y   :>DARAM2    PAGE    1
    .vectors:>VECT      PAGE    0


}
;cmd脚本文件,定义空间位置

        .title  "division.asm"
        .mmregs                 ;将寄存器符号设置为全局可用


        .bss   a,6
        .bss   b,1
        .data
table1:     .word   8*32768/10,9*32768/10,1*32768/10,5*32768/10,4*32768/10,2*32768/10
table2:     .word   8*32768/10
        .def    start   ;.def表示某符号在本文件定义,可为其他文件引用
        .text
start:      SSBX    FRCT


            STM     #a,AR2
            RPT #6
            MVPD    table1,*AR2+


            STM     #b,AR3
            MVPD    table2,*AR3


            LD      #0,A
            LD      #0,B
            STM     #a,AR2
            STM     #b,AR3


            MPY     *AR3,*AR2+,A   ;乘法  等同SQURA *AR3,A 得出值      假如为005F7A**** ;即00 0101 1111 0111 1010*****=2^(-1)+2^(-3)+……
如果不是特别要求可以省略低字节数据
            STH     A,*AR4
            STH     A,*(0200H)      ;     A=X^2的值存储在0200H
            MAC     *AR4,*AR2+,B
            STH     B,*(0201H)       ;B=aX^2将值存储在0201H
            LD      #0,A
            MAC     *AR3,*AR2+,A
            STH     A,*AR4  
            SUB     *AR4,16,B
            ADD     *AR2+,16,B  
            STH     B,*(0202H)      ;B=aX^2-bX+c的值存储在0202H


            LD      #0,A
            MAC     *AR3,*AR2+,A
            ADD     *AR2,16,A          ;A=dX+e
            STM     #0203H,AR4        
            STH     A,*AR4           ;*AR4=dX+e
                                     ;A=dX+e的值存储在0203H


            STM     #0204h,AR5  
            STH     B,*AR5       ;B=aX^2-bX+c


            LD      #0,B
            LD      *AR5,B
            RPT     #15
            SUBC    *AR4,B
            ;XC     1,BLT
            ;NEG        A
            STL     B,*(1000H)
            STH     B,*(1001H)


end:        B       end


        .end








        .title  "vectors.asm"
        .ref    start
        .sect   ".vectors"
        B   start
        .end

division.obj
vectors.obj
-o  division.out
-m  division.map
-estart
MEMORY
{
PAGE    0:
    EPROM:  org=0e000h  len = 0100h
    VECT:   org=0ff80h  len = 0004h
PAGE    1:
    SPRAM:  org=0060h   len = 0020h
    DARAM1: org=0100h   len = 0010h
    DARAM2: org=0080h   len = 0002h
}
SECTIONS
{


    .text   :>EPROM     PAGE    0
    .data   :>EPROM     PAGE    0
    .bss    :>SPRAM     PAGE    1
    .vectors:>VECT      PAGE    0


}

This post is from Microcontroller MCU
 

Just looking around
Find a datasheet?

EEWorld Datasheet Technical Support

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号
快速回复 返回顶部 Return list