2012年6月8日金曜日

Gas の .align ディレクティブ

GNU Assembler の .align ディレクティブについて。

例えば、4バイトアラインするときに
.align 2 と書いている人と .align 4 と書いてる人がいて、どっちが正しいんだ?と思ったので調べてみた。

The GNU Assembler のドキュメントを参照すると、、、

The way the required alignment is specified varies from system to system.
For the a29k, hppa, m68k, m88k, w65, sparc, Xtensa, and Renesas / SuperH SH, and i386 using ELF format, the first expression is the alignment request in bytes.
For example .align 8 advances the location counter until it is a multiple of 8.
If the location counter is already a multiple of 8, no change is needed.

For other systems, including the i386 using a.out format, and the arm and strongarm, it is the number of low-order zero bits the location counter must have after advancement.
For example .align 3 advances the location counter until it a multiple of 8.
If the location counter is already a multiple of 8, no change is needed.

なんだそうだ。

例えば i386 (ELF) は
.align 2 → 2バイトアライン
.align 4 → 4バイトアライン
.align 8 → 8バイトアライン

となるのに対し、

ARMは
.align 1 → 2バイトアライン
.align 2 → 4バイトアライン
.align 3 → 8バイトアライン
となるらしい。

こりゃ気をつけな間違えるな~。

というわけで、
.balign を使えば、システムに依存せずに、

.balign 2 → 2バイトアライン
.balign 4 → 4バイトアライン
.balign 8 → 8バイトアライン

となるみたいだ。

0 件のコメント:

コメントを投稿