Arrays EASy68K组装中的二维数组求和

Arrays EASy68K组装中的二维数组求和,arrays,assembly,68000,Arrays,Assembly,68000,100x100整数数组A,每个整数一个字节,位于A。编写一个程序段来计算小对角线的和,即 总和=∑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 这段代码中有很多问题,包括(但不限于): 使用“循环”和“完成”,但代码中不显示标签 您将在D1中添加100个字节,也作为一个

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

总和=∑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

这段代码中有很多问题,包括(但不限于):

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

  • 您应该使用68000指令集的“快速”变体
  • JasonD提到的减量和分支比add/beq更有效
考虑到代码与解决方案的距离足够近,这里有一个变体(我没有测试,希望它能工作)


欢迎来到StackOverflow!看起来你并不是在问问题。你具体在问什么?我目前无法测试代码,所以我想知道我写的代码看起来是否正确。你是说
99-I
(九十九减一眼),而不是
99-1
(九十九减一),对吗?这是什么CPU?正确…很抱歉。您正在递增
D0
,而它可能应该递减。我会考虑将分支移除为<代码> do/<代码>,并使用<代码> dBLA< /Cord>构造循环。
    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