//#!gcc -O0
#include <stdio.h>
int main (int argc, char *argv[]) {
int a;
int b;
a = 0; b = 3;
asm volatile (
"mov r0, %[x];"
"mov %[x], %[y];"
"mov %[y], r0;"
: [x] "+r" (a), [y] "+r" (b)
:
: "r0"
);
printf("a=%d, b=%d\n", a, b);
return 0;
}
asm でやる必要は全然ないけど inline asm の文法が意味不明なのでちょっと書いてみた。
asm( code : output list : input list : clobber list)
という文法らしいけど、パっと見さっぱりわからない。上記の例(値の交換)だと
- a と b どちらも読み書きが必要なので、output リストのほうで + (read/write) をつける。r はレジスタの意味らしい。
- operand の指定は名前で行っている。角括弧を使うと名前で指定できるみたい
- input list は空 (output list で read/write を指定しているので input として指定する必要はない)
- clobber list というで、このコードによって上書きされるレジスタを指定する
- これを指定しないと、意図せず他の変数のレジスタを破壊してしまったりする (GCC はどのレジスタが破壊されるかがわからないから、破壊されるレジスタに変数を割り当ててしまう)
- 指定することで、GCC はそのレジスタを一旦退避させたりできる
このページが比較的わかりやすい。