我正在想办法用68HC11IDE实现斐波那契序列,这个集成开发环境使用了摩托罗拉as11汇编程序。
我已经使用了2字节无符号的小端格式,现在我正尝试使用4字节变量,使用大端格式来更改它
我的伪代码(用c编写):
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。
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实现它的一对一更好?因为这是小端的,所以我假设我必须改变一些分支。是的,这是一个类的作业,我不是在找代码,只是一些指导会很好。
谢谢!
发布于 2014-10-09 16:57:51
(对于您的实际问题,您的问题描述有点含糊,所以我可能是在猜测。)
顺便说一句,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 Starthttps://stackoverflow.com/questions/26247017
复制相似问题