インラインアセンブラに関するメモ
インラインアセンブラに関するメモです。
こういうリファレンス系はgithub pagesを使って書こうと思っていたのですが、markdownのプレビューをする環境を構築するのが面倒そうだったので、 今後はこっちで書こうと思います。
基本的な構文
基本的な構文は以下のようになる。 出力オペランド、入力オペランド、破壊されるレジスタのリストは省略可。
__asm__ ( "アセンブリテンプレート" : 出力オペランド : 入力オペランド : 破壊されるレジスタのリスト );
オペランド
オペランドを指定することで、C言語上の変数や値をアセンブリテンプレート内で命令のオペランドとして使用できる。 オペランドは指定した順番にアセンブリテンプレート内で%0 %1 ... として指定できる。
オペランドのフォーマットは以下の通り。(複数ある場合はこのフォーマットがカンマ区切りで続く。)
"制約修飾子とオペランド制約" (C言語上の値)
オペランド制約はその値にどの変数を割り当てるかを示す。 表1によく使いそうなオペランド制約を示す。
制約修飾子は、そのオペランドがどのように参照されるかを示す。 表2に制約修飾子のリストを示す。
表1 よく使いそうなオペランド制約
オペランド制約 | 意味 |
---|---|
r | 自動で割り当てる。 |
a | eaxを割り当てる。 |
b | ebxを割り当てる。 |
c | ecxを割り当てる。 |
d | edxを割り当てる。 |
S | esiを割り当てる。 |
D | ediを割り当てる。 |
m | 直接メモリを割り当てる。 |
表2 制約修飾子の一覧
制約修飾子 | 意味 |
---|---|
= | 書き込み専用 |
+ | 読み書き可能 |
& | 入力オペランドを使い切る前に変更されるオペランド |
破壊されるレジスタのリスト
破壊されるレジスタのリストには、アセンブリテンプレート中で変更されるオペランド以外のレジスタやメモリー領域を指定する。 ここに指定するものの一覧を表3に示す。
表3 破壊されるレジスタのリストで指定できるもの
指定するもの | 意味 |
---|---|
%eaxなどのレジスタ | そのレジスタが破壊される。 |
cc | フラグレジスタが破壊される。 |
memory | 予測不可能なメモリー破壊(これを指定する場合はvolatile推奨) |