在汇编 (68HC11) 中递增 a table

Increment a table in Assembly (68HC11)

我有一个包含两个数据 tables 和一个结果 table

的程序
          ORG $B000
TABLE1    FCB        222, 37, ...
TABLE2    FCB        37, 100, ...

          ORG $B010
RESULT    RMB        8

我的程序循环遍历每个 table 中的值,并将它们传递给一个函数,该函数会找到它们的最大公分母。返回值通过堆栈传递,需要存储在 Result table 中。这是我目前所拥有的

          ORG $C000
          LDX         #TABLE1
          LDY         #TABLE2
WHILE     LDAA        0,X              WHILE (*TABLE1 != -1)          
          CMPA        #$FF                  
          BEQ         ENDWHILE                     
          LDAA        0,X                          PASS VARIABLES TO
          LDAB        0,Y                          SUBROUTINE IN REGISTER
          INX                                      TABLE1++
          INY                                      TABLE2++
          JSR         SUB
          PULA                                     
          STAA      RESULT             GET RETURN VALUE FROM STACK

上面的代码和我的子程序一样工作正常。我不知道如何增加我的 RESULT 变量。我尝试使用循环计数器作为偏移量,但出于某种原因,下面的代码存储在 $B019 位置而不是 $B010

         STAA    COUNTER,RESULT
         INC     COUNTER

如果有任何不清楚的地方或者您认为问题不好,请发表评论,我会解决的。

您的代码有几个问题。例如,STAA COUNTER,RESULT 不是 68HC11 的有效汇编指令格式。

要将答案存储在 table 中,您需要第三个索引。由于 68HC11 只有 X 和 Y 用于索引,因此您需要使用一个额外的变量来保存额外的索引。如果您的 table 地址是零页范围(0 到 255)中的常量(固定地址),您甚至可以使用单个寄存器访问所有 table。例如:

LDX #0
LDA TABLE1,x
LDB TABLE2,x
...
JSR SUB
STA RESULT,x
INX
...

在我提供完整答案之前,我想先看看 SUB 子例程。对于 SUB return 堆栈上的某些东西,而不首先在堆栈上为其分配所需的 space,它必须对堆栈做一些 'acrobatics' —— 可能但不是正常方式处理这类问题。

通常的方法是在调用 SUB 之前为 returned 结果创建所需的堆栈 space,然后 SUB 将答案写入保留的 space。然而,在这种特殊情况下,除非出于学术目的另有要求,否则将 return 寄存器 A 中的结果而不是在堆栈上分配单个字节并让 SUB 写入它会更简单。

最后,调用 SUB 后的 PULA 会破坏堆栈平衡,因为你之前没有推过就拉(除非你在 SUB 中'acrobatics',我还没有看到。)

请提供更多信息,我会更新我的答案。