0

整数の100x100 配列A(それぞれ 1 バイト) は にあり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 バイトを 1 バイトとして追加しているため、確実に結果がオーバーフローします (合計のターゲットは少なくとも 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 に答える