C语言控制硬件工作的原理和方式
 大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗?
网友北极
c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C语言编译成汇编指令,CPU直接执行汇编指令。
所以这个问题就变成,汇编指令是如何操作硬件的?
c语言基本名词概念如果把硬件平台限制在x86环境下,那么汇编指令操作硬件基本上只有两种方式:
方式一:
通过向内存空间写数据。硬件会把硬件上的各种寄存器(外行可以理解为访问硬件的接口或者操作硬件的工具)映射到某一块内存地址空间上,之后只要用汇编指令,甚至C语言去读写这一段内存地址空间(并非真正操作物理内存),就可以达到操作硬件的目的了。
如果题主还有WindowsXP环境(虚拟机也可以),就可以用汇编指令直接操作显存:
MOV AXB800
MOV ESAX
XOR DIDI
MOV CX0800
MOV AX5555
REPZ STOSB
硬件的各种寄存器会被映射到某一块物理内存中,这种方式称为MMIO,在Windows的设备管理器里,右键点设备,看属性-》资源里,不少硬件设备都有“内存范围”的参数,这里的内存范围就表示这个硬件的资源可以通过访问这一段内存来控制它。
方式二:
x86汇编中,还有两个特殊的指令是INOUT,这是x86平台独有的,上面图里的I/O范围,就是用IN/OUT这两个指令来访问和控制的。
以上两种访问硬件的方式,第一种是可以用C语言实现的,上面一段汇编,本质上类似于C语言代码:
char ptr = 0xB8000;
int i;
for (i = 0; i 0x800; i++)
{ptr + i = 0x55;
}
第二种IN/OUT方式没有直接的C语言语法对应,需要自己封装汇编。
那么为什么平时很难用C语言操作硬件呢?这是因为平时写的代码大多数都在保护模式下,保护模式下,直接访问物理地址会受到限制,C语言操作的地址都是虚地址。