本文目錄一覽:
- 1、如何用C語言編寫探測cpu的程序
- 2、double是什麼意思
- 3、C語言malloc函數 segment error如何解決?
- 4、c語言編程:編寫一個函數,統計出一行字符中英文字母的個數,在主函數輸入字符串,調用該函數後輸出結果
- 5、linux系統問題 高手進
- 6、[Linux]編寫一個簡單的C語言程序,編寫Makefile文件。
如何用C語言編寫探測cpu的程序
參考下面的文章:
利用利用CPUID 彙編指令(機器碼:0FH A2H, 如果你的編譯器不支持CPUID 指令,只有emit 機器碼了), 該指令可以被如下CPU識別:
Intel 486 以上的CPU,
Cyrix M1 以上的CPU,
AMD Am486 以上的CPU
(1) 取CPU OEM 字符串, 判斷CPU 廠商
先讓EAX=0, 再調用CPUID
Inel的CPU將返回:
EBX:756E6547H ‘Genu’
EDX:49656E69H ‘ineI’
ECX:6C65746EH ‘ntel’
EBX,EDX,ECX 將連成”GenuineIntel”, 真正的Intel。
Cyrix 的CPU 將返回:
EBX:43797269H
EDX:78496E73H
ECX:74656164H
“CyrixInstead”,”Cyrix 來代替”。
AMD 的CPU 將返回:
EBX:41757468H
EDX:656E7469H
ECX:63414D44H
“AuthenticAMD”, 可信的AMD。
在Windows98中,用右鍵單擊”我的電腦”,選擇” 屬性- 常規”在計算機描述 處就可看見CPU OEM 字符串。
(2)CPU 到底是幾86, 是否支持MMX
先讓EAX=1,再調用CPUID
EAX的8到11位就表明是幾86
3 – 386
4 – i486
5 – Pentium
6 – Pentium Pro Pentium II
2 – Dual Processors
EDX 的第0位:有無FPU
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57條新增的指 令,先檢查這一位吧,否則就等着看Windows 的”該程序執行了非法指令,將被關 閉” 吧。
(3) 專門檢測是否P6架構
先讓EAX=1,再調用CPUID
如果AL=1,就是Pentium Pro 或Pentium II
(4) 專門檢測AMD的CPU信息
先讓EAX=80000001H,再調用CPUID
如果EAX=51H, 是AMD K5
如 果EAX=66H, 是K6
EDX第0 位: 是否有FPU( 多餘的 !誰用過沒FPU的K5,K6?)
EDX 第23 位,CPU是否支持MMX,
程序如下:
//——CPUID Instruction Demo Program————
#include
#include
#pragma hdrstop
//————————————————
#pragma inline
#pragma argsused
int main(int argc, char **argv)
{
char OEMString[13];
int iEAXValue,iEBXValue,iECXValue,iEDXValue;
_asm {
mov eax,0
cpuid
mov DWORD PTR OEMString,ebx
mov DWORD PTR OEMString+4,edx
mov DWORD PTR OEMString+8,ecx
mov BYTE PTR OEMString+12,0
}
cout “This CPU ‘s OEM String is:” OEMString endl;
_asm {
mov eax,1
cpuid
mov iEAXValue,eax
mov iEBXValue,ebx
mov iECXValue,ecx
mov iEDXValue,edx
}
if(iEDXValue0x800000)
cout “This is MMX CPU” endl;
else
cout “None MMX Support.” endl;
int iCPUFamily=(0xf00 iEAXValue) 8;
cout “CPU Family is:” iCPUFamily endl;
_asm{
mov eax,2
CPUID
}
if(_AL==1)
cout “Pentium Pro or Pentium II Found”;
getch();
return 0;
}
最後,最好學會自己去搜索你需要的信息,
我上面的答案也是搜索來的。
關鍵字“C語言 CPU 信息”
double是什麼意思
double意思為一對,一雙;雙重地;酷似的人;把…對摺;變成兩倍;增加一倍。
double可作形容詞、副詞、動詞用。
double(雙精度浮點型)是計算機使用的一種資料型別。
比起單精度浮點數(float),double(雙精度浮點數)使用64位(8字節)來儲存一個浮點數。它可以表示十進制的15或16位有效數字,負值取值範圍為-1.7976E+308到-4.94065645841246544E-324,正值取值範圍為4.94065645841246544E-324到1.797693E+308一站式出國留學攻略
C語言malloc函數 segment error如何解決?
1
main函數要修改。
2
輸出函數循環死循環要修改。
c語言編程:編寫一個函數,統計出一行字符中英文字母的個數,在主函數輸入字符串,調用該函數後輸出結果
#include stdio.h
void count(char *s, int *a, int *b)
{
*a = *b = 0;
while(*s)
{
if(‘A’ = *s *s = ‘Z’ || ‘a’ = *s *s = ‘z’)
(*a)++;
else
(*b)++;
s++;
}
}
int main()
{
char s[100];
int zm, qt;
printf(“輸入字符串:\n”);
gets(s);
count(s, zm, qt);
printf(“字母:%d\n”, zm);
printf(“其它:%d\n”, qt);
return 0;
}
沒有測試,你試一下對不對。應該是這樣的
linux系統問題 高手進
報錯的意思基本上是spinlock在使用cpu的#0號時出現了bug。你安裝的是什麼版本的linux?建議你換一個linux版本試試看,如suse、RedHat(fedora),ubuntu等版本
[Linux]編寫一個簡單的C語言程序,編寫Makefile文件。
八 環境變量
8.1 查看環境變量
$ env 顯示所有的環境變量設置
$ echo $ENV_VARIABLE 顯示指定環境變量的設置
例:
$ echo $PATH
/bin:/etc:/usr/bin:/tcb/bin
8.2 設定環境變量
$ ENV_VARIABLE=XXX;export ENV_VARIABLE
例:
$ PATH=$PATH:$INFORMIXDIR/bin;export PATH 將環境變量PATH設定為原PATH值+$INFORMIXDIR/bin
8.3 取消環境變量設置
$ unset $ENV_VARIABLE
例:
$ set GZJ=gzj;export GZJ 設置環境變量GZJ
$ echo $GZJ
gzj 顯示環境變量值
$ unset $GZJ 取消環境變量GZJ的設置
$ echo $GZJ
已取消
一 makefile規則
makefile是一個make的規則描述腳本文件,包括四種類型行:目標行、命令行、宏定義行和make偽指令行(如“include”)。makefile文件中注釋以“#”開頭。當一行寫不下時,可以用續行符“\”轉入下一行。
1.1 目標行
目標行告訴make建立什麼。它由一個目標名表後面跟冒號“:”,再跟一個依賴性表組成。
例:
example: depfile deptarget
該目標行指出目標example與depfile和deptarget有依賴關係,如果depfile或deptarget有修改,則重新生成目標。
example1 example2 example3: deptarget1 deptarget2 depfile
該目標行指出目標名表中的example1、example2、example3這三個各自獨立的目標是用相同的依賴列表和規則生成的。
clean:
空的依賴列表說明目標clean沒有其他依賴關係。
目標行後續的以Tab 開始的行是指出目標的生成規則,該Tab字符不能以空格代替。例如:
example.o:example.c example.h
cc –c example.c
該例子指出目標example.o依賴於example.c和example.h。如果example.c或example.h其中之一改變了,就需要執行命令cc –c example.c重新生成目標example.o。
可以用文件名模式匹配來自動為目標生成依賴表,如:
prog: *.c
以下是一個簡單的makefile的例子:
圖 1 最簡單的makefile例
make使用makefile文件時,從第一個目標開始掃描。上例中的第一個目標為all,所以目標clean不會自動被執行,可以通過命令make clean來生成目標。
1.2 命令行
命令行用來定義生成目標的動作。
在目標行中分號“;”後面的文件都認為是一個命令,或者一行以Tab製表符開始的也是命令。
如在上面的makefile例中,第三行以Tab字符開始的cc命令即是一個命令行,說明要生成hello應執行的命令。也可以寫成:hello:hello.o;cc –c hello –L…
一般情況下,命令行的命令會在標準輸出中回顯出來,如對上面的makefile執行make時,標準輸出如下:
cc -c hello.c
cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o
cc -c hello1.c
cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o
如果不希望命令本身回顯,可在命令前加@字符,如在上例中不希望回顯cc –c hello.c和cc –c hello1.c,可修改makefile文件如下:
圖 2 抑制回顯的makefile例
對該makefile文件執行make時,標準輸出如下:
cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o
cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o
可以看出,命令行前有@字符的不回顯。
1.3 宏定義行
在makefile中,可以使用宏定義減少用戶的輸入,例如上例中對hello和hello1的編譯選項均為“-L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11”,此時可以用宏來代替,如:
圖 3 使用宏定義的makefile例
宏定義的基本語法是:
name=value
在定義宏時,次序不重要。宏不需要在使用前定義。如果一個宏定義多次,則使用最後一次的定義值。
可以使用“$”字符和“()”或“{}”來引用宏,例如:
cc –o hello.o $(CCFLAGS) hello.o
也可以將一個宏賦值給另一個宏,但這樣的定義不能循環嵌套,如:
A=value1
B=value2
C=$(A) $(B)等價於C=value1 value2
1.4 偽指令
makefile大部分由宏定義行、命令行和目標行組成。第四種類型是make偽指令行。make偽指令沒有標準化,不同的make可能支持不同的偽指令集,使得makefile有一定的不兼容性。如果要考慮移植性問題,則要避免使用make偽指令。但有一些偽指令,如include,由於使用比較多,很多不同make都提供該偽指令。
1.4.1 偽指令include
該偽指令類似C語言中的#include,它允許一次編寫常用的定義並包括它。include偽指令必須在一行中,第一個元素必須是include,並且跟一個要包含的文件名,如:
include default.mk
1.4.2 偽指令“#”
“#”字符也是make的偽指令,它指出“#”後面的文件是注釋,如:
PROGNAME=test # define macro
#don’t modify this
二 後綴規則
2.1 雙後綴規則
在前面的makefile例中有許多重複內容,例如,生成hello和hello1的命令類似,生成hello.o和hello1.o的命令也類似,除了編譯或鏈接的文件不一樣外,其它均相同,這時,我們就可以使用後綴規則。首先看一個雙後綴的例子:
圖 4 使用雙後綴規則的makefile例
後綴規則使用特殊的目標名“.SUFFIXES”。
第一行中.SUFFIXES的依賴表為空,用來清除原有的後綴規則,因為.SUFFIXES可以在makefile中多次使用,每一次都將新的後綴規則加入以前的後綴規則中。
第二行中指定後綴規則為“.c .o”,即表示將所有的.c文件轉換為.o文件。
第三行指定將.c文件轉換成.o文件的方法。$(CC)為make的預定義宏,其默認值為cc,$為特殊的宏,代替當前的源文件,即所有要編譯的.c文件。
第六行指定目標hello和hello1的生成方法。$@為特殊的宏,代替當前的目標名,即hello和hello1,$@.o即為hello.o和hello1.o。
上例介紹的是雙後綴規則,即它包含兩個後綴,如.c.o,用來把一個C源文件編譯為目標文件。雙後綴規則描述如何由第一個後綴類型的文件生成第二個後綴類型的文件,例如:.c.o規則描述如何由.c文件生成.o文件。
2.2 單後綴規則
單後綴規則描述了怎樣由指定後綴的文件生成由它基名為名字的文件。例如使用單後綴規則.c,可以由hello.c和hello1.c生成hello和hello1文件。例如將前面的makefile改為:
圖 5 使用單後綴規則的makefile例
由於.c後綴規則為make標準後綴規則,make為其指定了相應的命令行,所以在makefile中可以不用再指定其目標生成的具體命令行。
下表是make提供的標準後綴規則。
表 1 make標準後綴規則
後綴規則 命令行
.c $(LINK.c) –o $@ $ $(LDLIBS)
.c.ln $(LINK.c) $(POUTPUT OPTPUT OPTION) –i $
.c.o $(COMPILE.c) $(OUTPUT OPTION) $
.c.a $(COMPILE.c) –o $% $
$(AR) $(ARFLAGS) $@ $%
$(RM) $%
三 特殊目標
在後綴規則中使用了特殊目標.SUFFIXES,用來指定新增的後綴規則。make還提供了幾個特殊目標來設置make的行為,下面為一些特殊的目標:
.IGNORE
make在執行命令行時,如果返回的是錯誤碼,make的缺省動作是停止並退出。增加該目標後,make將忽略命令行返回的錯誤碼,並繼續執行後續的操作。
.SILENT
前面已經介紹過,make在執行命令行時會回顯命令行內容,在命令行前增加“@”字符將抑制該命令行的回顯。
如果增加該目標,所有的命令行不再回顯,相當於在每個命令行前均增加了“@”字符。
.PRECIOUS
當收到一個信號或從shell命令返回非零的錯誤碼時,make刪除它所有已建立的文件。但有些文件即使出了錯誤,用戶也不想讓make刪除,這些文件可以作為.PRECIOUS目標的參數。它可以在一個makefile中出現多次,每一次都累積文件列表。
.SUFFIXES
它為makefile指定新的後綴規則,新的後綴規則作為.SUFFIXES的依賴表給出。.SUFFIXES可以在一個makefile中多次使用,每一次都將新的後綴規則加入以前的後綴規則中,如果.SUFFIXES的依賴表為空,則設置後綴規則表為空。
四 特殊的宏
為簡單使用規則,make提供了幾個特殊的宏:
$@
整個當前目標名的值可以由宏“$@”來代替。
$
當前的源文件由“$”來代替。例如,在前面的例子中用到了$(CC) –c $,其中的“$”是所有要編譯的.c文件。宏“$”僅在後綴規則或.DEFAULT中有效。
$*
當前目標的基名由宏“$*”來代替。例如目標的名字是hello.o,則基名就是除去了後綴.o的hello。
以上介紹的特殊宏使用了make自身的規則,用戶不可以改變。下表介紹了C中預定義的宏。
用途 宏 默認值
庫文檔彙編命令 AR ar
ARFLAGS rv
AS as
ASFLAGS
COMPILE.s $(AS) $(ASFLAGS) $(TARGET ARCH)
C編譯器命令 CC cc
CFLAGS
CPPFLAGS
COMPILE.c $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET ARCH) –c
LINK.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET ARCH)
鏈接編輯器命令 LD ld
LDFLAGS
rm命令 RM rm
後綴列表 SUFFIXES .o .c .c~ .s .s~ .S .S~ .ln .f .f~ .F .F~ .l .mod .mod~ .sym
.def .def~ .p .p~ .r .r~ .y .y~ .h .h~ .sh .sh~ .cps .cps~
五 makefile的應用
當調用make時,它在當前目錄下搜索文件名是“makefile”或“Makefile”的文件,並執行。
如果不想使用上述缺省文件,可以使用命令行中的“-f”來指定文件,如將編寫的makefile命名為mklib,則指定為“make –f mklib”。
原創文章,作者:WLZK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/140871.html