編譯原理保存寄存器和臨時寄存器
⑴ 匯編中cpu從內存讀取數據直接執行的還是先把數據臨時存放在某個寄存器裡面再執行的
跟是不是匯編沒關系,任何程序要處理數據,都需要讀到寄存器裡面來才能做計算。
⑵ C語言編譯原理是什麼
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
⑶ 編譯原理。。
我直接寫答案了:
1.A、B
2.A、D
3.B、C
4.C、D
5.C、D
6.A、D與第二題一樣
7.C、D
以上答案只供參考
⑷ CPU中有哪些主要寄存器簡述這些寄存器的功能
1、通用寄存器組
通用寄存器組包括AX、BX、CX、DX4個16位寄存器,用以存放16位數據或地址。也可用作8位寄存器。用作8位寄存器時分別記為AH、AL、BH、BL、CH、CL、DH、DL。
2、段寄存器
採用分段技術來解決。將1MB的存儲空間分成若干邏輯段,每段最長64KB,這些邏輯段在整個存儲空間中可浮動。
3、指針和變址寄存器
這組寄存器存放的內容是某一段內地址偏移量,用來形成操作數地址,主要在堆棧操作和變址運算中使用。
4、指令指針寄存器IP
用來存放將要執行的下一條指令在現行代碼段中的偏移地址。程序運行中,它由BIU自動修改,使IP始終指向下一條將要執行的指令的地址,因此它是用來控制指令序列的執行流程的,是一個重要的寄存器。
(4)編譯原理保存寄存器和臨時寄存器擴展閱讀:
寄存器工作原理
寄存器應具有接收數據、存放數據和輸出數據的功能,它由觸發器和門電路組成。只有得到「存入脈沖」(又稱「存入指令」、「寫入指令」)時,寄存器才能接收數據;在得到「讀出」指令時,寄存器才將數據輸出。
寄存器存放數碼的方式有並行和串列兩種。並行方式是數碼從各對應位輸入端同時輸入到寄存器中;串列方式是數碼從一個輸入端逐位輸入到寄存器中。
⑸ 寄存器和存儲器有什麼分別。詳細點謝謝
存儲器是用來永久存放數據的設備,應該很好理解。硬碟、u盤都是存儲器
寄存器是匯編語言里放計算數據用的臨時單元地址。
比如有兩個寄存器a和b,
a里放了2,b里放了3
那麼可以用匯編指令把a和b相加,並把計算結果放到c里
所以寄存器是內存范疇的
⑹ CPU的寄存器分為那幾類
寄存器是CPU內部重要的數據存儲資源,是匯編程序員能直接使用的硬體資源之一。
由於寄存器的存取速度比內存快,所以,在用匯編語言編寫程序時,要盡可能充分利用寄存器的存儲功能。
寄存器一般用來保存程序的中間結果,為隨後的指令快速提供操作數,從而避免把中間結果存入內存,再讀取內存的操作。在高級語言(如:C/C++語言)中,也有定義變數為寄存器類型的,這就是提高寄存器利用率的一種可行的方法。
另外,由於寄存器的個數和容量都有限,不可能把所有中間結果都存儲在寄存器中,所以,要對寄存器進行適當的調度。根據指令的要求,如何安排適當的寄存器,避免操作數過多的傳送操作是一項細致而又周密的工作。
有關「寄存器的分配策略」在《編譯原理》中會有詳細的介紹。
1、 16位寄存器組
16位CPU所含有的寄存器有(見圖2.1中16位寄存器部分):
4個數據寄存器(AX、BX、CX和DX)
2個變址和指針寄存器(SI和DI) 2個指針寄存器(SP和BP)
4個段寄存器(ES、CS、SS和DS)
1個指令指針寄存器(IP) 1個標志寄存器(Flags)
2、 32位寄存器組
32位CPU除了包含了先前CPU的所有寄存器,並把通用寄存器、指令指針和標志寄存器從16位擴充成32位之外,還增加了2個16位的段寄存器:FS和GS。
32位CPU所含有的寄存器有(見圖2.1中的寄存器):
4個數據寄存器(EAX、EBX、ECX和EDX)
2個變址和指針寄存器(ESI和EDI) 2個指針寄存器(ESP和EBP)
6個段寄存器(ES、CS、SS、DS、FS和GS)
1個指令指針寄存器(EIP) 1個標志寄存器(EFlags)
目前的CPU都有64位寄存器..但具體內容還沒找到!
⑺ 寄存器組的介紹
基本介紹寄存器是CPU內部重要的數據存儲資源,是匯編程序員能直接使用的硬體資源之一。由於寄存器的存取速度比內存快,所以,在用匯編語言編寫程序時,要盡可能充分利用寄存器的存儲功能。寄存器一般用來保存程序的中間結果,為隨後的指令快速提供操作數,從而避免把中間結果存入內存,再讀取內存的操作。在高級語言(如:C/C++語言)中,也有定義變數為寄存器類型的,這就是提高寄存器利用率的一種可行的方法。另外,由於寄存器的個數和容量都有限,不可能把所有中間結果都存儲在寄存器中,所以,要對寄存器進行適當的調度。根據指令的要求,如何安排適當的寄存器,避免操作數過多的傳送操作是一項細致而又周密的工作。有關「寄存器的分配策略」在後續課程《編譯原理》中會有詳細的介紹。
⑻ 存儲器和寄存器有什麼區別
功能的不同:
存儲器功能:存放指令和數據,並能由中央處理器(CPU)直接隨機存取。
寄存器功能:可將寄存器內的數據執行算術及邏輯運算;存於寄存器內的地址可用來指向內存的某個位置,即定址;可以用來讀寫數據到電腦的周邊設備。
使用時速度的不同:
寄存器的速度比主存儲器的速度要快很多,由於寄存器的容量有限,所以將不需要操作的數據存放在主存儲器中,主存儲器中的數據必須放入寄存器材能夠進行操作。
(8)編譯原理保存寄存器和臨時寄存器擴展閱讀:
一般意義上理解,寄存器是CPU里的存儲單元,與CPU離得近,所以CPU在運算時通常都會用寄存器當中轉站。存儲器是在CPU外部的存儲器,分為RAM,ROM。對單片機來說,因為存儲器,CPU都在一個片內,所以寄存器是片內RAM的一部分。
寄存器是匯編語言里放計算數據用的臨時單元地址。比如有兩個寄存器a和b, a里放了2,b里放了3。那麼可以用匯編指令把a和b相加,並把計算結果放到c里。所以寄存器是內存范疇的。
⑼ 匯編語言中,存儲器和寄存器的區別
寄存器是cpu內部的通用寄存器和段寄存器的總稱,如果在定址的時候用方括弧就代表著間接定址,也就是在內存中找數據。至於存儲器的概念可以自己看看書,呵呵。
⑽ 關於編譯原理
1.當然是機器語言了,如果是匯編指令,那還得編譯一次!能運行的程序都是機器語言,只有機器語言才能控制CPU,NET或Java這些中間語言,程序在運行時會被CLR或JVM快速編譯成機器語言,因此這些程序速度上有損失。
高級語言源代碼(文本)-通過編譯器(compiler)-程序(二進制機器語言)
匯編代碼(文本)-通過匯編器(assembler)-程序(二進制語言)
看到這里,你可能會想那匯編語言到底有什麼用呢,編譯器完全能代替匯編啊?
(1).編譯器是通過高級語言(c,c++)轉到機器語言的。轉換過的機器語言受限與高級語言,效率和功能上都有限制。比如c不等過分操作內存。但通過匯編器轉化過來的機器語言,效率高,且用匯編語言,直接和CPU對話!
(2).匯編可以反匯編(逆向編譯),而這里高級語言沒有發言權,就是:
程序(二進制機器語言)-通過反匯編器(compiler)-可轉化為匯編代碼(文本)
但永遠不能轉化為高級語言的源代碼,。
以上兩點匯編存在的重要性。
2。當然是說移植源代碼。windows用x86機器語言,蘋果用powerPC機器語言,windows程序當然不能運行在蘋果機上,因為程序其實就是一串機器語言!但windows上有c的編譯器(vc++),蘋果機上也有c編譯器(gcc),因此同一個c的源代碼,當然就可以通過不同平台的同一種編譯器實現平台移植。
3.當然是NASM,我看的所有書都首先說NASM,他是開源的,就像Linux一樣,很受歡迎,還有MASN是微軟的,borland的也有匯編器,不過都不常見了。
4.這跟CPU有關,一般32位x86兼容的cpu有許多寄存器,多數是32位的,也有16位的。比如CS,ES,DS這些segment寄存器一直是16位的。
5.優勢太多了,這和32位和16位存在的優勢一樣,16位電腦最大內存1MB,寄存器都是16位的。32位,最大內存可以有4GB,整整是16位的4096倍啊!16位多渺小啊,同理64位基本上也可以蔑視32位,64內存最大內存用TB來衡量,寄存器多數是64位!地址匯流排也是64位。64對32位沒有什麼優勢劣勢可言,64位完全就是32位的下一代。