當前位置:首頁 » 編程語言 » 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++開發出來的。