• 締切済み

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

コンパイラはgccで、コンパイルオプションでintel形式でコンパイルしています。 shl命令で左シフトしたいのですが、初期値0xfffffffなのに実行結果は0xffdf0000になってしまいます。 コード: asm(" shl %0, 4 " : "=r" (val)) #defineでマクロにしています(valは引数です)。 どうすれば結果が0xfffffff0になりますか。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.2

%0は出力でもあり入力でもあるので。 サイトの方はすいませんがわかりません。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.1

asm("shl %0,4": "=r"(val): "0"(val)) じゃないかなぁ。

cyo_k08
質問者

補足

ありがとうございます。うまくいきました。 しかしなぜマッチング制約を利用するのかわかりません。 できれば説明をお願いします。もしくはサイトだけでもお願いします。

関連するQ&A

  • GCCで関数の引数が渡らない

    gcc Ver2.9 でSH-2の開発をしています。 通常に関数を作成し、引数を渡しているのですが、引数が渡らないという現象が起きています。 現象は、 1.引数はポインタではなく値渡しである 2.引数の値が0の時だけ正しく渡らない。値が0以外の時は正常にわたる 3.引数の型は一致している 4.引数は複数あるが、後半のいくつかがだめ(何個とまでは詳しく調べていません) 5.ある特定の関数の特定の呼び出しのみがだめで全てだめというわけではない 6.コンパイルオプションに -m2 をつけるとだめだが、-m1 オプションだと問題ない 7.最適化オプションをなくしても同じだった といった状況です。 上記5からある特定の記述方法とか順序になるとだめになるのではないかといろいろ試してみたのですが見つけられません。6から記述方法に誤りがあるとも考えにくい状況です。コンパイラのバグといって片付けていいものなのかどうかです。どなたか同じような経験をされた方はいらっしゃいませんか。また関数呼び出しの場合、コンパイラがどうやって引数を渡すかご教授願えませんか。

  • 構造体サイズをコンパイル時に出力させられるか(gcc)?

    gccでソースの改造でメモリ節約のため構造体サイズの圧縮を行っているのですが、 構造体定義が#defineマクロの塊になってしまっているのでサイズの見当がつかなくて 困っています。 sizeofの値をコンパイル時のエラーメッセージ出力などを使って出力できれば、 実装してターゲットでprintf()を動かさなくてもいいので助かるのですが、プリ プロセス命令の組み合わせとかでどうにかならないでしょうか?

  • LinaxのCコンパイラ gcc の内部構造を教えて下さい

    今、コンパイラの仕組みについて勉強しています。 gccの仕組みについていろいろ調べているのですが なかなか資料が見当たりません。そこで是非これ に関して情報をお持ちのかたは御提供下さい。ど のような情報でも構いませんができれば次の情報 についてをお願いします。 1)gcc の構文解析の仕組み 2)最適化オプション -O2 を用いた時と通常のコンパイル時との構文解析の違い 3)ターゲットプロセッサ(CPU)に依存した構文解析の動作

  • [GNUインラインアセンブラ] SIMD命令

    下記のようなGNUインラインアセンブラを含むプログラムをMac Book Airにてgccでコンパイルして実行するとPSUBSW命令は、mm0 - mm1の結果がmm0に入りますが、IntelのDevelopper's manualのPSUBSW命令の説明においては、mm1-mm0の結果がmm1に入るとなっています。 これは、なぜなのでしょうか。 ---- Begin source code ----- 1 #include <stdio.h> 2 3 int 4 main() 5 { 6 short int a[4] = {1111,1112,1113,1114}; 7 short int b[4] = {1111,2112,3113,4114}; 8 short int c[4]; 9 10 asm volatile ( 11 "movq (%1),%%mm0\n\t" 12 "movq (%2),%%mm1\n\t" 13 "psubsw %%mm1,%%mm0\n\t" 14 "movq %%mm0,%0\n\t" 15 "emms" 16 : "=g"(c): "r"(&a),"r"(&b)); 17 18 printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]); 19 20 return 0; 21 } ---- End source code ----- Intel developper's manual (http://www.intel.co.jp/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf) PSUBSW mm, mm/m64 Subtract signed packed words in mm/m64 from signed packed words in mm and saturate results.

  • __asm int 3でのブレイクポイントについて

    こんにちは。 質問させてください。 先ほど海外の方が制作したC/C++のコードを読んでいたところ __asm int 3 というコードを見つけました。 少し調べてみたところ0xccというコードを埋め込んでブレイクさせる命令ということはわかりました。 しかし使用用途がいまいちわかりません。 実際には下記のように実装されていました。 #ifdef _DEBUG #define BreakIf( c )  if( c ){ __asm int 3 } #else #define BreakIf( c ) #endif しかし、いろいろと考えてみたのですがassertとどう使い分ければいいのかよくわかりません。 assertの場合は引数が0の場合引っかかりますが、上記のBreakIfコードは非0の場合に引っかかるよ うに実装されていました。 この__asm int 3命令は主にどのような場面で使用すべきなのでしょうか? ご教授のほど、よろしくお願いします。 /* Microsoft VisualStudio2008 academic edition Intel Core i7 920 2.66Ghz RAM:12GB Windows7 64bit professional */

  • GCCの#includeパスの設定方法?

    RedHat Linux 8.0をインストールしています。adaptec社のAHA1542を使いたいのですが、自動認識してくれません。 色々調べた結果、/etc/modules.confに alias scsi_hostadapter aha1542.o を記述する事で、使用可能と言う事がわかりました。 しかし私のシステムでは、aha1542のソースとヘッダーファイルはありますが、オブジェクトがありません。 GCCにてコンパイルさせたら、大量のエラーメッセージが出力されます。ソースを見ると、 1) #include <linux/******.h> 2) #include <asm/*****.h> 3) #include "*****.h" と3種類の#include文があります。 3)は、ソースと同一ディレクトリーでOKだと思いますが、他の2種類のパスの設定方法がわかりません。 <linux/ <asm/ の部分を自分のシステムに合ったパスに置き換える(GCCに認識させる)には、どうすれば良いのでしょうか? どうか、宜しくお願い致します!

  • gcc -c -Wconversionでwarningが消えません

    gcc version 2.96 20000731 (Red Hat Linux 7.0) でコンパイルオプション -c -Wconversionでwarningが消えません。 warning: passing arg 1 of `関数名' with different width due to prototype とwarningが出るのですが、プロトタイプ宣言の引数の型にちゃんとキャストして渡しているのですが…ちなみにプロトタイプ宣言の引数自体がint型とポインタだとwarningは出ません。-Wconversionとはいったい何者なのでしょうか? すべての関数の引数の型をint型とポインタに変更すればwarningは消せるのですが、なんか違う気がします。 かなり漠然的な質問で申し訳ありませんがどなたか知っていれば教えてください。宜しくお願い致します。

  • libecc

    楕円曲線暗号のソースコードをダウンロードしました。 libecc の中のファイルに #define LibEccDebug(STATEMENT...) LibcwDebug(libecc::debug::channels, STATEMENT) との記述があります。 たぶん、gccをつかえば コンパイルできると思うのですが、 CV++2005でコンパイルしたいのです。 ...が問題なので #define LibEccDebug(STATEMENT) LibcwDebug(libecc::debug::channels, STATEMENT) と変えてしまって差し支えないでしょうか? また、 #define LibEccDebug(STATEMENT...) の...は、 他にも引数があるよ という意味に理解してかまわないのでしょうか? よろしくお願いします。

  • コンパイル時のスイッチについて

    C言語初心者なので申し訳ありませんが,コンパイル時のスイッチについて困っております. 現在, #define tmp ... #ifdef tmp  関数1 #else  関数2 #endif とtmpを定義して切り替えようとしております. 現在コンパイルの切替は,毎回 //#define tmp とコメントアウトして切り替えているのですが, gcc等のコンパイラのコマンドラインから 切り替える方法はあるのでしょうか. 色々調べたら, cc -D tmp みたいな?感じにするのかと思ったのですがうまくいきません. 初歩の質問ですがご教授よろしくお願いします.

  • IEEE754と浮動小数点定数同士の演算について

    ■質問 浮動小数点の標準規格IEEE754に、浮動小数点定数同士の演算に関する規定はありますか? ■背景 とあるマイコンで組込みソフト開発をしています。 このマイコン用のコンパイラ(IEEEに準拠)で以下のCソースコードをコンパイルしたところ、コンパイラのバージョン1とバージョン2で演算結果が異なりました。 double d_val = 6.6f * 10.0f; ○コンパイルバージョン1でコンパイルしたソフトの演算結果 →d_valには66.0が代入されました。 ○コンパイルバージョン2でコンパイルしたソフトの演算結果 →d_valには65.999999…(詳細は失念)が代入されました。 コンパイラメーカーに問い合わせたところ、「バージョン1から2へのアップグレードにおいて、浮動小数点定数演算に関連する変更を行ったが、その影響は浮動小数点演算における誤差の範囲内である」との回答でした。 誤差の範囲内であるとはいえ、コンパイラのバージョン違いで演算結果が異なるのは困るので、これがIEEE754規格違反なのであれば、それを根拠にコンパイラメーカーへ対応を求められるのではないかと考えています。 しかし、浮動小数点定数同士の演算結果の正確性についての規定がないのであれば、開発側で対応するしかありません。 いろいろと調べてはいるのですが、これといった情報に行き当たっていないので、こちらで質問させていただきます。どうぞよろしくお願いいたします。

専門家に質問してみよう