首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >68HC11上使用4字节数字的Fibonacci序列

68HC11上使用4字节数字的Fibonacci序列
EN

Stack Overflow用户
提问于 2014-10-08 07:40:55
回答 1查看 364关注 0票数 0

我正在想办法用68HC11IDE实现斐波那契序列,这个集成开发环境使用了摩托罗拉as11汇编程序。

我已经使用了2字节无符号的小端格式,现在我正尝试使用4字节变量,使用大端格式来更改它

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

代码语言:javascript
复制
RESULT = 1;
PREV = 1;
COUNT = N;
WHILE(COUNT > 2){
    NEXT = RESULT + PREV;
    PREV = RESULT;
    RESULT = NEXT;
    COUNT--;
}

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

代码语言:javascript
复制
        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。更改我的伪代码以包含指针是否可以让我用big-endian实现它的一对一更好?因为这是小端的,所以我假设我必须改变一些分支。是的,这是一个类的作业,我不是在找代码,只是一些指导会很好。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-10-09 16:57:51

(对于您的实际问题,您的问题描述有点含糊,所以我可能是在猜测。)

顺便说一句,68HC11是大端的。

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

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

使用或不使用指针与您的问题无关,因为您可以使用或不使用指针来解决问题。例如,您可以使用指针告诉您的例程将结果存储在何处。

根据您的最大预期结果,您需要调整您的例程。我将假定您不需要遍历32位结果(N=47 => 2971215073)。

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26247017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档