在EASy68K组件中求和2维数组

时间:2013-03-18 03:00:18

标签: arrays assembly 68000

100x100个整数A个整数,每个一个字节,位于A。编写一个程序段来计算次要对角线的总和,即

SUM =ΣA[i,99-i],其中i = 0 ... 99

这是我到目前为止所做的:

LEA A, A0
CLR.B D0
CLR.B D1
ADDA.L #99, D0
ADD.B (A0), D1
ADD.B #1, D0
BEQ Done
ADDA.L #99,A0
BRA loop

1 个答案:

答案 0 :(得分:1)

此代码中存在很多问题,包括(但不限于):

  • 您使用'循环'和'完成',但代码中未显示标签
  • 你在D1中添加了100个字节,也是一个字节,所以你肯定会在结果上溢出(总和的目标至少应该是16位,所以.w或.l寻址)
  • 我可能错了,但我认为'小对角线'从左下角到右上角,而你的代码从数组的左上角到右下角

在表现方面:

  • 您应该使用68000指令集的“快速”变体
  • JasonD提到的递减和分支比add / beq
  • 更有效

考虑到代码与解决方案足够接近,这里有一个变体(我没有测试,希望它有效)

    lea A+99*100,a0     ; Points to the first column of the last row
    moveq #0,d0         ; Start with Sum=0
    moveq #100-1,d1     ; 100 iterations
Loop    
    moveq #0,d2         ; Clear register long
    move.b (a0),d2      ; Read the byte
    add.l d2,d0         ; Long add
    lea -99(a0),a0      ; Move one row up and one column right
    dbra d1,Loop        ; Decrement d1 and branch to Loop until d1 gets negative
Done
    ; d0 now contains the sum