1

以下のコードフラグメントが各レジスタに何をロードするかを理解するのに問題があります。コードが実行された後、各レジスタは何を保存しますか?

ldi r20, low(-1)
ldi r21, high(-1)
ldi r17, low(0x600)
ldi r18, high(0x600)

編集:私のマークダウンを修正しました、それについて申し訳ありません。

4

1 に答える 1

2

さて、これはAVRアセンブリであり、8ビットレジスタ(レジスタ名で判断すると、Atmega32など)を想定しているためです。

まず、AVRアセンブリでlow()とhigh()が何をするかを見てみましょう。この情報源によると、個人的な経験から、16ビットの数値でのみ機能し、上位バイトまたは下位バイトのいずれかを提供し、左側が最上位ビット(MSB)になります。

-1を16ビット数として=0b1111111111111111または0xFFFF(両方とも等しい)。負の数は2の補数を使用して計算されるため、それぞれのlow()とhigh()を取得すると次のようになります。

ldi r20, low(0b1111111111111111)
ldi r21, high(0xFFFF)

r20とr21は両方とも0b11111111の値、または10進表記で-1を保持します

その他の0x600については、簡単にするために、最初に完全な16ビットの数値として表示しましょう。0x600 == 0x0600(実際には何も追加していないため、MSBスポットに0をスローするだけです)

high(0x0600)を取ると、上位2つの数値、つまり上位バイト、つまり0x06が得られます。
low(0x0600)を取ると、下の2つの数値、つまり下位バイト、つまり0x00が得られます。

于 2012-11-07T00:47:54.903 に答える