我试图在6502汇编器中构建一个斐波那契序列。它需要至少一个add函数、至少一个分支函数和至少一个比较函数。我知道如何添加和存储整数,但我被分支和比较函数弄糊涂了。我使用下面的指令集.
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,!=,0,Loop1,我们可以想象,在一般情况下,这些操作数中的每一个都需要变化)。因此,许多指令集的解决方案是将if-goto-label结构拆分为两条指令,通过使用条件码连接它们。这里,第一个是设置条件代码的count和0的比较,第二个是使用条件!=和读取条件代码的标签目标Loop1的分支。这两条指令通过条件码进行通信,但您可以将其视为通过两条指令序列执行if-goto-label构造(这里是一条额外的指令,用于为后面的cpx清除X寄存器):
if ( count != 0 ) goto Loop1;
count
!=
0
Loop1
cpx
X
ldx #$0 cpx count bne Loop1
以上是基于C的if-goto-label结构if ( count != 0 ) goto Loop1;的汇编伪代码翻译。每个处理器的操作和汇编语言略有不同,所以一个很好的一般想法是:
1条答案
按热度按时间ahy6op9u1#
但我对分支和比较函数感到困惑
在C代码中,我们可以使用structured statement,这里是while循环:
而使用可以称为if-goto-label的东西,相同(仍然在C中):
所以,希望你能看到这两个结构是等价的,完全相同的,因此将运行相同的,即使后者有点冗长。两者都将在相同的迭代次数下运行相同的循环体。
然而,后一种形式更接近汇编语言,它也使用if-goto-label。
因此,汇编的关键是如何执行C语句
if ( count != 0 ) goto Loop1;
。C语言中if-goto-label语句的问题是,处理器通常会在一条机器码指令中处理太多的操作数(这里,这些操作数是count
,!=
,0
,Loop1
,我们可以想象,在一般情况下,这些操作数中的每一个都需要变化)。因此,许多指令集的解决方案是将if-goto-label结构拆分为两条指令,通过使用条件码连接它们。这里,第一个是设置条件代码的
count
和0
的比较,第二个是使用条件!=
和读取条件代码的标签目标Loop1
的分支。这两条指令通过条件码进行通信,但您可以将其视为通过两条指令序列执行if-goto-label构造(这里是一条额外的指令,用于为后面的
cpx
清除X
寄存器):以上是基于C的if-goto-label结构
if ( count != 0 ) goto Loop1;
的汇编伪代码翻译。每个处理器的操作和汇编语言略有不同,所以一个很好的一般想法是: