gccのインラインアセンブラ

linux2.6.34のswitch_to()を見てたら、インラインアセンブラで見慣れない記述があったので、ちょっと確認してみた。

test1()は通常通りに0番目、1番目って感じで変数を使ってるパターンで、test2()は名前を付けてアクセスする方法。こんなやり方って前からあったっけ? まぁ、名前をつけれる方が分かりやすくて良いのですが。

#include <iostream>

using namespace std;

void test1(int src)
{
        int dest = 0;

        __asm__ __volatile__("mov %0, %1;\n\t"
                             :"=r"(dest)
                             :"r"(src)
                );

        cout << "dest is " << dest << " : src is << " << src << endl;
}

void test2(int src)
{
        int dest = 0;

        __asm__ __volatile__("mov %[output], %[input];\n\t"
                             : [output] "=r"(dest)
                             : [input] "r"(src)
                );

        cout << "dest is " << dest << " : src is << " << src << endl;

}

int main(int argc, char **argv)
{
        test1(10);
        test2(10);

        return 0;
}

実行結果はこんな感じ。

[masami@moon]~% ./a.out
./a.out
dest is 10 : src is << 10
dest is 10 : src is << 10