68HC11上的斐波那契序列使用4字节数字

时间:2014-10-07 23:40:55

标签: c assembly 68hc11

我正试图找出一种使用68HC11 IDE实现Fibonacci序列的方法,该IDE使用Motorolla as11汇编程序。

我使用2-end unsigned in little-endian格式完成它,现在我试图使用4字节变量更改它,使用big-endian

我的伪代码(用c编写):

RESULT = 1;
PREV = 1;
COUNT = N;
WHILE(COUNT > 2){
    NEXT = RESULT + PREV;
    PREV = RESULT;
    RESULT = NEXT;
    COUNT--;
}

我将包含一些当前的汇编代码。请注意,count设置为1字节的unsigned int,prev,next和result为2字节的无符号整数。 N是无符号的,设置为10.

        ORG     $C000
        LDD     #1
        STD     RESULT      
        STD     PREV        
        LDAA    N
        STAA    COUNT       
WHILE   LDAA    COUNT
        CMPA    #2      
         BLS    ENDWHILE
         LDD    RESULT      
        ADDD    PREV    
         STD    NEXT           
         LDD    RESULT  
         STD    PREV           
         LDD    NEXT
         STD    RESULT         
         DEC    COUNT          
         BRA    WHILE       
ENDWHILE
DONE     BRA    DONE
    END

我现在遇到的问题是改变这个问题(除了显而易见的变量/声明之外)N现在将从40开始,而不是10.改变我的伪代码以包含指针允许我实现它1到用big-endian更好1?由于这是小端,我假设我必须改变一些分支。是的,这是课程的作业,我不是在寻找代码,只是一些指导会很好。

谢谢!

1 个答案:

答案 0 :(得分:1)

(你的问题描述对于你的实际问题有点模糊,所以我可能会猜测一点。)

BTW,68HC11是大端。

68HC11有一个16位累加器,所以只要你的结果溢出,就需要进行数学运算。

我想你的意思是,通过将N从10改为40,你的斐波纳契数变得太大而无法存储在16位变量中。

指针的使用与否与您的问题无关,因为您可以使用或不使用它们来解决它。例如,您可以使用指针告诉您的例程存储结果的位置。

根据您的最大预期结果,您需要调整日常工作。我假设您不需要超过32位结果(N = 47 =>> 2971215073)。

这是部分测试但未经优化的可能性(使用ASM11汇编程序):

STACKTOP            equ       $1FF
RESET_VECTOR        equ       $FFFE

                    org       $100                ;RAM

result              rmb       4

                    org       $d000               ;ROM

;*******************************************************************************
; Purpose: Return the Nth fibonacci number in result
; Input  : HX -> 32-bit result
;        : A = Nth number to calculate
; Output : None
; Note(s):

GetFibonacci        proc
                    push                          ;macro to save D, X, Y

          ;--- define & initialize local variables

                    des:4                         ;allocate 4 bytes on stack
tmp@@               equ       5                   ;5,Y: temp number

                    ldab      #1
                    pshb
                    clrb
                    pshb:3
prev@@              equ       1                   ;1,Y: previous number (initialized to 1)

                    psha
n@@                 equ       0                   ;0,Y: N
          ;---
                    tsy                           ;Y -> local variables

                    clra
                    clrb
                    std       ,x
                    std       prev@@,y

                    ldd       #1
                    std       2,x
                    std       prev@@+2,y

Loop@@              ldaa      n@@,y
                    cmpa      #2
                    bls       Done@@

                    ldd       2,x
                    addd      prev@@+2,y
                    std       tmp@@+2,y

                    ldaa      1,x
                    adca      prev@@+1,y
                    staa      tmp@@+1,y

                    ldaa      ,x
                    adca      prev@@,y
                    staa      tmp@@,y

                    ldd       ,x
                    std       prev@@,y
                    ldd       2,x
                    std       prev@@+2,y

                    ldd       tmp@@,y
                    std       ,x
                    ldd       tmp@@+2,y
                    std       2,x

                    dec       n@@,y
                    bra       Loop@@

Done@@              ins:9                         ;de-allocate all locals from stack
                    pull                          ;macro to restore D, X, Y
                    rts

;*******************************************************************************
; Test code
;*******************************************************************************

Start               proc
                    ldx       #STACKTOP           ;setup our stack
                    txs

                    ldx       #result
                    ldaa      #40                 ;Nth fibonacci number to get
                    bsr       GetFibonacci
                    bra       *                   ;check 'result' for answer

                    org       RESET_VECTOR
                    dw        Start