0

我有一个包含两个数据表和一个结果表的程序

          ORG $B000
TABLE1    FCB        222, 37, ...
TABLE2    FCB        37, 100, ...

          ORG $B010
RESULT    RMB        8

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

          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

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

4

1 回答 1

1

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

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

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

在我提供完整的答案之前,我想看看 SUB 子例程。对于 SUB 在堆栈上返回某些内容而没有首先在堆栈上为其分配所需空间的情况下,它必须对堆栈执行一些“杂技” - 可能但不是处理此类问题的正常方法。

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

最后,调用 SUB 之后的 PULA 会破坏堆栈平衡,因为您之前没有推送过(除非您在 SUB 中执行“杂技”,我还没有看到。)

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

于 2017-04-05T12:50:54.277 回答