DesignAssembler

備忘録に近い

インラインアセンブリ基礎の基礎

こんにちは。

簡単なインラインアセンブリのコードを書きます。

入力された値nまでの和sを求めます。

#include<stdio.h>
int main(void){
  int n;
  int s;
  printf("put a number:");
  scanf("%d",&n);
  __asm__ volatile(
        "       movl    %1,%%eax           ;"
        "       movl    %1,%%ebx           ;"
        "L:     decl    %%ebx              ;"
        "       addl    %%ebx,%%eax        ;"
        "       cmpl    $0,%%ebx           ;"
        "       ja      L                  ;"
        "       movl    %%eax,%0           ;"
        :"=r"(s)
        :"r"(n));
  printf("sum = %d\n",s);
  return 0;
}

実行環境はMacOSXgccコンパイラです。

コンパイル、実行はターミナルで

$ gcc -o <出力ファイル名> <入力ファイル名>
$ ./<出力ファイル名>

で大丈夫です。

このインラインアセンブリは拡張インラインアセンブリというもので、Cのコード内で宣言した変数に簡単にアクセスできる仕様になっています。非拡張インラインアセンブリではアドレッシングで変数の領域を指定してやらねばなりません。

あと、アセンブリにはループなぞという甘ったれた構文もないのでジャンプ命令(Cで言うとgoto)を使います。

このコードが何のためになるかと言われたらもう無いとしか答えられませんが、ただ、アセンブリはパズルみたいで楽しいです。

最近アセンブラ関連の書籍をチラホラ見るようになっていて若干のブームを感じています。

熱血!アセンブラ入門

熱血!アセンブラ入門



Raspberry PiもあるのでARMアセンブラをやってみたいと思ってます。

次はシステムコールあたりを書きたいと思います。