Tomitomi's blog

勉強したこと、やってみたことなどを書き連ねていく場

インラインアセンブラに関するメモ

インラインアセンブラに関するメモです。

こういうリファレンス系は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推奨)

参考