

プロセッサを調べるプログラムをコンパイルしたところ、
以下のような
static inline void cpuid (int op, int *eax, int *ebx, int *ecx, int *edx) {
asm("cpuid": "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx);
: "a" (op) : "cc");
}
ところで
error C2054: 'inline' の後にはカッコが必要です。
error C2085: 'cpuid' : 仮引数リスト内にありません。
error C2143: 構文エラー : ';' が '{' の前に必要です。
というエラーが出てきました。
何か間違っているところがあれば教えてください。
お願いします。
No.2ベストアンサー
- 回答日時:
もし、おつかいのコンパイラがVCなら、inline、asm は、C言語では使えません。
代わりに、__inline、__asm を使います。
さらに、インラインアセンブラの構文が、VCのインラインアセンブラではありません。
質問にあるコードは、GCCのインラインアセンブラの構文です。
この回答への補足
回答ありがとうございます。
勉強になります。
それで実行した結果、質問のエラーは消えたのですが、構文エラーが出てきました。
VCのインラインアセンブラはどう書いたらいいのでしょうか?
わがまま言ってすいません。
No.3
- 回答日時:
#1の方の指摘どおり、asmの行の最後、(*edx)の直後のセミコロンを取り除けば、i686ターゲットのGCCならコンパイルできました。
エラーメッセージを見る限り、Visual C++のようです。Visual C++はC99に対応していませんので、inlineは使えませんし、インラインアセンブラの書式も異なります(#2の方の指摘どおり)。
この回答への補足
回答ありがとうございます。
指摘の通りに直したところ関数の表示になりました。
それで以下
static __inline void cpuid (int op, int *eax, int *ebx, int *ecx, int *edx) {
__asm "cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "a" (op) : "cc" ;
}
で再度実行したところ
error C2400: 'オペコード' の 'bad token' はインライン アセンブラの構文エラーになります。
とやはりエラーがでました。
VCの場合のインライン アセンブラの構文とはどんなものなんでしょうか?もしよろしければ教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- PHP php エラー 2 2022/10/23 16:43
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
visualstudio C# テキストボッ...
-
2重定義って??
-
DWORDの実際の型は何でしょうか
-
typedef enumの使い方を教えて...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
C++でboolにintの値を代入する...
-
直接アドレス指定のポインタの...
-
C言語の課題について
-
long型の定数の末尾にLを付ける...
-
DLLでLIBファイルが作成されない
-
変数の型を定義しなかった場合...
-
LNK2019: 未解決の外部シンボル...
-
C言語のコンパイルエラー
-
呼び出し時のパラメータが足りない
-
テンプレート関数でコンパイル...
-
ハンドルされていない例外が発...
-
C++のfor文について
-
enumについて
-
プログラムの中で別のmainを呼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
C++でboolにintの値を代入する...
-
2重定義って??
-
main.c:7:43: warning: implici...
-
typedef enumの使い方を教えて...
-
プログラムの中で別のmainを呼...
-
変数の型を定義しなかった場合...
-
関数の実体定義にヘッダファイ...
-
ハンドルされていない例外が発...
-
構造体の要素すべてに対する四...
-
C言語のコンパイルエラー
-
DLLでLIBファイルが作成されない
-
sshdログの意味
-
DLLのLPSTR 項目の戻り値の取得...
-
enumについて
-
VC6でlong longでエラー?
-
【#define】 defineで定義した...
おすすめ情報