レジスタを入力用にも使うために指定している。全体のプログラムは、次のようになる。拡張インラインアセンブリで"f"や"t"を使う方が簡単に書ける。mypage]$倍精度の掛け算を行うCの関数として書くならば、次のようになる。前者は"=&t"と"0"で入出力用レジスタとして指定し、%0で表される。して保持され、返値になる。最後にやや長めの例を示す。深く考えずに指定している。コマンドラインから読み込んで2進数で出力するプログラムである。本当はCのみで書く方が簡単なので、その例も続きに示す。入力オペランドとして同じものを"0"を用いて指定する。bsr命令はdestがレジスタである必要があるので"=g"は避ける。%eaxを自動的に退避してもらう。●実際はマクロで以下のように書いた方が楽である。入力オペランドとして同じものを"0"を用いて指定する。mypage]$比較の為、標準のC言語で書くと以下のようになる。mypage]$■20:※Linuxのwriteシステムコール■これまでは出力にprintfやputsを利用してきたが、asm文中でシステムコールの書き出し命令を使うこともできる。OSに依存するので、各レジスタにどのような値を入れてソフトウェア割り込みをしたら良いのかは、各OSの解説書やアセンブリに関する書籍を参照されたし。DOSのシステムコールについては1980年代の書籍や雑誌に良く解説がされていた。幸いにして、Linuxのシステムコールについては、ローカルファイル/usr/include/linux/syscall.h/usr/src/linux/arch/i386/kernel/entry.S/usr/include/linux/linkage.hを読むと分かることが多い。詳しい情報はやはり参考文献[0]を参照されたし。2:stderrという対応である。Linux専用のコード※プロセッサに依存する上にOSにも依存するのである。文字だけstdoutに書く関数。%eaxに4、%ebxに1、%ecxに文字列のアドレス、%edxに出力したい文字の個数を入れ、割り込みするだけ。(result)によりアセンブリコード実行後の%eaxレジスタの内容をresultとして出力する。"d"を使っているので%eax,%ecx,%edxは塞がっており、これらをさらに退避しようとするとコンパイルできない。1命令で複数データを処理する命令)が使える。Now!のレジスタ、命令はごく普通にasm()文で記述して使用できる。■21:SIMDのサポートチェック■まず、手持ちのCPUでどのようなSIMD命令セットがサポートされているかチェックしてみよう。以下のプログラムは、CPUID命令を使った標準的なチェック方法である。用い、%eax,%ebx,%ecx,%edxを自動退避している。i;}/*CPUID命令の有無を返す。以下のコードはAMDのマニュアル通り。[9]EFLAGSレジスタの21番ビットが書き込み可能か否かで判別する。v;}/*CPUID拡張関数の最大入力値が0x80000000より大きいか否かを調べる。詳しくは参考文献[7,8,9]を参照。mypage]$妥当な結果である。8つの64-bitレジスタが利用できる。ように%%付きで書く。)MMXレジスタは、64-bitを分割して以下のようなデータ型を扱える。命令によってプロセッサを浮動小数点状態に戻す必要がある。いった命令が用意されている。words同士の引き算の例である。%mm0,%mm1に移動する。Now!では、MMXレジスタを利用して単精度浮動小数点(float)のデータを二つ同時に演算可能である。命令によってプロセッサを浮動小数点状態に戻せる。Now!を使った高速で低精度の割り算の例である。低精度推定値を計算する。