增加装配表(68HC11)

时间:2017-04-05 02:30:33

标签: assembly 68hc11

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

          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

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

1 个答案:

答案 0 :(得分: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中做杂技'我还没见过。)

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