我无法使这个加法子程序工作

时间:2012-04-14 00:05:27

标签: assembly subroutine addition 68000

我正在为Easy68k中的汇编语言类编写一个附加程序,但我仍然遇到同样的问题。每当我运行该程序时,它允许我输入最多10个数字(我的数组的分配大小),然后它输出消息说它正在计算但是然后我只是用变音符号打印出无数的y。您可以通过我的程序直接看到任何问题导致它执行此操作吗?

我在子程序上搜索了语法,因为我很肯定我做错了,但我找不到任何东西。

ORG $2000
ARRAY   DS.W    10
ZDONE       DC.W    'Enter values. Zero when done.'
FULL        DC.W    'That is all the input allowed. Calculating sum now...'
OERROR      DC.W    'The values you entered caused an overflow condition.'
REPEAT      DC.W    'Do you want to repeat? [0=No, 1=Yes].'

START       ORG     $2800

MAIN    LEA         ZDONE,A1
        MOVE.B      #14,D0          ;
        TRAP        #15
        LEA         ARRAY,A0

        MOVE.B      #0,D3
INPUT   MOVE.B      #4,D0
        TRAP        #15
        MOVE.W      D1,(A0)+
        BEQ         SUB
        ADD.B       #1,D3
        CMPA        #$2012,A0
        BNE         INPUT
        LEA         FULL,A1
        MOVE.B      #14,D0           ; Outputs the FULL string
        TRAP        #15

SUB     SUB.W       A0,A0
        BSR         SUM              ; Begins to calculate sum

        CMP         #1,D0
        BNE         NoV
        LEA         OERROR,A1
        MOVE.B      #14,D0
        TRAP        #15
        BRA         AGAIN

NoV     LEA         $D1,A1
        MOVE.B      #14,D0
        TRAP        #15

AGAIN   LEA         REPEAT,A1
        MOVE.B      #14,D0
        TRAP        #15
        MOVE.B      #4,D0
        TRAP        #15
        MOVE.B      #1,D0
        CMP.B       D0,D1
        BEQ         START
        STOP        #$3800

        ORG         $3800        
SUM     LEA         ARRAY,A0
        ADD.W       #$A0,D1
        BVC         NoV
        SUB.B       #1,D3
        BNE         SUM
        MOVE.B      #1,D0
        BRA         RETURN
        CLR.B       D0
RETURN  RTS
        END         START

1 个答案:

答案 0 :(得分:2)

flood的洪水来自这里:

NoV     LEA         $D1,A1
        MOVE.B      #14,D0
        TRAP        #15

您正在将 0xD1的立即值加载到A1中。这就是$的用途:它意味着立即解决。调试器在这里很有用:如果你运行程序直到MOVE.B行,你会看到A1的值为0x000000D1。这是使用TRAP打印的字符串的地址,对吧? 0x000000D1的内存是什么?这是未定义的;在这种情况下,仿真器将内存初始化为0xFF,这对应于ÿ字符。

这可能是错的:

SUB     SUB.W       A0,A0

你从A0中减去A0,有效地将A0设置为0。

我怀疑这也是错的:

SUM     LEA         ARRAY,A0
        ADD.W       #$A0,D1

ADD正在向寄存器D1添加0xA0的立即值。你可能想要直接添加:

        ADD.W       A0,D1

还有一些事情:

您在SUM中的每个循环开始时将ARRAY加载到A0中。你应该在循环之前做到这一点:

SUB     LEA         ARRAY,A0
        BSR         SUM

在SUM内部,忽略我所说的内容并使用间接寻址。这将从数组中获取实际值并将其添加到累加器(我假设这是D1):

SUM     ADD.W       (A0)+,D1
NoV看起来正在显示累加器的当前值,对吧?你正在使用一个条件分支:好吧,你可能只希望它在你完成求和后显示。但BVC实际上并不是一个子分支!它不会保存返回指针。相反,我会将它移动到在计数器达到0后执行的SUM部分,我将使用BSR:

SUM     ADD.W       (A0)+,D1
        SUB.B       #1,D3
        BNE         SUM
        BSR         NoV
        MOVE.B      #1,D0
        BRA         RETURN
        CLR.B       D0
RETURN  RTS

请注意,您仍会收到溢出物。我不明白你在那里做什么所以我会让你搞清楚。另请注意,由于您使用无条件分支到RETURN,因此CLR永远不会被执行,因此SUM不可能返回0。

在此更改之后,通过返回RTS来修改NoV以使其像子例程一样重要。请注意,有一个TRAP值用于将D1的整数值显示为字符串,这可能是您想要的:

NoV     MOVE.B      #3,D0
        TRAP        #15
        RTS

此时我可以让它添加数字并显示结果,但它总是显示溢出的东西。修复子程序,然后重新评估程序的逻辑流程。