我正在为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
答案 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
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
此时我可以让它添加数字并显示结果,但它总是显示溢出的东西。修复子程序,然后重新评估程序的逻辑流程。