0

100x100A整数数组,每个一个字节,位于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
4

1 回答 1

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
于 2013-05-06T11:23:28.223 回答