Arrays EASy68K组装中的二维数组求和
100x100整数数组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个字节,也作为一个
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