0

我试图找出一种使用 68HC11 IDE 实现斐波那契序列的方法,该 IDE 使用 Motorolla as11 汇编器。

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

我的伪代码(用 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 字节的 unsigned int。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 比 1 更好地实现它大端?由于这是little-endian,我认为我必须更改一些分支。是的,这是课堂作业,我不是在寻找代码,只是一些指导会很好。

谢谢!

4

1 回答 1

1

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

顺便说一句,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
于 2014-10-09T08:57:50.663 回答