本文目录一览:
- 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
这段代码超简单。我已经在本机运行过。但是你就这么运行结果都为零。因为你没给我数组的初值。但是这段代码完全实现你想要的功能。你要是还不明白,我也没办法。你用的时候赋初值就行,就那个数据段有 ?的地方换成数据,明白吧。