1

私の先生は私たちに組み立ての基本的な理解をしてもらいたいと思っています。なぜなら、後でそれが役立つかもしれないからです。私はそれで大丈夫ですが、私の大学は、4つの小さな例を除いて、この主題に関するドキュメントを提供していません。私はこれで何が起こっているのかを理解しようとしています:

.DEVICE ATmega32

.CSEG
main:

ldi    ZL,low(varclist<<1)
ldi    ZH,high(varclist<<1)

.CSEG
varclist:
.db    1, 2
.db    3, 4
.db    5, 6
.db    7, 8
.db    9, 0

私はAVRスタジオ5で働いており、「プロセッサー」タブを見ています。'varclist'の値と、レジスターが表示している16進値との間に関係が見つからないようです。これをどのように見るのですか?

「最上位」ビットが最初に宣言され、最下位ビットが最後に宣言されたと想像するので、Zレジスタには0x0100が含まれていると思います。ただし、0x0070が表示されています。しかし、シフトが何をするのかはわかりません。

4

1 に答える 1

2

シフトについての疑問に答えるために、それが行うことは、最初のビットとしてゼロを追加して、すべてのビットを左に1つシフトすることです。言い換えると、変数の高い(または低い)値を2倍しますvarclist

varclistここであなたのプログラムには、メモリ内のバイト配列[0x01、0x02、...0x00]のアドレスがあります=>varclistはこの配列の最初のバイトへのポインタです。元のアドレスを取得するには、2で除算するだけで(乗算の逆演算)、次のようになります。

0x0070 >> 1 = 0000 0000 0111 0000 >> 1 = 0000 0000 0011 1000 = 0x0038

したがって、varclistアドレスはでした0x0038。これが0x0100だとどう思ったかはわかりませんが、コードを理解していただければ幸いです。

プログラムストレージスペースへのアドレスはワードオフセットで表されるため、このアドレスは2倍されると思います。この場合、バイトオフセットでアドレスを取得するには、2を掛ける必要があります。後で、アセンブリ命令r0のおかげで、そのバイト(配列の最初のバイト)をロードできます。LPM

このPDFの5.2章、そしておそらく他の章も読むことをお勧めします。AVRアセンブラーユーザーガイドもおそらく良い賭けです。

于 2012-01-17T22:10:50.397 に答える