当前位置:首页 » 编程语言 » c语言可以直接与硬件交互吗
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言可以直接与硬件交互吗

发布时间: 2023-01-29 20:34:00

c语言竟是如何调用硬件

大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗?以下仅供参考!

c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C语言编译成汇编指令,CPU直接执行汇编指令。

所以这个问题就变成,汇编指令是如何操作硬件的?

如果把硬件平台限制在x86环境下,那么汇编指令操作硬件基本上只有两种方式:

方式一:

通过向内存空间写数据。硬件会把硬件上的各种寄存器(外行可以理解为访问硬件的接口或者操作硬件的工具)映射到某一块内存地址空间上,之后只要用汇编指令,甚至C语言去读写这一段内存地址空间(并非真正操作物理内存),就可以达到操作硬件的目的了。

如果题主还有WindowsXP环境(虚拟机也可以),就可以用汇编指令直接操作显存:

MOV AX,B800

MOV ES,AX

XOR DI,DI

MOV CX,0800

MOV AX,5555

REPZ STOSB

硬件的各种寄存器会被映射到某一块物理内存中,这种方式称为MMIO,在Windows的设备管理器里,右键点设备,看属性-》资源里,不少硬件设备都有“内存范围”的参数,这里的内存范围就表示这个硬件的资源可以通过访问这一段内存来控制它。

方式二:

x86汇编中,还有两个特殊的指令是IN和OUT,这是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语言操作的地址都是虚地址。

对于Windows来说,要访问物理地址,需要工作在内核模式,也就是的写驱动才行。

而在显存方面,首先,题主要先明白物理地址和虚拟地址的概念。

原来的8086cpu设计的时候,地址空间有一块区域(640K-1M)之间,有一块作为显存使用

这里你说的预留的地址,是指物理地址,这一段地址的准确范围是000A0000-000BFFFF,不管是32位还是64位CPU,这一段物理内存地址一直都保留给显存使用,不区分32位还是64位,也不区分保护模式还是实模式。

可见这一段内存至今仍然是留给显卡使用的。

那么现在为什么不能直接用这段内存了?

因为现在的软件都运行在保护模式下,访问的地址都是虚拟地址,而并非物理地址,包括你使用cmd命令打开的环境,都是虚拟地址,虽然32位XP里能用debug命令向000B8000上写数据并能显示在cmd的界面里,但本质上,这都是虚拟出来的。

如果要想用这段显存怎么办?

自己写一个简易的操作系统,不启动显卡的各种图形加速功能,CPU进入保护模式后在GDT里映射一个4G的数据段,与物理地址一致,那么向000B8000上写数据,就会像过去DOS一样显示在屏幕上,所以保护模式下也可以访问这一段内存。所以,保护模式下,也可以用它。

显卡那么多显存是怎么映射的?

有很多内存地址被映射给显存了,就是通过这种映射关系,把一些物理地址留给显存,使得CPU能像访问内存一样访问显存资源。

当然,实际情况是,2G显存未必完全映射,而是只映射一部分地址,显卡有一些开放的寄存器能够控制哪部分显存映射过来,这样就能使得CPU在使用比较少的物理地址范围的情况下,访问全部的显存。

还有一个很有意思的事情:在虚拟机里,找到映射的高地址部分的第一块内存区域,写一个能直接访问物理地址的程序(比如一个驱动),去读这一块内存,然后写到文件里,再用屏幕截图,也写到文件里,会发现截图的内容和显存里读出来的内容基本上是一样的。

网友awayisblue

要回答你的问题,我们需要要知道:

硬件是一种什么样的存在

什么是驱动。

C语言怎么操作硬件

我就不严格去定义这些概念了,我就以一个例子来通俗地讲解一下吧。

首先讲硬件:

先介绍一款单片机芯片STM8。

这款芯片里面有cpu, 内存,寄存器(先不要觉得看到新名词压力大,继续往下看)等等,相当于我们的电脑了,但还要外接其它硬件。

这里你需要知道的概念是:

芯片的引脚跟寄存器是相对应的,寄存器是8位的内存单元(对,存在于内存上面),当你往这个内存单元里面写入数据时,芯片的引脚的电压会发生变化,比如说我写入的是01100001,则芯片上与之对应的8个引脚的电压状态(分为高电平与低电平两种)会输出:低高高低低低低高。

cpu可以执行代码指令,指令可以操作内存。

结论:所以从上面两点可以我们可以知道,cpu可以执行指令,使芯片的引脚电平(电压)发生变化。

关于这款显示器,我们需要知道的是:

它是有引脚的,这些引脚可以跟到前面介绍的那款单片机芯片的引脚相连。

该显示器有自带的内存,用于存储要显示的字符,显示器从该内存里面读取字符来来显示。

单片机芯片与该显示器相连后,可以通过引脚往该显示器的内存里写数据(通过多个引脚电平的高低不同来代表不同的数据,比如说:低高高低低低低高 代表01100001,这个数据写在显示器的.内存里面,被显示器所显示,当然,会根据ASCII来显示数字对应的字符,01100001对应的字符是‘a’),除了接收数据的引脚外,还有控制显示器的引脚(这个我们会在驱动那里介绍,继续往下看)。

结论:单片机芯片与显示器相连,可以通过引脚输出的电平来控制显示器的字符显示。

那么,综合上面,也就是说,单片机芯片cpu可以通过执行指令来控制显示器的字符显示。

而这里,题主所说的硬件,指的就是这个显示器了。

接下来讲驱动:

那么,什么是驱动呢?驱动无非就是硬件跟软件的中间层,但我们不纠结这种关系,直接来看一下,对于我们这个例子,驱动指的是什么。首先我们要知道:

显示器支持很多种操作,比如说清除显示,光标移动,读取数据,写数据等等。

这些操作数据引脚和控制引脚来实现。

引脚可以通过单片机芯片来控制。

结论:我们可以通过在单片机芯片里面写显示器的“驱动”程序来屏蔽掉硬件(显示器硬件)层。

于是这里驱动程序,指的是显示器所支持操作的程序表示。比如说清除显示,我们可以编写一个clear()函数,光标移动,我们编写一个move_cursor()函数,读取数据和写数据分别为read()和write(),然后分别实现就可以了(通过向寄存器里写数据的形式,进而控制引脚的电平变化,再而控制显示器,这个过程前面已有介绍)。这些函数就是驱动程序了。为什么上面说驱动程序可以屏蔽掉硬件呢?因为程序员可以使用前面的驱动程序来直接操作显示器(硬件),而不用知道太多关于硬件的事情,而一般的驱动程序也可以由厂家来提供。

再说明一点:一般这些驱动程序可以用汇编写(出于运行效率的考虑),也可以用C语言来编写的,比如说我上面的例子,就可以直接用C语言来编写。当然C语言内联汇编的形式也可以。

最后讲C语言怎么操作硬件:

相信到这里,C语言是怎么操作硬件的已经比较明白了。

这里总结一下:

C语言由CPU运行(实际上是先编译成机器码存在芯片里面然后执行),可以去操作内存。

内存里有一段是跟寄存器相对应的,而寄存器是跟芯片的引脚相对应的,于是操作该段内存就能控制芯片引脚的电压变化。

硬件(比如说显示器)有引脚(或者说排线,这些也是一样的东西),这些引脚跟芯片的引脚相连可以接受芯片的控制。

可以把对某个硬件的操作做成一系列操作函数,这些操作函数就是驱动程序了。

于是我们的C语言只要去调用这个驱动程序就可以直接操作硬件了。(当然驱动程序也可以由C语言来编写,所以C语言操作硬件并不一定要经过驱动程序)。

② C语言能直接操作硬件的哪一部分

C语言对硬件(如显示器,打印机,硬盘,键盘等)的操作主要是通过系统调用或者中断来进行的.操作系统维护一张中断表.主要的系统功能调用是int13.有专门的C语言函数来进行功能调用.
你刚开始学C语言,那么你先把基础的C语言学会了,再进行C语言高级程序设计吧.在那里你会学会很多计算机底层操作的东西,比如显示器彩色图形的输出,C语言动画,甚至对内存也可以操作,这是其他语言没有的特色.但你必须把基础的C好好掌握才可以的,尤其是C的精华-----指针.

③ 为什么都说C语言能直接访问硬件

C语言是直接封装的汇编语言,它的封装性比起java、c#等高级语言要差很多,而汇编语言是使用的cpu等硬件的指令集,所以说C语言可以直接访问某些硬件。

④ 听说C语言什么的能够和硬件挂上钩,是吗

当然。就比如说单片机,C语言在微控制器方面起着至关重要的作用。在比如一个C语言程序可以控制主板自带的喇叭发出很有节奏的旋律。还有更为直观的机器语言----汇编语言。

⑤ c语言可以直接对硬件操作吗

害,这个问题怎么说呢,操作系统才是直接对硬件进行操作的,如果操作系统使用C语言编写,那么宏观上看上去就变成了C语言对硬件进行了操作,但用户编程的c语言程序是不可以直接对硬件进行操作的,必须调用操作系统提供的服务才可以对硬件进行操作,比如printf函数.

⑥ 都说C语言可以直接操作硬件

不能。

  1. 首先,C语言不能够直接对硬件进行操作。从本质上来说,连汇编语言都不可以。只有机器语言能够直接操作硬件。

  2. 其次,C语言要操作硬件是必须经过一系列的编译转换。最终它会成为0101的机械码,这个时候它根本不是我们所能够理解的C语言了。

  3. 以GCC编译器为例,这个可以分为四步。

第一步是预处理,包括语法检查等工作。
gcc -P abc.c
第二步由源程序生产汇编语言代码。
gcc -S abc.c
会生成abc.s文件,这个文件里就是汇编代码。
第三步编译器生成目标代码,一个源文件生成一个目标代码。
gcc -c abc.c
会生成abc.o
第四步连接器从目标代码生成可执行文件。
gcc abc.o

最后,相对来说,C语言在高级语言当中是最贴近物理层面的语言。它也被称作高级语言里面的低级语言。因为它很多方面都非常贴近硬件。典型的就是指针,这是一种通过物理地址直接操作内存的变量。

⑦ 为什么说C语言是直接对硬件操作的语言

VB不行
语言从低级到高级,语义功能越来越完善(意思是写出来的程序越来越接近人类语言),但是同时失去了对硬件的直接操纵能力,而且执行效率越来越低。
比如最低级的机器语言(全部是各种数字),没学过根本看不出是什么意思,但是对硬件操纵能力最强,想怎么让硬件做硬件就会怎么做。执行效率为百分之百。
其次是汇编语言,汇编语言稍微向英语迈进了一点,但是很有限,一般人也看不明白的,比如这句
mov
a,b
谁知道什么意思!其操纵硬件能力也极强,随心所欲,执行效率基本也是百分之百。
而C语言介于高级和低级之间,代码容易理解,还可以用指针操纵硬件(不过还是很局限的,CPU就无法之间操纵了),执行效率为80%,对于一直语言来说很不错了。
Basic语言完全是高级语言,代码简单,但是不具备操纵硬件能力,也就是你想写个代码直接让内存怎么怎么样,内存不听你的,只听编译好的程序的。而且执行效率也很低了。

⑧ 为什么说C语言是直接对硬件操作的语言

  1. 首先,C语言不能够直接对硬件进行操作。从本质上来说,连汇编语言都不可以。只有机器语言能够直接操作硬件。

  2. 其次,C语言要操作硬件是必须经过一系列的编译转换。最终它会成为0101的机械码,这个时候它根本不是我们所能够理解的C语言了。

    以GCC编译器为例,这个可以分为四步。
    第一步是预处理,包括语法检查等工作。
    gcc -P abc.c
    第二步由源程序生产汇编语言代码。
    gcc -S abc.c
    会生成abc.s文件,这个文件里就是汇编代码。
    第三步编译器生成目标代码,一个源文件生成一个目标代码。
    gcc -c abc.c
    会生成abc.o
    第四步连接器从目标代码生成可执行文件。
    gcc abc.o

  3. 最后,相对来说,C语言在高级语言当中是最贴近物理层面的语言。它也被称作高级语言里面的低级语言。因为它很多方面都非常贴近硬件。典型的就是指针,这是一种通过物理地址直接操作内存的变量。

⑨ C语言能对硬件直接操作是什么意思,小弟初学者,请高手解答!非常感谢!!!

C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此有人把它称为中级语言。也就是说,C语言可以直接对物理地址进行操作。

学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。

在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。 既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。 可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时, 银行工作人员将根据我们的帐号去找我们的存款单, 找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针, 存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。

⑩ C语言介绍

一、C语言的 历史

C语言由丹尼斯·里奇(Dennis Ritchie)于1972年在位于美国的AT&T(美国电话电报公司)贝尔实验室发明。C语言借鉴前辈语言的功能和优点,并且克服了它们存在的问题。可以说C语言是对当时现有语言的一次改进和总结,创造出一种在那个时代更加优秀的编程语言。直至当前,C语言还是一种比较重要的编程语言,在比较流行的编程语言排行榜上常年霸榜前几名,经久不衰。很多计算机专业都是以C语言作为第一编程入门语言,可见C语言的影响和重要性。

图一 编程语言趋势&2021排行榜(部分)

二、C语言的特点

C语言是一种中级编程语言,相对于低级语言汇编,高级语言Java等现代语言。C语言可以直接访问内存,分配内存,与硬件设备交互,具有低级语言的特点;相对于现代的面向对象编程,C语言是一种面向过程语言,面向过程语言也称为结构化程序设计语言。通俗的讲,面向对象编程是把对象当做一个基本编程单位/个体;面向过程编程,把一些功能划分成一个单元称之为函数,程序的执行就是函数顺序逐步的执行。

三、C语言的应用

C语言有很多方面的应用。首先,C语言发明者使用C语言编写了Unix操作系统。Linux操作系统也是使用C语言开发出来的。现代很多基础软件是使用C语言开发的,比如我们常用的wps办公软件等等桌面应用软件,如果你仔细观察,你可能发现平时电脑上使用的很多应用就是使用C语言开发出来的,是不是有点小惊讶。可见C语言的应用是很普遍的。C语言应用的领域有系统内核、驱动、基础应用、桌面应用等等。不过有些领域并没有使用C语言,Web开发并没有使用C语言,然而,Web服务器、中间件使用C语言开发是比较司空见惯的。

我们可以列举日常使用的软件有哪些是使用C语言开发的。谷歌浏览器部分使用C语言开发,一些规模比较大的软件,并不是使用单一的编程语言开发出来。QQ、微信PC端也是使用CC++开发。还有wps等等,很大一部分日常使用的PC软件都是使用CC++开发的。软件开发领域使用的软件应用有更多是使用CC++开发出来的。