編譯寄存器
⑴ 想搞清包含下面一段話的各種語素和編譯,寄存器,指針之類東西,要學計算機的哪一學科
C++基礎知識
匯編
《深入理解計算機系統》第一章看完還有內存模型那一章
《深度探索C++對象模型》
這個是最少的了。。。。
⑵ 寫編譯器時轉變為匯編如何確定上一條指令保存的寄存器
始終指向下一條指令的首地址。
寄存器就是用來存放段地址的,執行指令的時候,CPU會自動讀取DS中的數據為內存單元的段地址,使用偏移地址來表示偏移地址在程序運行過程中,它始終指向下一條指令的首地址,與段寄存器CS聯用確定下一條指令的物理地址。
寄存器是中央處理器內的組成部分。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和地址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器(PC)。在中央處理器的算術及邏輯部件中,寄存器有累加器。
⑶ 匯編的寄存器
這位朋友,首先,我匯編只在能看懂的階段,從沒用它寫過程序。然後想跟你說點兒單片機學習的方法,建議你放棄匯編,去學習C語言,現在單片機的主頻越來越高,匯編的高效率優勢越來越不明顯,這么想,如果你現在自己匯編學的很好,但是等你工作之後與人合作項目的時候,別人都用C,那你怎麼辦,學東西就是要適應社會需求,C語言已經成趨勢,不要排斥,你匯編都能學,C語言易如反掌。另外等你用到操作系統不得不使用匯編的時候,那時候你已經有了很深的單片機功底,對內部結構都已經了解,這時候再去有目的的學習一些匯編指令就可以了,匯編對硬體依賴性比較高,很不適合初學。還有你說的寄存器,初學不要也不用去深究,你只需要知道他們的作用就可以,隨著你經驗的積累,理解能力的增強,單片機的結構你自然而然就會清晰,到那時候再來重新審視單片機,從外部介面到內部電路,印象會很深刻,祝成功。
⑷ 單片機C語言keil編譯出現錯誤,寄存器容量不足,怎麼改正,急!!!!
我用keil2,keil4編譯都沒有問題的。
重新建一個工程,再試下。
下圖就是用keil4編譯的結果。估計是沒有破解。或者破解的不對。
⑸ 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編譯器)不能直接操作CPU寄存器
因為有的語言就沒打算讓程序員直接操作CPU寄存器。
不是編譯器的問題,是語言問題。
⑺ 寄存器原理
寄存器原理:
寄存器應具有接收數據、存放數據和輸出數據的功能,它由觸發器和門電路組成。只有得到「存入脈沖」(又稱「存入指令」、「寫入指令」)時,寄存器才能接收數據;在得到「讀出」指令時,寄存器才將數據輸出。
寄存器存放數碼的方式有並行和串列兩種。並行方式是數碼從各對應位輸入端同時輸入到寄存器中;串列方式是數碼從一個輸入端逐位輸入到寄存器中。
寄存器讀出數碼的方式也有並行和串列兩種。在並行方式中,被讀出的數碼同時出現在各位的輸出端上;在串列方式中,被讀出的數碼在一個輸出端逐位出現。
(7)編譯寄存器擴展閱讀:
寄存器最起碼具備以下4種功能。
①清除數碼:將寄存器里的原有數碼清除。
②接收數碼:在接收脈沖作用下,將外輸入數碼存入寄存器中。
③存儲數碼:在沒有新的寫入脈沖來之前,寄存器能保存原有數碼不變。
④輸出數碼:在輸出脈沖作用下,才通過電路輸出數碼。
僅具有以上功能的寄存器稱為數碼寄存器;有的寄存器還具有移位功能,稱為移位寄存器。
寄存器有串列和並行兩種數碼存取方式。將n位二進制數一次存入寄存器或從寄存器中讀出的方式稱為並行方式。將n位二進制數以每次1位,分成n次存入寄存器並從寄存器讀出,這種方式稱為串列方式。並行方式只需一個時鍾脈沖就可以完成數據操作,工作速度快,但需要n根輸入和輸出數據線。串列方式要使用幾個時鍾脈沖完成輸入或輸出操作,工作速度慢,但只需要一根輸入或輸出數據線,傳輸線少,適用於遠距離傳輸。
⑻ 寄存器的具體舉例
UxCTL寄存器是一個8位的寄存器。UASRT模塊的基本操作由該寄存器的控制位確定的,它包含了通信協議、通信模式和校驗位等的選擇。圖給出了寄存器的各個位。
圖UxCTL寄存器
由圖可以看出,UxCTL寄存器主要包括8個有效的控制位。為了增加對UxCTL寄存器的了解,知道怎樣對該寄存器進行正確的設置,下面對UxCTL寄存器的各個位進行詳細介紹。
PENA:校驗使能位。當該位為0時,不允許校驗;當該位為1時,允許校驗。如果允許校驗,則發送時產生校驗位,在接收時希望接收到校驗位。.當在地址位多機模式中¨地址位包括在校驗計算中。
PEV:奇偶校驗位。當該位為0時,進行奇校驗;當該位為1時,進行偶校驗。
SPB:停止位。該位用來選擇發送時停止位的個數,但接收時停止位只有一個。當該位為0時,發送時只有1個停止位;當該位為1時,發送時有2個停止位。
CHAR:字元長度位。該位用來選擇發送時數據的長度。當該位為0時,發送的數據為7位;當該位為1時,發送的數據為8位。
LISTEN:監聽使能位。該位用來選擇反饋模式。當該位為0時,沒有反饋;當該位為1時,有反饋,發送的數據被送到接收器,這樣可以進行自環測試。
SYNC:該位用於同步模式選擇和非同步模式選擇。當該位為0時,USART模塊為非同步通信(UART)模式;當該位為1時,USART模塊為同步通信(SPI)模式。
MM:多機模式選擇位。當該位為0時,多機模式選擇線路空閑多機協議;當該位為1時,多機模式選擇地址位多機協議。
SWRST:軟體復位使能位。當該位為0時,UASRT模塊被允許;當該位為1時,UASRT模塊被禁止。
通過以上對UxCTL寄存器的各個位的介紹,可以完成對通信模式和通信數據格式等的選擇。 顧名思義,通用寄存器是那些你可以根據自己的意願使用的寄存器,修改他們的值通常不會對計算機的運行造成很大的影響。通用寄存器最多的用途是計算。
EAX:通用寄存器。相對其他寄存器,在進行運算方面比較常用。在保護模式中,也可以作為內存偏移指針(此時,DS作為段寄存器或選擇器)
EBX:通用寄存器。通常作為內存偏移指針使用(相對於EAX、ECX、EDX),DS是默認的段寄存器或選擇器。在保護模式中,同樣可以起這個作用。
ECX:通用寄存器。通常用於特定指令的計數。在保護模式中,也可以作為內存偏移指針(此時,DS作為寄存器或段選擇器)。
EDX:通用寄存器。在某些運算中作為EAX的溢出寄存器(例如乘、除)。
同AX分為AH&AL一樣,上述寄存器包括對應的16-bit分組和8-bit分組。 ESI:通常在內存操作指令中作為「源地址指針」使用。當然,ESI可以被裝入任意的數值,但通常沒有人把它當作通用寄存器來用。DS是默認段寄存器或選擇器。
EDI:通常在內存操作指令中作為「目的地址指針」使用。當然,EDI也可以被裝入任意的數值,但通常沒有人把它當作通用寄存器來用。ES是默認段寄存器或選擇器。
EBP和ESP:作為指針的寄存器,也可作為16位寄存器BP, SP使用,常用於椎棧操作。通常,它被高級語言編譯器用以建造『堆棧幀'來保存函數或過程的局部變數,不過,還是那句話,你可以在其中保存你希望的任何數據。SS是它的默認段寄存器或選擇器。
注意,這四個寄存器沒有對應的8-bit分組。換言之,你可以通過SI、DI、BP、SP作為別名訪問他們的低16位,卻沒有辦法直接訪問他們的低8位。 實模式下的段寄存器到保護模式下搖身一變就成了選擇器。不同的是,實模式下的「段寄存器」是16-bit的,而保護模式下的選擇器是32-bit的。
CS代碼段,或代碼選擇器。同IP寄存器(稍後介紹)一同指向當前正在執行的那個地址。處理器執行時從這個寄存器指向的段(實模式)或內存(保護模式)中獲取指令。除了跳轉或其他分支指令之外,你無法修改這個寄存器的內容。
DS數據段,或數據選擇器。這個寄存器的低16 bit連同ESI一同指向的指令將要處理的內存。同時,所有的內存操作指令默認情況下都用它指定操作段(實模式)或內存(作為選擇器,在保護模式。這個寄存器可以被裝入任意數值,然而在這么做的時候需要小心一些。方法是,首先把數據送給AX,然後再把它從AX傳送給DS(當然,也可以通過堆棧來做).
ES 附加段,或附加選擇器。這個寄存器的低16 bit連同EDI一同指向的指令將要處理的內存。同樣的,這個寄存器可以被裝入任意數值,方法和DS類似。
FS F段或F選擇器(推測F和下面的G正好是上面CS,DS,ES的字母順延)。可以用這個寄存器作為默認段寄存器或選擇器的一個替代品。它可以被裝入任何數值,方法和DS類似。
GS G段或G選擇器(G的意義和F一樣,沒有在Intel的文檔中解釋)。它和FS幾乎完全一樣。
SS堆棧段或堆棧選擇器。這個寄存器的低16 bit連同ESP一同指向下一次堆棧操作(push和pop)所要使用的堆棧地址。這個寄存器也可以被裝入任意數值,你可以通過入棧和出棧操作來給他賦值,不過由於堆棧對於很多操作有很重要的意義,因此,不正確的修改有可能造成對堆棧的破壞。
* 注意一定不要在初學匯編的階段把這些寄存器弄混。他們非常重要,而一旦你掌握了他們,你就可以對他們做任意的操作了。段寄存器,或選擇器,在沒有指定的情況下都是使用默認的那個。這句話在現在看來可能有點稀里糊塗,不過你很快就會在後面知道如何去做。 EIP 這個寄存器非常的重要。這是一個32位寬的寄存器,同CS一同指向即將執行的那條指令的地址,存放指令的偏移地址。微處理器工作於實模式下,EIP是IP(16位)寄存器。不能夠直接修改這個寄存器的值,修改它的唯一方法是跳轉或分支指令。(CS是默認的段或選擇器)
E、標志寄存器EFR
EFR(extra flags register)包括狀態位、控制位和系統標志位,用於指示微處理器的狀態並控制微處理器的操作。80486 CPU標志寄存器如圖2.12所示。
①狀態標志位:包括進位標志CF、奇偶標志PF、輔助進位標志AF、零標志ZF 、符號標志SF和溢出標志OF。
② 控制標志位:包括陷阱標志(單步操作標志)TF、中斷標志IF和方向標志DF。80486 CPU標志寄存器中的狀態標志位和控制標志位與8086 CPU標志寄存器中的狀態標志位和控制標志位的功能完全一樣,這里就不再贅述。
③ 系統標志位和IOPL欄位:在EFR寄存器中的系統標志和IOPL欄位,用於控制操作系統或執行某種操作。它們不能被應用程序修改。
IOPL(I/O privilege level field):輸入/輸出特權級標志位。它規定了能使用I/O敏感指令的特權級。在保護模式下,利用這兩位編碼可以分別表示0, 1, 2, 3這四種特權級,0級特權最高,3級特權最低。在80286以上的處理器中有一些I/O敏感指令,如CLI(關中斷指令)、STI(開中斷指令)、IN(輸入)、OUT(輸出)。IOPL的值規定了能執行這些指令的特權級。只有特權高於IOPL的程序才能執行I/O敏感指令,而特權低於IOPL的程序,若企圖執行敏感指令,則會引起異常中斷。
NT(nested task flag):任務嵌套標志。在保護模式下,指示當前執行的任務嵌套於另一任務中。當任務被嵌套時,NT=1,否則NT=0。
RF(resume flag):恢復標志。與調試寄存器一起使用,用於保證不重復處理斷點。當RF=1時,即使遇到斷點或故障,也不產生異常中斷。
VM(virtual 8086 mode flag):虛擬8086模式標志。用於在保護模式系統中選擇虛擬操作模式。VM=1,啟用虛擬8086模式;VM=0,返回保護模式。
AC(alignment check flag):隊列檢查標志。如果在不是字或雙字的邊界上定址一個字或雙字,隊列檢查標志將被激活。 上面是最基本的寄存器。下面是一些其他的寄存器,你甚至可能沒有聽說過它們。(都是32位寬):
CR0, CR2, CR3(控制寄存器)。舉一個例子,CR0的作用是切換實模式和保護模式。
還有其他一些寄存器,D0, D1, D2, D3, D6和D7(調試寄存器)。他們可以作為調試器的硬體支持來設置條件斷點。
TR3, TR4, TR5, TR6 和TR?寄存器(測試寄存器)用於某些條件測試。
⑼ 用c++語言作匯編語言中寄存器處理
其實可以把寄存器理解成C語言中的變數,只不過這個變數非常特殊,用它計算速度非常快,而且有些操作必須通過寄存器,或者以寄存器為"橋梁"才能正常進行
mov ax,dx
用C語言(我沒學過C++,不過據說C++是兼容C的,所以這個應該是對的吧)可以表示為:
ax=dx;