本文目錄一覽:
- 1、用c語言可以實現cpu中央控制器的設計嗎
- 2、C語言如何適配CPU
- 3、C語言 編程實現獲取cpu信息
- 4、C語言怎麼取CPU的各項信息
- 5、用x86 CPU彙編語言設計一個實現如下C語言語句功能的程序
用c語言可以實現cpu中央控制器的設計嗎
CPU中央控制器設計:
1、用FPGA實現,語言是VHDL或者Verilog HDL,因為CPU講究的是速度和可靠性,用純粹的數字硬體電路來實現最好不過了。
2、用嵌入式晶元,比如ARM,然後搭載別人的操作系統,留出需要的介面,這樣是用C語言來實現的,但是核心就是操作系統,C來驅動硬體實現控制作用。而最底層的硬體還是用硬體描述語言VHDL或者Verilog HDL來實現的。所以你所指的C語言實現CPU的設計還是基於一定的硬體平台的操作系統,而且已經預留硬體的介面,用C語言編寫的驅動和內核而已。
3、單純的講CPU大部分是用硬體描述語言,就是1中所述的來設計的。而絕非 在已有的硬體平台下寫個驅動和內核,不過現在的好多硬體都可以用C語言來開發,只不過效率沒有硬體描述語言高。你說的實現CPU的設計不是沒有可能,只不過很少人這麼做!
純手打,如果滿意望採納!
C語言如何適配CPU
c語言是沒法操控cpu的,操控cpu只能是彙編,所以寫操作系統是沒法完全靠c,必須加彙編進去混合編程
C語言 編程實現獲取cpu信息
耐心看看啊,運行通過啦,希望對你有幫助啊!
#includestdio.h
unsigned int veax;
unsigned int vebx;
unsigned int vedx;
unsigned int vecx;
//執行CPUID指令
void cpuid(unsigned int veax1)
{
_asm{
mov eax,veax1
cpuid
mov veax,eax
mov vebx,ebx
mov vecx,ecx
mov vedx,edx
}
}
//做移位操作,把寄存器中的ASCII碼,以字元形式輸出
void LeftMove(unsigned int var)
{
printf(“%c”,var);
for(int i=0;i3;i++)
{
var=(var;
printf(“%c”,var);
}
}
//做移位操作,把寄存器中的值以「%d」形式輸出
void LM(unsigned int var)
{
printf(“%d”,var);
for(int i=0;i3;i++)
{
var=(var;
printf(“%d”,var);
}
}
//得到CPU的生產廠商(當EAX值為0時),依次存放在EBX,EDX,ECX中
void getCpuName()
{
cpuid(0);
LeftMove(vebx);
LeftMove(vedx);
LeftMove(vecx);
printf(“\
“;
}
//得到CPU的商標,當EAX中的值為0x80000003和0x80000004時分別返回16個字元,組成商標
//依次存放在EAX,EBX,ECX,EDX中
void getCpuBrand()
{
for(int j=0;j2;j++)
{
cpuid(0x80000003+j);
LeftMove(veax);
LeftMove(vebx);
LeftMove(vecx);
LeftMove(vedx);
}
printf(“\
“;
}
//獲得CPU的特性,參數是eax = 1,返回值放在edx和ecx,通過驗證edx或者ecx的某一個bit,
//可以獲得CPU的一個特性是否被支持。比如說,edx的bit 32代表是否支持MMX,
//edx的bit 28代表是否支持Hyper-Threading,ecx的bit 7代表是否支持speed sted。
void getCpuFeature()
{//由於特性太多,無法一一編寫,需要的時候再寫,方法是一樣的。
}
//獲得CPU序列號,獲得序列號需要兩個步驟,首先用eax = 1做參數,返回的eax中存儲序列號的高兩個WORD。
//用eax = 3做參數,返回ecx和edx按從低位到高位的順序存儲前4個WORD。
void getCpuSeris()
{
cpuid(1);
LM(veax);
cpuid(3);
LM(vecx);
LM(vedx);
printf(“\
“;
}
void main()
{
getCpuName();
getCpuBrand();
getCpuSeris();
}
C語言怎麼取CPU的各項信息
X86處理器的型號,信息處理器家庭,高速緩存尺寸,時鐘速度(頻率)和製造商codename 等,存放在處理器的CPU ID寄存器組中。
通過執行CPU ID指令集查詢,即可獲取處理器的相關信息。CPU ID彙編指令使用使用eax作為輸入參數(有時也用到ecx),eax、ebx、ecx、edx作為輸出參數。
示例彙編代碼如下:
1
2
mov eax, 1
cpuid
在C語言中(VC6以上)實現方法為:
32位模式下,可使用內嵌彙編來調用cpuid指令;64位模式下,VC編譯器不支持內嵌彙編,此時可使用微軟提供的Intrinsics函數,來執行cpuid指令,該函數支持32位和64位,該函數包含在 intrin.h中。CPUID指令的對應Intrinsics函數為如下兩個:
void __cpuid( int CPUInfo[4], int InfoType);
void __cpuidex( int CPUInfo[4], int InfoType, int ECXValue);
其中InfoType參數是CPUID指令的eax參數,即功能ID。ECXValue參數是CPUID指令的ecx參數,即子功能ID。CPUInfo參數用於接收輸出的eax, ebx, ecx, edx這四個寄存器。早期的CPUID功能只要一個功能ID參數(eax),這時使用__cpuid函數。後來CPUID的功能擴展,又加了一個子功能ID(ecx)參數,這時用__cpuidex。64位環境下包含 intrin.h後直接調用兩個系統庫函數即可。
用x86 CPU彙編語言設計一個實現如下C語言語句功能的程序
data segment ;定義數據段,你說浮點數類型,也沒講是雙精度還是單精度。我這裡用字類型。
x DW 1000 dup(?)
s DW ?
data ends
code segment;定義代碼段
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,1000 ;設置循環次數
lea bx,x ;裝載數組首地址
mov ax,s
L1: add [bx],ax ;加法操作
add bx,2 ;指針後移,指向下一數組元素。這裡因為是字類型,所以後移兩個位元組。
loop L1
mov ax,4c00h
int 21h
code ends
end start
這段代碼超簡單。我已經在本機運行過。但是你就這麼運行結果都為零。因為你沒給我數組的初值。但是這段代碼完全實現你想要的功能。你要是還不明白,我也沒辦法。你用的時候賦初值就行,就那個數據段有 ?的地方換成數據,明白吧。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/192014.html