alignの罠

あ…ありのまま 今 起こった事を話すぜ!
『データのアライメントをしようと思ったら
いつのまにかメモリを大量消費していた』
コンパイルミスだとかリンカのバグだとか
そんなチャチなもんじゃあ 断じてねえ
もっと恐ろしいものの片鱗を味わったぜ…


あるデータ列の先頭アドレスを8の倍数にしたかったため、ソースコードに次のように書きました。

.align 8
FOO: .byte 0x01, 0x02, 0x03, 0x04

その後makeしてみたら、なんとROM使用量とRAM使用量が250byte近く増加していました!!アライメントのためのパッディングでメモリーが無駄遣いされたにしては多すぎます。8の倍数へのアライメントなら高々7byteの無駄遣いで済むはずです。

気になってasのドキュメントを参照してみると…こんなものが見つかりました。

仕様を確認した後、AVRはother systemsに属するので
.align 3
と直して一件落着しました。

それにしても面倒くさい仕様ですねぇ。balignやp2alignを使えばアーキテクチャによる違いがなくなるそうです。

ところで、8ビットマイコンであるAVRを使っているのに8バイト境界にアライメントするのは不思議に感じます。その理由は次回に説明します。

by Shiozaki

alignの罠」への1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です