我正试图找出一种使用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?由于这是小端,我假设我必须改变一些分支。是的,这是课程的作业,我不是在寻找代码,只是一些指导会很好。
谢谢!
答案 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