2

これはこれに対するフォローアップの質問です__AVR_HAVE_LPMX__を使用してプロセッサ(avr25)のコードを書いています

  • GNU C (WinAVR 20100110) バージョン 4.3.3 (avr) / GNU C バージョン 3.4.5 (mingw-vista special r3)、GMP バージョン 4.2.3、MPFR バージョン 2.4.1 でコンパイル。

lpm rd, Zインライン アセンブリで使用すると、コンパイラは常にこれを次のように変換しlpm rd,Z+ます (lss ファイルからの抜粋):

asm volatile("lpm r24,Z");
248:    84 91           lpm r24, Z+

ルックアップテーブルへの連続アクセスで使用される場合、これは悪いことです。ルックアップ値は である可能性が0xffあるため、これは不必要にZH( ) を増やし、このソリューションr31を破損させます。

この動作を回避するための提案はありますか?

4

1 に答える 1

1

ソリューションに問題はありません。逆アセンブラ (パッケージavr-objdump -dの一部) にバグがあります。binutils

Atmel AVR 命令セット マニュアル(PDF)の 97 ページを参照してください。lpm命令バリアントは次のようにエンコードされます。

1001 0101 1100 1000 = 0x95C8   lpm r0,Z
1001 000? ???? 0100 = 0x9??4   lpm r?,Z
1001 000? ???? 0101 = 0x9??5   lpm r?,Z+

逆アセンブラよりも Atmel のドキュメントの方が信頼できると仮定すると、

84 91    lpm r24,Z

一方

85 91    lpm r24,Z+

実際、avr-gcc (GCC) 4.8.2 は、 を使用してインライン アセンブリを同じ 2 バイト ( 84 91)にコンパイルし、アセンブリ ソース ファイルのavr-gcc-4.8.2 -O2 -fomit-frame-pointer -mmcu=avr25ようにリストします (オプションを使用)。オブジェクト ファイルにコンパイルし、avr-objdump (GNU binutils) 2.23.1 を使用して逆アセンブルすると、命令はまだ.lpm r24,Z-Savr-objdump -d84 91 lpm r24,Z

これは、avr-objdump (GNU binutils の一部) のバグだと思います。ああ、ここで報告され、 2013 年 10 月に binutils-2.23.1 で修正されたようです。

つまり、分解のみが影響を受けます。逆アセンブリはZ+、表示すべきときに誤って表示しZます。生成されたコードには影響しません。人間が判読できる出力が正しくないだけです。修正するには、binutils バージョン 2.23.1 以降にアップグレードしてください。それができない場合でも、心配する必要はありません。このエラーは人間が読める逆アセンブリにのみ影響するため、無視しても問題ありません。

質問?

于 2014-09-08T18:18:59.570 に答える