當前位置:首頁 » 編程語言 » c語言怎麼防寫現場
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言怎麼防寫現場

發布時間: 2022-08-16 10:52:34

⑴ 中斷處理中的保護軟體現場和恢復軟體現場類似於c語言中的哪一部分

中斷、異常和系統調用 所謂中斷是指CPU對系統發生的某個事件做出的一種反應,CPU暫停正在執行的程序,保留現場後自動地轉去執行相應的處理程序,處理完該事件後再返回斷點繼續執行被「打斷」的程序。 中斷可分為三類,第一類是由CPU外部引起的,稱作中斷,如I/O中斷、時鍾中斷、控制台中斷等。

⑵ 單片機c語言編程時,中斷程序中需設置堆棧指針的值嗎 需編程進行保護現場、恢復現場嗎

不需要,你也操作不了

⑶ C語言怎麼給文件夾防寫

用system("attrib命令");

system("attrib +R abc");
給文件夾設「只允許讀」

system("attrib +H abc");
隱藏文件夾

詳細見 DOS 幫助, 打命令:
attrib /?

⑷ 怎麼用C語言編寫「保護現場」的句子

c沒必要明確保護現場,編譯器會自動處理的
非要這樣的話可以在c內嵌入匯編代碼,不過這樣還存在個問題:你不知道編譯器生成的最終代碼中使用了那些寄存器,除非你把所有寄存器全壓入棧中

⑸ C語言提問

這個問題非常的精妙。我給出一個能夠解釋的通的答案(不一定正確)。首先需要知道printf是一個函數,而函數的參數入棧的順序。就是執行的時候,是如何被調用的。
需要學習的知識點:函數調用約定。如果你不知道程序是如何調用printf這個函數的,這個問題你就無法理解。簡單的說,在調用函數之前,我們要保留「現場」,因為我們知道,程序執行的時候,是要「進入」函數中去的,等函數執行完了,回到原來的執行的地方,繼續向下。
這個過程,C語言是從右向左壓參數的。
還有一個問題,就是i++,++i的區別。在函數調用時,i++先入棧,後自增計算。++i是先自增計算,後入棧。

現在有了這些知識點,我們來理解這個程序:

計算機申請了一塊內存,名字是i, 是int型的,裡面的值是 8.

現在,調用了一個函數,這個函數有很多參數,其中有六個參數是我們要列印的,每個參數就是一塊內存。它們沒有名字,不像i。我們暫時就叫他們一二三四五六

從右向左, 我們開始把i內存中的值 轉移 到 一二三四五六 中。轉移的過程中,只有自增自減是影響i這塊內存中的值,而其他計算是隻影響這個計算目標內存的值。i++的目標內存就是i。

在處理之前,先運算一二的自增自減,所以i的值不變,是8.

分析六: -i--,這個計算的目標內存是六,所以六中的值是-8,然後i中進行自減,此時i這塊內存的值變為7.
分析五: -i++, 五這塊內存中的就是-7,而i這快內存中又變成了8.
分析四: 四中 是8, i又變成了 7
分析三: 三自然是7 ,然後i++,i這塊內存中又變成了8.
一和二 自然都是8了,因為 自增自減 早就運算完了。
---------------------------------------------------------------
這個就是一個解釋,我瞎猜測的,不一定這樣,要真知道,你要去看看匯編以後的代碼。

最麻煩的就是一直用i這塊內存,所以寫代碼的時候還是要注意啊

-----------------------------------------------------------------
函數調用約定(Calling Convention)
函數調用約定不僅決定了發生函數調用時函數參數的入棧順序,還決定了是由調用者函數還是被調用函數負責清除棧中的參數,還原堆棧。函數調用約定有很多方 式,除了常見的__cdecl,__fastcall和__stdcall之外,C++的編譯器還支持thiscall方式,不少C/C++編譯器還支持 naked call方式。這么多函數調用約定常常令許多程序員很迷惑,到底它們是怎麼回事,都是在什麼情況下使用呢?下面就分別介紹這幾種函數調用約定。

1.__cdecl

編譯器的命令行參數是/Gd。__cdecl方式是C/C++編譯器默認的函數調用約定,所有非C++成員函數和那些沒有用__stdcall或__fastcall聲明的函數都默認是__cdecl方式,它使用C函數調用方式,函數參數按照從右向左的順序入棧,函數調用者負責清除棧中的參數, 由於每次函數調用都要由編譯器產生清除(還原)堆棧的代碼,所以使用__cdecl方式編譯的程序比使用__stdcall方式編譯的程序要大很多,但是 __cdecl調用方式是由函數調用者負責清除棧中的函數參數,所以這種方式支持可變參數,比如printf和windows的API wsprintf就是__cdecl調用方式。對於C函數,__cdecl方式的名字修飾約定是在函數名稱前添加一個下劃線;

⑹ 單片機C語言中斷後保存現場嗎

C語言不用管現場。。自動保存的。進出中斷,就跟調用一個函數一樣。只不過一個是被動,一個是主動。

⑺ 51單片機現場保護參與哪些運算指令(c語言)的數據

對於C語言編程通常是不需要考慮現場保護的,因為系統在編譯代碼時會為你自動處理好的,你可以編譯一段含有中斷的程序,再打開反匯編窗口看看,Keil C的代碼效率還是很高的,可以說不會比你用匯編寫的程序更浪費空間。

⑻ 請教單片機高人:怎麼用C編寫中斷,匯編中可以有ORG 000BH來確定是T0中斷,那C怎麼辦還有現場保護怎辦

C51中斷函數格式
Keil C51編譯器中斷函數語法定義如下:
(C語言不用處理現場保護了) interrupt n <----這個是重點
void 函數名() interrupt n
{

}
//定時器T0中斷
void 函數名() interrupt 1
{

}

C51編譯器允許0~31個中斷,下列中斷及其相關地址為8051控制器所提供的中斷:
0:EXTERNAL 0 地址:0003H
1:TIMER/COUNTER 0 地址:000BH
2:EXTERNAL 1 地址:0013H
3:TIMER/COUNTER 1 地址:001BH
4:SERIAL PORT 地址:0023H
編寫中斷函數時應遵循下列規則:
·不能進行參數傳遞。如果中斷過程包括任何參數聲明,則編譯器將產生一個錯誤信息。
·無返回值。如果想定義一個返回值將產生錯誤,但是,如果返回整型值,編譯器將不產生
錯誤信息,因為整型值是默認值,編譯器不能清楚識別。
·在任何情況下,不能直接調用中斷函數,否則編譯器會產生錯誤。由於退出中斷過程是由
指令RETI完成的,該指令影響MCS-51單片機的硬體中斷系統,直接調用中斷函數時,硬體
上沒有中斷請求存在,因而這個指令的結果是不定的,並且通常是致命的。
·編譯器從絕對地址8n+3處產生一個中斷向量,其中n為中斷號,該向量包括一個中斷過
程的跳轉,向量的產生可由編譯器控制指令NOINTVECTOR壓縮,因而程序員可以從獨立的匯
編模塊中提供中斷向量。
·可以在中斷函數定義中使用using指定當前使用的寄存器組。格式如下:
void 函數名([形式參數])interrupt n [using m]
MCS-51單片機有四組寄存器R0~R7,程序具體使用哪一組寄存器由程序狀態字PSW中
的兩位RS1和RS0來確定。在中斷函數定義時,可以用using指定該函數具體使用哪一組寄
存器,m在0,1,2,3這4個數中取值,對應四組寄存器組。例如:
void delay() interrupt 3 using 2
·在中斷函數中調用的函數所使用的寄存器組必須與中斷函數相同。當沒有使用using指令
時,編譯器會選擇一個寄存器組作為絕對寄存器訪問。程序員必須保證按要求使用相應寄存
器組,C編譯器不會對此檢查。
·如果在中斷函數中執行浮點運算,必須保存浮點寄存器狀態,當沒有其他程序執行浮點運
算時,可以不保存。

⑼ 在C語言中的函數調用過程中保留現場怎麼回事

保留現場
就是字面的意思,保留現場
比如,你要到某地去,走在路上時,看到路邊有個屋子,你想去看一下,但是又怕迷路了,那麼只好記住你現在所在的位置(也就是保留現場)。然後到屋子參觀一番後,離開屋子時,只要返回到之前所記的位置就行了。
函數調用時,具體要保留那些數據呢,一般來說不同編譯器不同的調用方法要保留的數據都會不同。那些寄存器的值一般都會保留的,保留的數據一般是放在程序的堆棧中。
其實函數的返回也就是恢復現場