assembly 6502汇编程序中的Fibonnacci序列

7gs2gvoe  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(92)

我试图在6502汇编器中构建一个斐波那契序列。它需要至少一个add函数、至少一个分支函数和至少一个比较函数。我知道如何添加和存储整数,但我被分支和比较函数弄糊涂了。
我使用下面的指令集.

ahy6op9u

ahy6op9u1#

但我对分支和比较函数感到困惑
在C代码中,我们可以使用structured statement,这里是while循环:

count = -n;
do {
    // loop body
   count++;
} while ( count != 0 );
// more code

而使用可以称为if-goto-label的东西,相同(仍然在C中):

count = -n;
Loop1:
   // loop body
   count++;
   if ( count != 0 ) goto Loop1;
   // more code

所以,希望你能看到这两个结构是等价的,完全相同的,因此将运行相同的,即使后者有点冗长。两者都将在相同的迭代次数下运行相同的循环体。
然而,后一种形式更接近汇编语言,它也使用if-goto-label。
因此,汇编的关键是如何执行C语句if ( count != 0 ) goto Loop1;。C语言中if-goto-label语句的问题是,处理器通常会在一条机器码指令中处理太多的操作数(这里,这些操作数是count!=0Loop1,我们可以想象,在一般情况下,这些操作数中的每一个都需要变化)。
因此,许多指令集的解决方案是将if-goto-label结构拆分为两条指令,通过使用条件码连接它们。这里,第一个是设置条件代码的count0的比较,第二个是使用条件!=和读取条件代码的标签目标Loop1的分支。
这两条指令通过条件码进行通信,但您可以将其视为通过两条指令序列执行if-goto-label构造(这里是一条额外的指令,用于为后面的cpx清除X寄存器):

ldx #$0
cpx count
bne Loop1

以上是基于C的if-goto-label结构if ( count != 0 ) goto Loop1;的汇编伪代码翻译。
每个处理器的操作和汇编语言略有不同,所以一个很好的一般想法是:

  • 使用C结构化语句根据控制结构编写算法
  • 将控制结构转换为if-goto-label形式,仍在C中
  • 将if-goto-label语句转换为特定程序集

相关问题