c語言寄存器定義
『壹』 51單片機中如何用c語言自定義一個寄存器,求大神幫忙
寄存器是CPU內部重要的數據存儲資源,主要用來保存操作數和運算結果等信息,從而節省讀取操作數所需佔用匯流排和訪問存儲器的時間,也就是說CPU操作寄存器比操作內存快(寄存器是直接存取,而內存是定址存取)。
匯編比C語言效率高,經常操作寄存器也是一個原因吧。
C語言可以把變數定義為寄存器類型的,將數據直接存放在CPU的寄存器中,使用關鍵字register定義變數。
例如register a=123;定義a為寄存器類型變數。
使用register定義的變數盡可能存放到寄存器中,但不絕對。
『貳』 C語言中,如何定義單片機的寄存器
位地址在匯編語言中,只能直接定址,不支持間接定址。那麼,在 C 語言中,也就不能用指針來操作。所以不能定義單片機的寄存器。
訪問寄存器可以通過直接地址引用來完成。
例如52單片機的寄存器有4組,分別為00H-07H,08H-0FH,10H-17H,18H-1FH,各組均8位元組,要結合程序狀態字寄存器PSW(D0H)中的RS0,RS1的組合來確定是哪一組。
可以定義一個訪問Rn的函數typedefunsignedcharuchar;
uchardacRn(ucharn)//n=[0..7]
{
uchardata*p;
n+=(PSW&0x18);//PSW7:CY6:AC5:F04:RS13:RS02:OV1:F10:P
//本來要右移三位變為0-3,但由於是8個一組要乘以8(左移3位),所以直接加上寄存器編號就可以了
return*(uchardata*)n;
}
『叄』 C語言中可以定義寄存器變數到底可以定義多少空間的寄存器變數我該如何知道這個區域的大小
register是一個"建議"型關鍵字,意指程序建議該變數放在寄存器中,但最終該變數可能因為條件不滿足並未成為寄存器變數,而是被放在了存儲器中,所以可以不用糾結這個了。
如果你想了解有CPU多少寄存器,可參考下面資料:
新型 x86 處理器提供以下可以通過編譯器進行分配的寄存器:8 個 32 位的通用寄存器、8 個 80 位的浮點寄存器和 8 個 128 位的矢量寄存器。所有 x64 處理器提供 16 個 64 位的通用寄存器、8 個 80 位的浮點寄存器和至少 16 個矢量寄存器(每個矢量寄存器至少 128 位)。新型 32 位 ARM 處理器提供 15 個 32 位的通用寄存器和 32 個 64 位的浮點寄存器。所有 64 位的 ARM 處理器提供 31 個 64 位的通用寄存器、32 個 128 位的浮點寄存器和 16 個 128 位的矢量寄存器 (NEON)。
『肆』 什麼是寄存器
在數電里,寄存器是指由基本的RS觸發器結構衍生出來的D觸發, 就是一些與非門構成的結構。寄存器是由觸發器組成的。一個觸發器就是一個一位寄存器。存儲器(分為只讀存儲器ROM和隨機存取存儲器RAM )由寄存器組成,可以看作一個寄存器堆,每個存儲單元實際上相當與一個緩沖寄存器。
『伍』 C語言中的寄存器是什麼干什麼用
寄存器是和硬體有關的,和你的C語言寫的程序所運行的平台有關。積存器就是硬體中存放一些數據,變數的地方,有相應的含義。
『陸』 C語言中的自動變數和寄存器變數是什莫
C語言學習之變數存儲
C語言中對變數的說明包括兩方面的內容:變數類型以及變數的存儲類型。變數類型如:int(整形),char(字元型)是用來說明變數所佔用的內存空間的大小。變數存儲類型用來說明變數的作用范圍。
C語言的變數存儲類有:自動類、寄存器類、靜態類和外部類。
關鍵字auto加在變數名及其類型前,用來說明它是自動變數。局部變數是指在函數內部說明的變數(有時也稱為自動變數)。用關鍵字auto進 行說明, 當auto省略時, 所有的非全程變數都被認為是局部變數, 所以auto實際上 從來不用。 局部變數在函數調用時自動產生, 但不會自動初始化, 隨函數調用的結束, 這個變數也就自動消失了, 下次調用此函數時再自動產生, 還要再賦值, 退出時又自動消失。
static稱為靜態變數。根據變數的類型可以分為靜態局部變數和靜態全程變數。
1. 靜態局部變數
它與局部變數的區別在於: 在函數退出時, 這個變數始終存在, 但不能被其它
函數使用, 當再次進入該函數時, 將保存上次的結果。其它與局部變數一樣。
2. 靜態全程變數
靜態 全程變數就是指只在定義它的源文件中可見而在其它源文件中不可見的變數。它與
全程變數的區別是: 全程變數可以再說明為外部變數(extern), 被其它源文件使用,而靜態全程變數卻不能再被說明為外部的, 即只能被所在的源文件使用。
extern稱為外部變數。為了使變數除了在定義它的源文件中可以使用外, 還要 被其它文件使用。因此, 必須將全程變數通知每一個程序模塊文件, 此時可用 extern來說明。
寄存器變數to能夠長在執行速度很重要的情況下使用。其思想是告訴編譯程序把該變數放在一個CPU寄存器中。因為數據在寄存器中操作比在內存中快,這樣就提高了程序代碼的執行速度。寄存器變數的說明是在變數名及類型之前加上關鍵字register。值得注意的是取地址運算符&不能作用於寄存器變數。
file1.c
#include <stdlib.h>
#include <stdio.h>
int reset();
int next();
int last();
int sum(int );
int i=1;
void main()
{
auto int i,j;
i=reset();
for(j=1;j<=3;j++)
{
printf("i=%d\tj=%d\n",i,j);
printf("next(i)=%d\n",next());
printf("last(i)=%d\n",last());
printf("sum(i+j)=%d\n",sum(i+j));
}
}
file2.c文件
static int i=10;
int next()
{
return(i+=1);
}
int last()
{
return(i-=1);
}
int sum(int i)
{
static int j=5;
return(i=j+=i);
}
file3.c文件
extern int i;
reset()
{
return(i);
}
運行結果:
i=1 j=1
next(i)=11
last(i)=10
sum(i+j)=7
i=1 j=2
next(i)=11
last(i)=10
sum(i+j)=10
i=1 j=3
next(i)=11
last(i)=10
sum(i+j)=14
具體分析一下三個文件中的變數的種類。
在file1.c的開頭聲明i是外部變數,並出示化為1。而在main函數內部,說明了兩個自動變數i和j,這樣在main內部出現的i就是自動量。在file3.c的開頭說明i是外部的,表明它與file1.c定義的i是同一個變數,所以reset的值返回的就是這個i的當前值1。file2.c文件已開始就定義了變數i,並聲明為靜態變數,因此它的使用范圍只在當前文件中使用。然而從函數sum中定義來看,其內部用到的i是形式參數,j是內部靜態變數,它們與以前的i,j都不同。
具體執行過程分析如下:
首先程序經過編譯後聲稱可執行文件,運行可執行文件後,函數從Main函數體進入,在初始化的過程中得到i為全局變數,初值為1。進入main函數後首先調用函數reset(),進入文件file3.c,文件file3.c聲明i為外部變數,所以此時i的值為1,則返回的值為1。函數reset()執行完後返回主函數,繼續執行循環體中的程序。循環體首先調用函數next(),程序進入file2.c文件,判斷i為靜態變數,所以此時i的值為10,執行next()之後i的值為11,返回值為11,並將11作為i的值。當調用last()函數時,判斷i的值為11,執行函數後,i的值變為10,並將10作為i的值。最後執行函數sum(i),此時值的注意的是執行程序時傳遞的是形參,即第一次調用時實際計算的值為sum(i+j=2),這樣調用函數sum(i)後執行的結果為i=5+2=7,即為執行的結果。依次類推,分別為7,10,14。
通過以上的程序可以理解不同的存儲類型的作用范圍不同,在程序設計中如何靈活的使用各種不同的存儲類型是能夠使程序更靈活。
『柒』 C++中 什麼是 寄存器
C語言提供了另一種變數,即寄存器變數。這種變數存放在CPU的寄存器中,使用時,不需要訪問內存,而直接從寄存器中讀寫, 這樣可提高效率。寄存器變數的說明符是register。 對於循環次數較多的循環控制變數及循環體內反復使用的變數均可定義為寄存器變數。
[例5.16]
求∑200i=1imain()
{
register i,s=0;
for(i=1;i<=200;i++)
s=s+i;
printf("s=%d\n",s);
}
本程序循環200次,i和s都將頻繁使用,因此可定義為寄存器變數。對寄存器變數還要說明以下幾點:
1. 只有局部自動變數和形式參數才可以定義為寄存器變數。因為寄存器變數屬於動態存儲方式。凡需要採用靜態存儲方式的量不能定義為寄存器變數。
『捌』 c語言的特殊寄存器定義
0x80為一個地址,其後一個位元組表示的是p0的地址。相當於0x80處存入的是一個地址,這個地址是p0的,它的長度為一個位元組。
『玖』 C語言中的sfr表示什麼意思
SFR是Special Function Register特殊功能寄存器。
SFR是80C51單片機中各功能部件對應的寄存器,用於存放相應功能部件的控制命令,狀態或數據。它是80C51單片機中最具有特殊的部分,現在所有80C51系列功能的增加和擴展幾乎都是通過增加特殊功能寄存器SFR來達到目的的。
對於80C51系列中的80C51,共定義了21個特殊功能寄存器。在80C52中,除了80C51的21個特殊功能寄存器,還增加了5個,共計26個(帶星號的為特殊功能寄存器)。
『拾』 c語言 程序寄存器是什麼情況啊
寄存器是硬體資源,是比內存速度要快的一種存儲單元
,集成在CPU內部和CPU同步,屬於稀缺資源,所以經常有申請不到的情況
也就是說C語言里的reg類型數據有時候不一定能放到寄存器里