プロセッサを調べるプログラムをコンパイルしたところ、
以下のような
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# テキストボッ...
-
DWORDの実際の型は何でしょうか
-
ハンドルされていない例外が発...
-
構造体の要素すべてに対する四...
-
int void (main)の意味・・・
-
#define _CRT_SECURE_NO_WARNIN...
-
【C++】関数ポインタの使い方
-
プログラミングで二番目に大き...
-
プログラムでの数字につく”f”の...
-
3のつく数と3の倍数を表示 C言語
-
std::set<int> で、ある値が何...
-
Enterキーを押されたら次の処理...
-
「Aに対するBの割合」と「Aに対...
-
課題;素因数分解
-
2進数の1の数を数える問題
-
C言語 配列と関数の練習問題
-
信頼区間の1.96や1.65ってどこ...
-
大きな負の値?負の大きな値???
-
Linuxで入力待ちなしkeyread関...
-
数学についてです! (1)3√5-2...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
関数の実体定義にヘッダファイ...
-
構造体の要素すべてに対する四...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
void func( void )について
-
C言語 宣言した変数になにも代...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
C言語での方向キー入力判定
-
プログラムの中で別のmainを呼...
-
C言語について質問です。 子プ...
おすすめ情報